#10 Opmerkingen over het selecteren van processen in proc.mem en proc.num items
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:
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:
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:
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.
cmdline
in de items proc.mem[]
en proc.num[]
Laten we als voorbeeld een van de kernelthreads nemen:
Het kan worden geselecteerd met de parameter 'naam' van het proces:
Maar selectie op proces cmdline
parameter werkt niet:
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.
proc.mem[]
en proc.num[]
itemsLinux-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.