Я слежу за хостом с помощью Zabbix и заметил, что агент Zabbix начал использовать довольно много циклов ЦП:
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 агент не потребляет столько ресурсов ЦП. Агенты отправляют собранные данные на Zabbix прокси. Конфигурация агента по умолчанию. Главный процессор имеет 8 ядер (2,4 ГГц). Наименьшее значение времени для отслеживаемых элементов составляет 60 секунд.
Я использую Zabbix сервер / агент 1.8.11, и я не могу обновиться до 2.2 по крайней мере сейчас.
Я проверил журнал отладки со всех сторон: Zabbix сервер, прокси, агент и не нашел там никаких проблем. Постоянно получаемые и отправляемые обычные чеки.
Я не знаю, как исследовать эту проблему дальше и обратиться за помощью к сообществу. Как я могу отследить, почему агент так сильно загружает процессор?
Еще одна вещь, которая мне кажется странной, - это статистика сетевых подключений:
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
Process 23776 detached
% 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
и посмотрите, поможет ли это. К сожалению, это не помогло.
Вывод
Проблема загрузки ЦП Zabbix агента оказалась связана с количеством сетевых подключений. Если мы подключимся к процессу zabbix_agentd с помощью strace, мы увидим, как используются циклы ЦП (1-й столбец - время ЦП, затраченное на работу в ядре):
% 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
Здесь большая часть времени ЦП используется для системных вызовов чтения. Дальнейшее расследование показало, что эти вызовы чтения (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 /prod/<PID_of_straced_process>/fd/<FD_from_strace>
РЕДАКТИРОВАТЬ1:
Вы не должны изменять таймауты TIME_WAIT. Проблема с небольшим HTTP keep-alive или без HTTP keep-alive заключается в том, что вы увеличиваете задержку и пропускную способность. Вместо этого вам следует немного увеличить время активности HTTP и установить / включить SPDY.
РЕДАКТИРОВАТЬ2: Использование dstat -ta 10
и сравните первую строчку с остальными. Первая строка - это среднее значение с момента загрузки. Следующие строки - это среднее значение за 10 секунд (последний параметр).
РЕДАКТИРОВАТЬ3: Проверьте, не теряются ли у вас пакеты, используйте что-то вроде дыма для мониторинга сервера и веб-сайта из-за пределов вашей сети. У вас есть значительное количество подключений в CLOSING, FIN_WAIT1, FIN_WAIT2, SYN_RECV, LAST_ACK. Я думаю, ваша сеть перегружена или у вас много недолговечных подключений (что подтверждается высоким соотношением TIME_WAIT / ESTABILISHED). Видеть: http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Protocol_operation
zabbix-agentd читает / proc / net / tcp для каждого элемента net.tcp.listen. размер файла составляет около 100 КБ (строк) * 150 байт = 15 МБ, если у вас много элементов монитора tcp.listen, эта операция чтения файла потребляет много ЦП, поскольку размер данных составляет 15 МБ * номер_элемента.
Для решения этой проблемы с производительностью рекомендуется использовать net.tcp.port вместо net.tcp.listen.
поздний ответ (может быть полезно для некоторых парней):
Это происходит часто, в зависимости от того, что вы запрашиваете с Zabbix, и обычно это проблема третьей стороны или PEBKAC.
Отключите проверки (и перезапустите zabbix сервер после), чтобы увидеть, какой из них вызывает такую большую нагрузку. Соответственно проанализируйте проблему.
то есть у меня было несколько проблем с Database Monitor, когда ODBC вызывал проблему