Advertising:

Troubleshooting High Usage Zabbix LLD worker processes y Zabbix configuration syncer processes

From Zabbix-ES
Jump to navigation Jump to search
Antes que nada, me gustaría dar las gracias a Gustavo Guido (CUSTOS) y Carlos Ortega (Imagunet) ambos integrantes del grupo de Telegram ZabbixEspañol que gracias a su ayuda pude llegar a la resolución en un tiempo récord!!! :)

Problema

Zabbix se degrada y comienza a funcionar mal, tenemos alarmas de "Zabbix LLD worker processes more than 75% busy" aunque en la realidad los procesos tanto de LLD Worker como de Configuration Syncer están casi todo el tiempo al 100%
Inicio de la degradación
% de utilización del LLD Process se dispara
La lld_queue crece y no recupera

Detección

Se activa el LogSlowQueries en el zabbix_server.conf lo que permite ver en el log las querys mas lentas.
# vi /etc/zabbix/zabbix_server.conf
LogSlowQueries=3000
- Donde aparecian muchas del tipo:

10952:20220303:131404.882 slow query: 19.891447 sec, "update item_discovery set lastcheck=1646309621 where itemid in (483123,483124,...);"

10956:20220303:131404.882 slow query: 21.557915 sec, "update item_discovery set lastcheck=1646309617 where itemid in (482189,482190,...);"

10958:20220303:131429.337 slow query: 9.698309 sec, "update trigger_discovery set lastcheck=1646309634 where triggerid in (205974,205975,...);"

10954:20220303:131435.607 slow query: 5.215942 sec, "select id.itemid,...,i.allow_traps from item_discovery id join items i on id.itemid=i.itemid where id.parent_itemid in (...)"
Con esta información podemos intuir que las tablas item_discovery y trigger_discovery no están funcionando correctamente.

Resolución

Realizamos un VACUUM FULL

- Vamos a proceder a realizar una optimización de esta tablas con el comando VACUUM, recordar que la BD es un PostgreSQL y tener cuidado que el VACUUM que vamos a ejecutar bloquea las tablas en exclusiva, por este motivo es mejor ejecutarlo con Zabbix detenido.
zabbix=> VACUUM FULL item_discovery;
zabbix=> REINDEX TABLE public.item_discovery;

zabbix=> VACUUM FULL trigger_discovery;
zabbix=> REINDEX TABLE public.trigger_discovery;
- Luego de ejecutar el comando podemos ver la siguiente mejoría:
Post VACUUM FULL Img 1
Post VACUUM FULL Img 2

Analizamos las filas muertas (N_DEAD_TUP)

Las filas murtas se generaban por un replicación slot de una replica anterior a la migración que quedo parada cuando inicie el proceso de migración. Zabbix tiene una muy alta transaccionalidad, al cortar la replica esta genero muchas filas muertas que degradaban la performance de la base de datos. Para solventar el problema eliminamos el slot de replicación y hacemos un VACUUM ANALYZE de la tabla.
- Ver los replication slots
$ psql -U postgres -c "select * FROM pg_replication_slots ;"
 slot_name  | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin |  restart_lsn  | confirmed_flush_lsn 
------------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+---------------+---------------------
 pgstandby2 |        | physical  |        |          | f         | t      |     100108 |      |              | C518/41000000 | 
(1 row)
- Borrar un replication slot
$ psql -U postgres -c "select pg_drop_replication_slot('pgstandby2');"
- Analizamos las tablas con mas n_dead_tup y vemos que las de item discovery es una de las que mas tienen

zabbix=> SELECT relname, n_dead_tup FROM pg_stat_user_tables where n_dead_tup > 0;
       relname        | n_dead_tup 
----------------------+------------
problem               |          5
alerts                |          6
triggers              |          1
hosts                 |         38
application_discovery |         29
globalvars            |          2
graphs                |          5
events                |        164
item_discovery        |   78189072 <----
_hyper_2_9569_chunk   |       6635
housekeeper           |         47
auditlog              |        721
sessions              |        703
items                 |        111
items_applications    |         25
acknowledges          |          3
escalations           |          5
task                  |          5
host_discovery        |          9
event_recovery        |         65
_hyper_3_9568_chunk   |         88
graph_discovery       |         97
trigger_discovery     |   13345530 <----
problem_tag           |         58
httptest              |         28
event_tag             |        472
host_inventory        |         37
graphs_items          |         10
28 rows)
- Ejecutamos un VACUUM ANALYZE y esperamos a ver si las limpia, se puede hacer con zabbix funcionando.

zabbix=> VACUUM ANALYZE public.item_discovery;
 LOG:  process 122527 still waiting for ShareUpdateExclusiveLock on relation 304242 of database 16402 after 1000.124 ms
 LOG:  process 122527 acquired ShareUpdateExclusiveLock on relation 304242 of database 16402 after 1000.292 ms
 VACUUM
- Post ejecucion, vemos que ya no hay n_dead_tup y vemos que la performance en la BD mejora muchisimo.

zabbix=> SELECT relname, n_dead_tup FROM pg_stat_user_tables where n_dead_tup > 0;
        relname        | n_dead_tup 
-----------------------+------------
 problem               |          5
 alerts                |          6
 triggers              |          3
 hosts                 |         15
 application_discovery |         28
 globalvars            |          1
 graphs                |          5
 events                |        164
 item_discovery        |       6886
 _hyper_2_9569_chunk   |       6635
 housekeeper           |         47
 auditlog              |        721
 sessions              |        995
 items                 |        111
 items_applications    |         25
 acknowledges          |          3
 escalations           |         16
 task                  |          5
 host_discovery        |          9
 event_recovery        |         65
 _hyper_3_9568_chunk   |         88
 graph_discovery       |        290
 trigger_discovery     |       5935
 problem_tag           |         58
 httptest              |         15
 event_tag             |        472
 host_inventory        |         49
 graphs_items          |         10
(28 rows)
Post VACUUM ANALYZE
Mejora de rendimiento vista desde el VMWare

Otras consultas que ayudaron a determinar que Items cargaban mas la utilización del LLD Process

zabbix=> select hostid,count(*) contador from items group by hostid order by contador desc;
 hostid | contador
 --------+----------
 15131 | 2544          host A
 15082 | 2222          host B
 15079 | 1892          host C
 14949 | 1884          host D
 15337 | 609           host E
zabbix=> select substring(key_,1,20),count(*) from items group by substring(key_,1,20) order by count(*) desc limit 10;
      substring       | count 
----------------------+-------
 emc_vnx5800.py["--co |  4146
 vfs.fs.size[{#FSNAME |  3837
 system.cpu.load[perc |  2877
 vbr[VMResultBackup," |  1961
 vfs.fs.size[/var/www |  1928
 stk6780.py["--stdvol |  1613
 vfs.file.cksum[/etc/ |  1366
 icmppingsec          |  1111
 icmpping             |  1111
 icmppingloss         |  1111
(10 rows)

Conclusión

- Es muy importante tener la herramienta de monitorización y la BD bien monitorizada, para poder detectar estos cambios de comportamiento rápidamente y poder solventarlos.
PD: Queda mas que claro que en cuanto tenga una ventana, tendré que realizar un VACUUM FULL a toda la BD de Zabbix, pero por el momento, con esto pude salir del paso!!!