Agente Zabbix - alto uso da CPU

3

Estou monitorando um host com a ajuda do Zabbix e notei que o agente do Zabbix começou a usar vários ciclos de 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

Existem cerca de 100 itens monitorados com o agente. Eles também são monitorados em outros hosts idênticos, onde o agente Zabbix não consome muito da CPU. Agentes enviam dados coletados para o proxy Zabbix. A configuração do agente é padrão. A CPU do host tem 8 núcleos (2,4 Gz). O menor valor de tempo para itens monitorados é de 60 segundos.

Eu uso o servidor Zabbix / agent 1.8.11 e não posso atualizar para o 2.2 pelo menos agora.

Eu verifiquei o log de depuração de todos os lados: servidor Zabbix, proxy, agente e não consigo encontrar nenhum problema lá. Apenas verificações usuais recebidas e enviadas o tempo todo.

Eu não sei como investigar mais esta questão e pedir ajuda da comunidade. Como eu poderia rastrear por que o agente está consumindo tanto CPU?

Mais uma coisa que parece estranha para mim são as estatísticas das conexões de rede:

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

Obrigado.

Atualização 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 do servidor Zabbix 10.120.0.3 - IP do host Zabbix

Atualização 2.

Essas conexões TIME_WAIT são do nginx do servidor web.

Atualização 3.

Eu anexei o processo de agente do Zabbix com strace e pareceu que 100% é usado por agentes no 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

Atualização 4.

Apenas para esclarecer tudo ... Eu tentei trabalhar com o estado de conexões TIME_WAIT. Por exemplo, tentei diminuir net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait e net.netfilter.nf_conntrack_tcp_timeout_time_wait e ver se isso ajuda. Infelizmente, isso não ajudou.

Conclusão

O problema de carga da CPU do agente Zabbix parecia estar associado ao número de conexões da rede. Se nos conectarmos ao processo zabbix_agentd usando strace, veremos como os ciclos de CPU são usados (coluna de 1-ponto - tempo de CPU gasto rodando no kernel):

% 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

Aqui, a maior parte do tempo da CPU é usada nas chamadas do sistema lidas. Investigações posteriores mostraram que essas chamadas de leitura (duas delas são mostradas abaixo) são tentativas contínuas de ler o arquivo /proc/net/tcp . O último contém estatística de rede, como conexões TCP e UDP, soquetes, etc. Em média, o arquivo contém 70000-150000 entradas.

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>
    
por Andrew 28.03.2013 / 13:23

3 respostas

0

Eu acho que o gargalo é o disco. Aqui estão minhas razões para isso:

Você tem um servidor da Web bastante ocupado. Zabbix é lento, eu suspeito ser leituras do disco (pode ser da rede também).

Execute novamente o strace e localize o descritor de arquivo no Zabbix

Em seguida, encontre se o descritor de arquivo é um arquivo ou um soquete:

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

EDIT1 :
Você não deve alterar os tempos limite de TIME_WAIT. O problema com o pequeno HTTP keep-alive, ou sem o HTTP keep-alive é que você aumenta a latência e a largura de banda. Em vez disso, você deve aumentar um pouco o HTTP keep-alive e instalar / ativar o SPDY.

EDIT2 : Use dstat -ta 10 e compare a primeira linha com o resto. A primeira linha é a média desde a inicialização. As próximas linhas são 10 segundos médios (o último parâmetro).

EDIT3 : Verifique se você não tem pacotes perdidos, use algo como o smokeping para monitorar o servidor e o site de fora da sua rede. Você tem um número significativo de conexões em CLOSING, FIN_WAIT1, FIN_WAIT2, SYN_RECV, LAST_ACK. Eu acho que sua rede está congestionada ou você tem um monte de conexões de curta duração (confirmado pela alta relação TIME_WAIT / ESTABILISHED). Veja: link

    
por 28.03.2013 / 15:38
0

zabbix-agentd lê / proc / net / tcp por item net.tcp.listen. o tamanho do arquivo é de cerca de 100K (linhas) * 150bytes = 15MB, se você tiver muitos itens de monitor tcp.listen, essa operação de arquivo de leitura consome muito cpu para o tamanho dos dados é de 15MB * item_number.

Recomenda-se usar net.tcp.port em vez de net.tcp.listen para este problema de desempenho.

    
por 31.05.2016 / 11:19
0

resposta tardia (pode ser útil para alguns caras):

Isso acontece, muitas vezes, dependendo do que você solicita com o Zabbix e geralmente é um problema de terceiros ou PEBKAC.

Desabilite as verificações (e reinicie o zabbix server depois) para ver qual está causando essa carga pesada. Analise o problema de acordo.

i.e. Eu tive vários problemas com o Database Monitor, quando o ODBC estava causando o problema

    
por 30.03.2017 / 12:20

Tags