Агент Zabbix – высокое использование ЦПУ

Вопрос или проблема

Я мониторю хост с помощью Zabbix и заметил, что агент Zabbix начал использовать довольно много CPU циклов:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                         
26774 zabbix    20   0 68428 1312  752 R   99  0.0  63:27.67 /usr/sbin/zabbix_agentd                                                                                                                         
26773 zabbix    20   0 68428 1324  764 R   99  0.0  63:26.33 /usr/sbin/zabbix_agentd

Мониторится около 100 элементов с помощью агента. Они также мониторятся на других идентичных хостах, где агент Zabbix не потребляет так много CPU. Агенты отправляют собранные данные в прокси Zabbix. Конфигурация агента по умолчанию. CPU хоста имеет 8 ядер (2.4 ГГц). Минимальное время для мониторинга элементов составляет 60 секунд.

Я использую Zabbix server / agent 1.8.11, и не могу обновиться до 2.2, по крайней мере, сейчас.

Я проверил отладочный журнал со всех сторон: сервер Zabbix, прокси, агент и не могу найти там никаких проблем. Просто обычные проверки получены и отправлены всё время.

Я не знаю, как дальше расследовать эту проблему и прошу о помощи сообщества. Как я мог бы отследить, почему агент так сильно потребляет CPU?

Еще одна вещь, которая кажется мне странной – статистика сетевых соединений:

netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
      2 CLOSE_WAIT
     21 CLOSING
   3521 ESTABLISHED
   2615 FIN_WAIT1
    671 FIN_WAIT2
   1542 LAST_ACK
     14 LISTEN
    256 SYN_RECV
 117841 TIME_WAIT

Спасибо.

Обновление 1.

netstat -tnp|grep zabbix

    tcp        1      0 10.120.0.3:10050        10.128.0.15:53372        CLOSE_WAIT  23777/zabbix_agentd
    tcp        1      0 10.120.0.3:10050        10.128.0.15:53970        CLOSE_WAIT  23775/zabbix_agentd
    tcp        1      0 10.120.0.3:10050        10.128.0.15:53111        CLOSE_WAIT  23776/zabbix_agentd

10.128.0.15 – IP сервера Zabbix
10.120.0.3 – IP хоста Zabbix

Обновление 2.

Эти соединения TIME_WAIT идут от веб-сервера nginx.

Обновление 3.

Я прикрепился к процессу агента Zabbix с помощью strace, и оказалось, что 100% используются агентами на read syscall:

strace -C -f -p 23776

Процесс 23776 отсоединён
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    2.175528        2515       865           read
------ ----------- ----------- --------- --------- ----------------
100.00    2.175528                   865           total

Обновление 4.

Чтобы прояснить ситуацию… Я пытался работать с состоянием TIME_WAIT соединений. Например, я пытался уменьшить net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait и net.netfilter.nf_conntrack_tcp_timeout_time_wait и посмотреть, поможет ли это. К сожалению, это не помогло.

Заключение

Проблема нагрузки CPU агента Zabbix оказалась связанной с количеством сетевых соединений. Если мы прикрепимся к процессу zabbix_agentd с помощью strace, мы увидим, как используются циклы CPU (1-й столбец – время CPU, затраченное на выполнение в ядре):

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00   15.252232        8646      1764           read
  0.00    0.000000           0         3           write
  0.00    0.000000           0         1           open
...
------ ----------- ----------- --------- --------- ----------------
100.00   15.252232                  1778           total

Здесь большая часть времени CPU используется на системные вызовы чтения. Дальнейшее расследование показало, что эти вызовы чтения (2 из них показаны ниже) – это непрерывные попытки прочитать файл /proc/net/tcp. Последний содержит сетевую статистику, такую как подключения TCP и UDP, сокеты и т.д. В среднем файл содержит 70000-150000 записей.

8048       0.000068 open("/proc/net/tcp", O_RDONLY) = 7 <0.000066>
8048       0.000117 fstat(7, {st_dev=makedev(0, 3), st_ino=4026531993, st_mode=S_IFREG|0444, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=0, st_size=0, st_atime=2013/04/01-09:33:57, st_mtime=2013/04/01-09:33:57, st_ctime=2013/04/01-09:33:57}) = 0 <0.000012>
8048       0.000093 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f30a0d38000 <0.000033>
8048       0.000087 read(7, "  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode    "..., 1024) = 1024 <0.000091>
8048       0.000170 read(7, "                         \n   6: 0300810A:0050 9275CE75:E67D 03 00000000:00000000 01:00000047 0000000"..., 1024) = 1024 <0.000063>

Я думаю, что узким местом является диск. Вот мои причины для этого:

У вас довольно загруженный веб-сервер. Zabbix медленный, я подозреваю, что это из-за чтений с диска (возможно, также из сети).

Запустите strace снова и найдите дескриптор файла в Zabbix.

Затем узнайте, является ли дескриптор файла файлом или сокетом:

ls -l /proc/<PID_of_straced_process>/fd/<FD_from_strace>

EDIT1:
Вам не следует изменять таймауты TIME_WAIT. Проблема с маленьким HTTP keep-alive или с отсутствием HTTP keep-alive заключается в том, что вы увеличиваете задержку и пропускную способность. Вместо этого вам следует немного увеличить HTTP keep-alive и установить/включить SPDY.

EDIT2:
Используйте dstat -ta 10 и сравните первую строку с остальными. Первая строка – это среднее значение с момента загрузки. Следующие строки – это 10-секундное среднее значение (последний параметр).

EDIT3:
Проверьте, нет ли у вас потерь пакетов, используйте что-то вроде smokeping для мониторинга сервера и сайта снаружи вашей сети. У вас значительное количество соединений в состоянии CLOSING, FIN_WAIT1, FIN_WAIT2, SYN_RECV, LAST_ACK. Я думаю, что ваша сеть перегружена или у вас много соединений с коротким сроком жизни (подтверждено высоким соотношением TIME_WAIT/ESTABLISHED). См. http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Protocol_operation

zabbix-agentd читает /proc/net/tcp для элемента net.tcp.listen. Размер файла составляет около 100K(строк) * 150 байт = 15MB, если у вас много tcp.listen мониторинговых элементов, эта операция чтения файла потребляет много CPU из-за того, что размер данных составляет 15MB*количество_элементов.

Рекомендуется использовать net.tcp.port вместо net.tcp.listen для этой проблемы с производительностью.

Поздний ответ (может быть полезен для некоторых):

Это происходит довольно часто, в зависимости от того, что вы запрашиваете с помощью Zabbix, и обычно это проблема третьей стороны или PEBKAC.

Отключите проверки (и перезапустите сервер zabbix после), чтобы узнать, какая из них вызывает такую большую нагрузку. Проанализируйте проблему соответственно.

Например, у меня были несколько проблем с мониторингом базы данных, когда ODBC вызывал проблему.

Ответ или решение

Высокая загрузка CPU Zabbix Agent: Причины и Решения

Проблема с высокой загрузкой CPU, вызванная Zabbix Agent, может быть связана с несколькими факторами. Ниже приведены ключевые аспекты, которые стоит учесть для диагностики и устранения этой проблемы.

Анализ Ситуации

Исходя из предоставленной информации, вы наблюдаете высокую загрузку CPU для процессов zabbix_agentd, с показателями до 99% по CPU при мониторинге 100 элементов на узле. Одним из возможных источников этой проблемы является частое чтение файла /proc/net/tcp, который содержит статистику сетевых соединений. Это может происходить в результате наличия множества элементов, которые используют «net.tcp.listen», что требует от агента постоянного доступа к этому файлу.

Причины Высокой Загрузки CPU

  1. Количество Сетевых Соединений:
    Наблюдаются значительные числа соединений в состоянии CLOSE_WAIT и FIN_WAIT. Это может указывать на проблемы с управлением соединениями на уровне сети или приложения (например, веб-сервера на основе Nginx). Имея большое количество активных соединений, Zabbix Agent может перегружаться, пытаясь обработать информацию из /proc/net/tcp.

  2. Объём Обработки:
    Если каждый элемент, который вы мониторите, создаёт дополнительные вызовы для чтения /proc/net/tcp, это может привести к значительной нагрузке на систему. Ваша система запрашивает данные о TCP соединениях, которые могут достигать объёмов данных в 15MB и более, в зависимости от конфигурации и объёма соединений.

  3. Частота Запросов:
    Даже если у вас установлен интервал в 60 секунд для каждой проверки, если проверок множество, общая нагрузка на систему может быть значительной. Убедитесь, что нет избыточных запросов, особенно для «net.tcp.listen».

Рекомендации по Устранению Проблемы

  1. Оптимизация Мониторинга:

    • Вместо использования net.tcp.listen рассмотрите возможность использования net.tcp.port. Это может значительно сократить количество читаемых элементов и облегчить нагрузку на CPU.
    • Оцените необходимость всех 100 элементов мониторинга. Возможно, некоторые из них могут быть отключены без потери критической информации.
  2. Увеличение HTTP Keep-Alive:

    • Если вы используете HTTP соединения с Zabbix сервером, рассмотрите возможность увеличения параметров Keep-Alive для уменьшения количества краткосрочных соединений.
  3. Анализ Сетевой Загруженности:

    • Проведите более глубокий анализ состояния сети. Используйте инструменты, такие как smokeping, для мониторинга пингов к серверу и сайта.
    • Проверьте наличие потерь пакетов, которые могут вызвать увеличение соединений в состояниях CLOSING, FIN_WAIT, и других.
  4. Использование Статистики:

    • Примените команду dstat -ta 10, чтобы проанализировать производительность системы за определенный период и выявить базовые тенденции в загрузке CPU и сетевой активности.
  5. Отладка и Логирование:

    • Используйте strace для дальнейшей диагностики процессов Zabbix Agent, чтобы выявить, какие именно системные вызовы вызывают перегрузку.
  6. Обновление Zabbix:

    • Хотя вы утвердили, что обновление до версии 2.2 невозможно сейчас, это все же может быть важным шагом в будущем, так как более новые версии обычно содержат оптимизации и исправления, относящиеся к производительности.

Заключение

Высокая загрузка CPU Zabbix Agent может быть следствием множества факторов. Постепенное устранение потенциальных проблем начнётся с выявления ненужных проверок и оптимизации существующих настроек. Тщательный анализ сетевой активности и настройки параметров Zabbix поможет улучшить производительность системы и снизить нагрузку на CPU.

Оцените материал
Добавить комментарий

Капча загружается...