Áú»¢¶Ä²©

8 Notes sobre la selecci¨® de processos als elements proc.mem i proc.num

Processos modificant la l¨ªnia de comandes

Alguns programes empren la modificaci¨® de la seva l¨ªnia de comandes per mostrar la seva activitat actual. Un usuari pot veure l'activitat executant les comandes ps i top. PostgreSQL, Sendmail, Áú»¢¶Ä²© s¨®n exemples d'aquests programes.

Veieu un exemple de Linux. Suposeu que ens cal monitorar un cer nombre de processos d'agent Áú»¢¶Ä²©.

La comanda ps mostra els processos que ens calen

$ ps -fu zabbix
       UID        PID  PPID  C STIME TTY          TIME CMD
       ...
       zabbix    6318     1  0 12:01 ?        00:00:00 sbin/zabbix_agentd -c /home/zabbix/ZBXNEXT-1078/zabbix_agentd.conf
       zabbix    6319  6318  0 12:01 ?        00:00:01 sbin/zabbix_agentd: collector [idle 1 sec]
       zabbix    6320  6318  0 12:01 ?        00:00:00 sbin/zabbix_agentd: listener #1 [waiting for connection]
       zabbix    6321  6318  0 12:01 ?        00:00:00 sbin/zabbix_agentd: listener #2 [waiting for connection]
       zabbix    6322  6318  0 12:01 ?        00:00:00 sbin/zabbix_agentd: listener #3 [waiting for connection]
       zabbix    6323  6318  0 12:01 ?        00:00:00 sbin/zabbix_agentd: active checks #1 [idle 1 sec]
       ...

La selecci¨® dels processos per nom d'usuari fan aquesta feina:

$ zabbix_get -s localhost -k 'proc.num[zabbix_agentd,zabbix]'
       6

Mentrestant, reanomenem l'executable zabbix_agentd a zabbix_agentd_30 i el reengeguem.

ps ensenya ara:

$ ps -fu zabbix
       UID        PID  PPID  C STIME TTY          TIME CMD
       ...
       zabbix    6715     1  0 12:53 ?        00:00:00 sbin/zabbix_agentd_30 -c /home/zabbix/ZBXNEXT-1078/zabbix_agentd.conf
       zabbix    6716  6715  0 12:53 ?        00:00:00 sbin/zabbix_agentd_30: collector [idle 1 sec]
       zabbix    6717  6715  0 12:53 ?        00:00:00 sbin/zabbix_agentd_30: listener #1 [waiting for connection]
       zabbix    6718  6715  0 12:53 ?        00:00:00 sbin/zabbix_agentd_30: listener #2 [waiting for connection]
       zabbix    6719  6715  0 12:53 ?        00:00:00 sbin/zabbix_agentd_30: listener #3 [waiting for connection]
       zabbix    6720  6715  0 12:53 ?        00:00:00 sbin/zabbix_agentd_30: active checks #1 [idle 1 sec]
       ...

Mentrestant, la selecci¨® dels processos per nom i usuari produeix un resultat incorrecte:

$ zabbix_get -s localhost -k 'proc.num[zabbix_agentd_30,zabbix]'
       1

Per qu¨¨ un simple canvi de nom d'executable cap a un nom m¨¦s llarg ens porta a un resultat ben diferent?

L'agent Áú»¢¶Ä²© comen?a verificant el nom dels processos. L'arxiu /proc/<pid>/status ¨¦s obert i la l¨ªnia Name marcada. En el nostre cas, les l¨ªnies de Name ²õ¨®²Ô:

$ grep Name /proc/{6715,6716,6717,6718,6719,6720}/status
       /proc/6715/status:Name:   zabbix_agentd_3
       /proc/6716/status:Name:   zabbix_agentd_3
       /proc/6717/status:Name:   zabbix_agentd_3
       /proc/6718/status:Name:   zabbix_agentd_3
       /proc/6719/status:Name:   zabbix_agentd_3
       /proc/6720/status:Name:   zabbix_agentd_3

El nom dels processos dins l'arxiu status es retalla a 15 car¨¤cters.

Un resultat semblant es pot veure amb la comanda ps :

$ ps -u zabbix
         PID TTY          TIME CMD
       ...
        6715 ?        00:00:00 zabbix_agentd_3
        6716 ?        00:00:01 zabbix_agentd_3
        6717 ?        00:00:00 zabbix_agentd_3
        6718 ?        00:00:00 zabbix_agentd_3
        6719 ?        00:00:00 zabbix_agentd_3
        6720 ?        00:00:00 zabbix_agentd_3
        ...

Evidentment, proc.num[] no ¨¦s igual al nostre valor del par¨¤metre name : zabbix_agentd_30. Com ha fallat la coincid¨¨ncia del nom de processos de l'arxiu status, l'agent Áú»¢¶Ä²© passa al fitxer /proc/<pid>/cmdline.

Com l'agent veu l'arxiu "cmdline" es pot il¡¤lustrar amb l'execuci¨® d'una comanda

$ for i in 6715 6716 6717 6718 6719 6720; do cat /proc/$i/cmdline | awk '{gsub(/\x0/,"<NUL>"); print};'; done
       sbin/zabbix_agentd_30<NUL>-c<NUL>/home/zabbix/ZBXNEXT-1078/zabbix_agentd.conf<NUL>
       sbin/zabbix_agentd_30: collector [idle 1 sec]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>...
       sbin/zabbix_agentd_30: listener #1 [waiting for connection]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>...
       sbin/zabbix_agentd_30: listener #2 [waiting for connection]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>...
       sbin/zabbix_agentd_30: listener #3 [waiting for connection]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>...
       sbin/zabbix_agentd_30: active checks #1 [idle 1 sec]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>...

Els arxius /proc/<pid>/cmdline del nostre cas contenen octets nuls invisibles i no imprimibles, emprats per acabar les cadenes en llenguatge C. Els octets nuls es representen amb "<NUL>" en aquest exemple.

L'agent Áú»¢¶Ä²© verifica a la "cmdline" el proc¨¦s principal i pren zabbix_agentd_30, que corresp¨®n al valor del par¨¤metre name: zabbix_agentd_30. Aix¨ª, el proc¨¦s principal es compta per l'element 'proc.num[zabbix_agentd_30,zabbix].

Quan es verifica el seg¨¹ent proc¨¦s, l'agent pren zabbix_agentd_30: col¡¤lector [idle 1 sec] dins l'arxiu cmdline i no correspon pas al nostre par¨¤metre name zabbix_agentd_30. Aix¨ª, sobre el proc¨¦s principal que no modifica pas la l¨ªnia de comandes, es compta. Altres processos d'agent modifiquen la seva l¨ªnia de comandes i s'ignoren.

Aquest exemple mostra que el par¨¤metre name no pot pas ¨¦sser emprat a proc.mem[] i proc.num[] per la selecci¨® de processos en aquest cas.

Per a l'element proc.get[], quan l'agent Áú»¢¶Ä²© comprova "cmdline" per al nom del proc¨¦s, nom¨¦s emprar¨¤ una part del nom comen?ant des de la darrera barra i fins al primer espai o signe de dos punts. El nom del proc¨¦s rebut del fitxer cmdline nom¨¦s s'emprar¨¤ si el seu inici coincideix completament amb el nom del proc¨¦s escur?at del fitxer "estat". L'algorisme ¨¦s el mateix tant per al nom del proc¨¦s al filtre com per a la sortida JSON.

L'¨²s del par¨¤metre cmdline amb una expressi¨® regular apropiada produeix un resultat correcte:

$ zabbix_get -s localhost -k 'proc.num[,zabbix,,zabbix_agentd_30[ :]]'
       6

Sigueu prudent emprant els elements proc.mem[] i proc.num[] per monitorar els programes que modifiquen le seves l¨ªnies de comandes.

Abans de posar els par¨¤metres name i cmdline dins els elements proc.mem[] i proc.num[], podeu provar els par¨¤metres amb l'ajuda de l'element proc.num[] i de la comanda ps.

Fils del kernel de Linux

els fils no es poden pas triar amb el par¨¤metre cmdline dins els elements proc.get[], proc.mem[] i proc.num[]

Preneu com a exemple un dels fils del kernel:

$ ps -ef| grep kthreadd
       root         2     0  0 09:33 ?        00:00:00 [kthreadd]

Es pot triar amb el par¨¤metre name dels processos:

$ zabbix_get -s localhost -k 'proc.num[kthreadd,root]'
       1

Per¨° amb la selecci¨® per processos, el par¨¤metre cmdline no funciona pas:

$ zabbix_get -s localhost -k 'proc.num[,root,,kthreadd]'
       0

La ra¨® en que l'agent Áú»¢¶Ä²© pren l'expressi¨® regular especificada al par¨¤metre cmdline i l'aplica al contenidor de processos /proc/<pid>/cmdline. Per als fils de kernel, els fitxers /proc/<pid>/cmdline s¨®n buits. Aix¨ª, el par¨¤metre cmdline no coincidir¨¤ mai.

El recompte dels fils dels elements proc.mem[] i proc.num[]

Els fils de kernel Linux es compten amb l'element proc.num[], per¨° no assenyalen pas la mem¨°ria de l'element proc.mem[]. Per exemple:

$ ps -ef | grep kthreadd
       root         2     0  0 09:51 ?        00:00:00 [kthreadd]
       
       $ zabbix_get -s localhost -k 'proc.num[kthreadd]'
       1
       
       $ zabbix_get -s localhost -k 'proc.mem[kthreadd]'
       ZBX_NOTSUPPORTED: Cannot get amount of "VmSize" memory.

Per¨° qu¨¨ passa si un proc¨¦s d'usuari porta el mateix nom que un fil de kernel? S'assemblar¨¤ a aix¨°:

$ ps -ef | grep kthreadd
       root         2     0  0 09:51 ?        00:00:00 [kthreadd]
       zabbix    9611  6133  0 17:58 pts/1    00:00:00 ./kthreadd
       
       $ zabbix_get -s localhost -k 'proc.num[kthreadd]'
       2
       
       $ zabbix_get -s localhost -k 'proc.mem[kthreadd]'
       4157440

proc.num[] compta tant els fils de kernel com els processos d'usuari. proc.mem[] reporta la mem¨°ria nom¨¦s per als processos d'usuaris i compta la mem¨°ria del fil de kernel com si tingu¨¦s estat 0. Aquesta ¨¦s diferent del cas que hi ha aqu¨ª dalt, quan ZBX_NOTSUPPORTED ha estat reportat.

Mireu d'¨¦sser prudents quan empreu els elements proc.mem[] i proc.num[] si el nom del programa correspon a un dels fils.

Abans d'afegir els par¨¤metres als elements proc.mem[] i proc.num[], podeu testar amb l'ajuda de l'element proc.num[] i la comanda ps.