#10 Opmerkingen over het selecteren van processen in proc.mem en proc.num items

Processen die hun commandoregel wijzigen

Sommige programma's gebruiken het wijzigen van hun commandoregel als een methode om weer te geven hun huidige activiteit. Een gebruiker kan de activiteit zien door ps en . uit te voeren top commando's. Voorbeelden van dergelijke programma's zijn PostgreSQL, Sendmail, Zabbix.

Laten we een voorbeeld van Linux bekijken. Laten we aannemen dat we willen monitoren a aantal Zabbix-agentprocessen.

ps commando toont processen die van belang zijn als

$ 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: verzamelaar [inactief 1 sec]
       zabbix 6320 6318 0 12:01 ? 00:00:00 sbin/zabbix_agentd: luisteraar #1 [wacht op verbinding]
       zabbix 6321 6318 0 12:01 ? 00:00:00 sbin/zabbix_agentd: luisteraar #2 [wacht op verbinding]
       zabbix 6322 6318 0 12:01 ? 00:00:00 sbin/zabbix_agentd: luisteraar #3 [wacht op verbinding]
       zabbix 6323 6318 0 12:01 ? 00:00:00 sbin/zabbix_agentd: actieve controles #1 [inactief 1 sec]
       ...

Het selecteren van processen op naam en gebruiker doet het werk:

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

Laten we nu het uitvoerbare bestand zabbix_agentd hernoemen naar zabbix_agentd_30 en herstart het.

ps wordt nu weergegeven

$ 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: verzamelaar [inactief 1 sec]
       zabbix 6717 6715 0 12:53 ? 00:00:00 sbin/zabbix_agentd_30: luisteraar #1 [wacht op verbinding]
       zabbix 6718 6715 0 12:53 ? 00:00:00 sbin/zabbix_agentd_30: luisteraar #2 [wacht op verbinding]
       zabbix 6719 6715 0 12:53 ? 00:00:00 sbin/zabbix_agentd_30: luisteraar #3 [wacht op verbinding]
       zabbix 6720 6715 0 12:53 ? 00:00:00 sbin/zabbix_agentd_30: actieve controles #1 [inactief 1 sec]
       ...

Het selecteren van processen op naam en gebruiker levert nu een onjuist resultaat op:

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

Waarom een eenvoudige hernoeming van het uitvoerbare bestand naar een langere naam tot behoorlijk leidt? ander resultaat?

Zabbix-agent begint met het controleren van de procesnaam. /proc/<pid>/status bestand wordt geopend en de regel Naam wordt aangevinkt. In ons geval de Naam lijnen zijn:

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

De procesnaam in het status-bestand wordt afgekapt tot 15 tekens.

Een soortgelijk resultaat is te zien met het commando 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
        ...

Uiteraard is dat niet gelijk aan onze proc.num[] name parameterwaarde zabbix_agentd_30. Het is niet gelukt om de procesnaam van . te matchen status-bestand verandert de Zabbix-agent in /proc/<pid>/cmdline-bestand.

Hoe de agent het "cmdline"-bestand ziet, kan worden geïllustreerd met het uitvoeren van a opdracht

$ voor ik in 6715 6716 6717 6718 6719 6720; doe cat /proc/$i/cmdline | awk '{gsub(/\x0/,"<NUL>"); afdrukken};'; gedaan
       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: luisteraar #1 [wacht op verbinding]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>...
       sbin/zabbix_agentd_30: luisteraar #2 [wacht op verbinding]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>...
       sbin/zabbix_agentd_30: luisteraar #3 [wacht op verbinding]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>...
       sbin/zabbix_agentd_30: actieve controles #1 [idle 1 sec]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>. ..

/proc/<pid>/cmdline-bestanden bevatten in ons geval onzichtbare, niet-afdrukbare null bytes, gebruikt om strings in C taal te beëindigen. De null-bytes worden in dit voorbeeld weergegeven als "<NUL>".

Zabbix-agent controleert "cmdline" voor het hoofdproces en neemt een zabbix_agentd_30, die overeenkomt met onze parameterwaarde naam zabbix_agentd_30. Het hoofdproces wordt dus per item geteld proc.num[zabbix_agentd_30,zabbix].

Bij het controleren van het volgende proces neemt de agent: zabbix_agentd_30: collector [idle 1 sec] uit het cmdline-bestand en het voldoet niet aan onze name parameter zabbix_agentd_30. Dus alleen de hoofdproces dat zijn commandoregel niet wijzigt, wordt geteld. Ander agentprocessen wijzigen hun opdrachtregel en worden genegeerd.

Dit voorbeeld laat zien dat de parameter name niet kan worden gebruikt in proc.mem[] en proc.num[] voor het selecteren van processen in dit geval.

Het gebruik van de parameter 'cmdline' met een juiste reguliere expressie levert a juiste resultaat:

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

Wees voorzichtig bij het gebruik van proc.mem[] en proc.num[] items voor monitoring programma's die hun commandoregels wijzigen.

Voordat u de parameters name en cmdline in proc.mem[] en . plaatst proc.num[] items, wilt u misschien de parameters testen met proc.num[] item en ps commando.

Linux-kernelthreads

Discussies kunnen niet worden geselecteerd met de parameter cmdline in de items proc.mem[] en proc.num[]

Laten we als voorbeeld een van de kernelthreads nemen:

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

Het kan worden geselecteerd met de parameter 'naam' van het proces:

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

Maar selectie op proces cmdline parameter werkt niet:

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

De reden is dat de Zabbix-agent de opgegeven reguliere expressie gebruikt in de parameter cmdline en past deze toe op de inhoud van het proces /proc/<pid>/cmdline. Voor kernelthreads is hun /proc/<pid>/cmdline bestanden zijn leeg. De parameter cmdline komt dus nooit overeen.

Tellen van threads in proc.mem[] en proc.num[] items

Linux-kernelthreads worden geteld door het item proc.num[] maar rapporteren niet geheugen in proc.mem[] item. Bijvoorbeeld:

$ ps -ef | grep kthreadd
       wortel 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: Kan de hoeveelheid "VmSize"-geheugen niet ophalen.

Maar wat gebeurt er als er een gebruikersproces is met dezelfde naam als a kern draad? Dan zou het er zo uit kunnen zien:

$ ps -ef | grep kthreadd
       wortel 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[] telde zowel de kernelthread als het gebruikersproces. proc.mem[] rapporteert alleen geheugen voor het gebruikersproces en telt de kernelthread-geheugen alsof het 0 is. Dit is anders dan het geval hierboven wanneer ZBX_NOTSUPPORTED werd gerapporteerd.

Wees voorzichtig bij het gebruik van proc.mem[] en proc.num[] items als het programma naam komt toevallig overeen met een van de threads.

Voordat u parameters in de items proc.mem[] en proc.num[] plaatst, moet u wil misschien de parameters testen met behulp van proc.num[] item en ps opdracht.