Коротко: Housekeeper — это фоновый процесс Zabbix, который периодически удаляет «старые» данные по правилам хранения (retention) и чистит служебные/временные записи. Параметры, которые вы привели, управляют частотой запуска и «пакетом» удаляемых строк.
Что именно удаляет Housekeeper
- данные history*: history, history_uint, history_str, history_log, history_text — старые значения элементов (по периоду хранения в настройках Item / по дефолту);
- trends и trends_uint — старые усреднения (trends) по заданному периоду;
- events (события), alerts/acknowledges (уведомления/подтверждения), audit (журнал аудита), sessions и другие служебные таблицы — в зависимости от версии Zabbix и настроек хранения.
Точные наборы таблиц могут слегка отличаться по версии Zabbix, но принцип один: удаляются записи старее установленных сроков хранения.
Как часто запускается
- HousekeepingFrequency=1 означает запуск housekeeping каждые 1 час. (Параметр задаётся в часах; значение по умолчанию — 1.)
Что означает HousekeeperDelete
- HousekeeperDelete задаёт «пакет» (batch/limit) строк, которые удаляются в одном SQL-удалении (в одном DELETE-интервальном запросе) для конкретной операции. Это не «жёсткий» лимит для всей БД за цикл, и это не одноразовый лимит на все таблицы суммарно.
- На практике Housekeeper формирует DELETE-запросы (или эквивалентные подзапросы для СУБД без LIMIT) с ограничением на количество удаляемых id и выполняет их пакетами по HousekeeperDelete строк. Если в таблице больше старых строк, чем HousekeeperDelete, Zabbix будет выполнять несколько таких DELETE-пакетов подряд в рамках одного запуска housekeeper, пока не удалит все устаревшие записи или пока не закончится логика цикла (то есть пока очередной пакет возвращает 0 удалённых строк).
- Иными словами: это лимит на размер одного батча/одного DELETE-запроса, а не «по 1 000 000 строк из каждой таблицы и всё» и не «весьма строгий глобальный лимит на цикл».
Дополнительно — важные замечания и рекомендации
- Housekeeper обычно выполняется последовательно (однопоточно) в рамках zabbix_server; большие пакеты могут давать долгие транзакции/блокировки на БД. Потому ставить очень большое значение (например, миллионы) рискованно на загруженных СУБД.
- Если пакет слишком большой — лучше уменьшить HousekeeperDelete (например, до десятков- или сотен-тысяч в зависимости от БД и ресурсов) и/или увеличить частоту (уменьшать нагрузку за раз) — но помните HousekeepingFrequency задаётся в часах, нельзя поставить дробные часы. Можно настроить retention так, чтобы объёмы удалений были равномернее.
- Для очень больших объёмов данных рекомендуется использовать партиционирование таблиц (если поддерживает СУБД) — тогда удаление старых партиций гораздо эффективнее, чем массовые DELETE.
- Поведение и SQL-реализация могут немного отличаться в зависимости от версии Zabbix и типа СУБД (MySQL/MariaDB vs PostgreSQL), поэтому для точных деталей посмотрите комментарии в zabbix_server.conf и исходный код/документацию к вашей версии.
Итог по вашему примеру
- HousekeepingFrequency=1 — housekeeper запускается каждый час.
- HousekeeperDelete=1000000 — это размер одного батча удаления (максимум 1 000 000 строк в одном DELETE-запросе/итерации). Housekeeper может выполнить несколько таких итераций для одной таблицы в одном запуске, пока есть что удалять, поэтому он потенциально может удалить больше чем 1 000 000 строк из одной таблицы за один цикл, но каждая отдельная DELETE-операция будет ограничена этим значением.