Что означает предупреждение Zabbix
Если Zabbix сообщает, что лимита в 1024 файловых дескриптора недостаточно, проблема связана не непосредственно с загрузкой CPU или количеством оперативной памяти, а с системным ограничением Linux на количество одновременно открытых дескрипторов.
При недостаточном лимите Zabbix не может использовать столько одновременных файловых и сетевых дескрипторов, сколько требуется для настроенной нагрузки. В результате приложение уменьшает допустимое количество параллельных проверок на worker.
На практике это может привести к:
- ограничению количества одновременно выполняемых проверок;
- росту очереди проверок при высокой нагрузке;
- увеличению задержек при сборе данных;
- снижению общей производительности мониторинга.
Что такое файловые дескрипторы
Файловый дескриптор — это числовой идентификатор, через который процесс Linux работает с открытым ресурсом.
Несмотря на название, речь идёт не только об обычных файлах. Дескрипторы используются в том числе для:
- файлов;
- сетевых соединений;
- сокетов;
- каналов;
- устройств;
- других объектов ввода-вывода.
Для процесса существует ограничение на количество дескрипторов, которые он может держать открытыми одновременно.
Если процесс достигает этого лимита, операционная система не позволит открыть новые дескрипторы, пока часть уже используемых не будет освобождена.
Почему лимит важен для Zabbix 7.0
Zabbix Server и Zabbix Proxy одновременно работают с большим количеством сетевых соединений и других ресурсов операционной системы.
Чем больше инфраструктура и количество параллельных операций мониторинга, тем больше открытых дескрипторов может потребоваться процессу.
Поэтому стандартный лимит:
1024
для конкретной конфигурации Zabbix может оказаться недостаточным.
Именно в такой ситуации в журнале появляется предупреждение о том, что максимальное количество concurrent checks per worker было уменьшено.
Проверяем текущий лимит Zabbix
Сначала посмотрим, с каким лимитом уже работает запущенный процесс zabbix_server.
Выполняем:
cat /proc/$(pgrep -o zabbix_server)/limits | grep "Max open files"
Например, можем получить:
Max open files 1024 524288 files
Здесь отображаются два значения:
- 1024 — soft limit;
- 524288 — hard limit.
Soft limit — ограничение, с которым в данный момент работает процесс.
Hard limit — верхняя граница, до которой soft limit может быть увеличен без изменения соответствующих ограничений более высокого уровня.
Увеличиваем LimitNOFILE для Zabbix Server
Если Zabbix работает как systemd-сервис, лимит удобнее задавать через override-конфигурацию сервиса.
Выполняем:
sudo systemctl edit zabbix-server.service
Откроется редактор дополнительной конфигурации systemd.
Добавляем:
[Service]
LimitNOFILE=10000
Сохраняем файл и закрываем редактор.
Почему меняем только LimitNOFILE
Для рассматриваемого предупреждения нас интересует именно количество доступных файловых дескрипторов, поэтому достаточно изменить:
LimitNOFILE=10000
Без отдельной причины не требуется одновременно добавлять:
LimitAS=infinity
LimitRSS=infinity
LimitNPROC=1024
Эти параметры отвечают за другие ограничения systemd и непосредственно проблему недостаточного количества файловых дескрипторов не решают.
Альтернативный вариант — создать override.conf вручную
Если необходимо создать конфигурацию вручную, сначала создаём каталог:
sudo mkdir -p /etc/systemd/system/zabbix-server.service.d
После этого создаём файл:
sudo nano /etc/systemd/system/zabbix-server.service.d/override.conf
И добавляем:
[Service]
LimitNOFILE=10000
Но в большинстве случаев удобнее использовать:
sudo systemctl edit zabbix-server.service
Так меньше вероятность ошибиться с названием каталога или расположением override-файла.
Проверяем override-конфигурацию systemd
Посмотреть итоговую конфигурацию сервиса можно командой:
systemctl cat zabbix-server.service
В выводе должна присутствовать наша дополнительная конфигурация:
[Service]
LimitNOFILE=10000
Дополнительно значение, известное systemd, можно проверить командой:
systemctl show zabbix-server.service -p LimitNOFILE
Ожидаем увидеть:
LimitNOFILE=10000
Применяем новые системные лимиты
После изменения конфигурации перечитываем настройки systemd:
sudo systemctl daemon-reload
Теперь перезапускаем Zabbix Server:
sudo systemctl restart zabbix-server.service
Проверяем состояние сервиса:
systemctl status zabbix-server.service
Сервис должен находиться в состоянии:
active (running)
Проверяем лимит после перезапуска Zabbix
После перезапуска снова проверяем лимиты непосредственно у процесса:
cat /proc/$(pgrep -o zabbix_server)/limits | grep "Max open files"
Теперь результат должен отражать установленный нами лимит. Например:
Max open files 10000 10000 files
Это означает, что новый лимит применён к работающему процессу Zabbix Server.
Проверяем журнал Zabbix
После изменения лимита полезно проверить журнал сервера и убедиться, что предупреждение больше не появляется.
Если Zabbix пишет сообщения в systemd journal, можно посмотреть последние записи:
journalctl -u zabbix-server.service -n 100 --no-pager
Если используется отдельный файл журнала Zabbix, проверяем его согласно параметру LogFile в конфигурации сервера.
А если предупреждение появляется на Zabbix Proxy?
Тот же принцип применяется и к Zabbix Proxy, но изменять необходимо systemd-сервис прокси.
Например:
sudo systemctl edit zabbix-proxy.service
Добавляем:
[Service]
LimitNOFILE=10000
Затем:
sudo systemctl daemon-reload
sudo systemctl restart zabbix-proxy.service
И проверяем лимит уже у процесса zabbix_proxy:
cat /proc/$(pgrep -o zabbix_proxy)/limits | grep "Max open files"
То есть менять необходимо настройки именно того сервиса, который выдаёт предупреждение.
FAQ
Что означает сообщение «user limit of 1024 file descriptors is insufficient» в Zabbix?
Оно означает, что процесс Zabbix работает с недостаточным лимитом открытых файловых дескрипторов. Из-за этого Zabbix ограничивает допустимое количество одновременных проверок на worker.
Почему стандартного значения 1024 может быть недостаточно?
Zabbix одновременно использует множество файловых и сетевых дескрипторов. При большом количестве параллельных операций мониторинга лимит 1024 может стать ограничивающим фактором.
Как проверить текущий лимит Zabbix Server?
Удобнее всего проверить лимиты непосредственно у работающего процесса:
cat /proc/$(pgrep -o zabbix_server)/limits | grep "Max open files"
Какой LimitNOFILE нужно установить для Zabbix?
Универсального значения для всех установок нет. В статье используется 10000 как пример. Необходимый лимит зависит от нагрузки и конфигурации конкретного сервера или прокси.
Нужно ли менять /etc/security/limits.conf?
Если Zabbix запускается как systemd-сервис, лимит для него удобнее и нагляднее задавать непосредственно в конфигурации systemd через параметр LimitNOFILE.
Нужно ли перезапускать Zabbix после изменения LimitNOFILE?
Да. Новый лимит применяется при запуске процесса, поэтому после изменения конфигурации необходимо перечитать настройки systemd и перезапустить соответствующий сервис Zabbix.
Как понять, что проблема устранена?
После перезапуска проверьте лимит в /proc/<PID>/limits и журнал Zabbix. Новый лимит должен примениться к процессу, а предупреждение о недостаточном количестве файловых дескрипторов не должно появляться снова при обычной нагрузке.
Заключение
Предупреждение Zabbix о недостаточном лимите в 1024 file descriptors означает, что операционная система ограничивает количество дескрипторов, доступных процессу сервера или прокси.
Для Zabbix, работающего как systemd-сервис, проблему можно решить через override-конфигурацию, увеличив параметр LimitNOFILE. При этом нет необходимости одновременно менять ограничения памяти и количества процессов, если для этого нет отдельной причины.
После изменения конфигурации необходимо перезапустить сервис и обязательно проверить лимит непосредственно у нового процесса Zabbix. Финальная проверка — убедиться, что соответствующее предупреждение больше не появляется в журнале.
Если вы развиваете или администрируете нагруженную систему мониторинга, вам также может быть полезна статья Как использовать TimescaleDB в Zabbix.