Zrýchľujeme Nagios II.

V minulom článku z tejto minisérie sme si ukázali, ako dramaticky zrýchliť Nagios umiestnením spool adresára do ramdisku. Dnes sa pozrieme na zrýchlenie najzákladnejšej kontrole každého hosta. Tak ako predchádzajúce vylepšenie, aj toto vzišlo z reálnej potreby eliminovať falošné poplachy na sieti.

Náš firemný Nagios momentálne kontroluje 1000 hostov s 1940 službami. Jednú peknú nedeľu začal šalieť. Nie tak normálne, ale poriadne. Kritické hosty a ich služby boli nedostupné, alebo dosiahnuteľné s vysokou latenciou a packetlossom. Našťastie som bol blízko zapnutého PC, aby som celú vec prekontroloval. Ale nič sa nedialo, sieť si pekne chrochtala aj napriek vreštiacemu Nagiosu.

To ma dožralo a začal som teda pátrať po príčine. Asi každý, kto používa Nagios na monitorovanie siete, ho používa najmä na kontrolu dostupnosti zariadení, ak vôbec ho používa na niečo iné. Voľba jasne padla na príkazy check-host-alive a check-ping. Tie sú defaultne definované približne takto.

define command{
   command_name check-host-alive
   command_line $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 50 00.0,100% -p 5
}

define command{
   command_name check_ping
   command_line $USER1$/check_ping -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5
}

Ok, poďme sa pozrieť na výkon pluginu check_ping.

root@nagios:/usr/local/nagios/libexec# time ./check_ping -H 172.17.110.7 -w 3000.0,80% -c 5000.0,100% -p5
PING OK - Packet loss = 0%, RTA = 6.19 ms|rta=6.193000ms;3000.000000;5000.000000;0.000000 pl=0%;80;100;0

real 0m4.090s
user 0m0.020s
sys 0m0.000s

Uff, štyri sekundy na vykonanie jednej kontroly. To je dosť. Čo preboha celý čas robí? Pozrime sa trasovanie volaní.

root@nagios:/usr/local/nagios/libexec# strace ./check_ping -H 172.17.110.7 -w 3000.0,80% -c 5000.0,100% -p5
execve("./check_ping", ["./check_ping", "-H", "172.17.110.7", "-w", "3000.0,80%", "-c", "5000.0,100%", "-p5"], [/* 22 vars */]) = 0
brk(0) = 0xfeb000
...
lseek(5, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
read(3, "PING 172.17.110.7 (172.17.110.7)"..., 4096) = 115
read(3, "64 bytes from 172.17.110.7: icmp"..., 4096) = 60
read(3, "64 bytes from 172.17.110.7: icmp"..., 4096) = 60
read(3, "64 bytes from 172.17.110.7: icmp"..., 4096) = 60
read(3, "64 bytes from 172.17.110.7: icmp"..., 4096) = 59
read(3, "\n", 4096) = 1
read(3, "--- 172.17.110.7 ping statistics"..., 4096) = 150
read(3, "", 4096) = 0

Aháááá! Takže on si proste otvorí bežnú systémovú utilitku ping ako podproces a len rozparsuje výstup. Nejde to rýchlejšie a lepšie? Samozrejme že ide, stačí sa len pozrieť do adresára s pluginmi. Nájdeme tam check_icmp, ktorý robí presne to isté, len rýchlejšie, pretože generuje ICMP packety sám. Avšak za cenu SETUID bitu, ktorý ma plugin nastavený. Skúsme to.

root@nagios:/usr/local/nagios/libexec# time ./check_icmp -w 3000.0,80% -c 5000.0,100% -p5 -H 172.17.110.7
OK - 172.17.110.7: rta 0.208ms, lost 0%|rta=0.208ms;3000.000;5000.000;0; pl=0%;80;100;; rtmax=0.331ms;;;; rtmin=0.140ms;;;;

real    0m0.004s
user    0m0.010s
sys     0m0.010s

To už vyzerá oveľa lepšie. Naše definície zo začiatku článku zmeníne nasledovne a znova načítame konfiguráciu

define command{
   command_name check-host-alive
   command_line $USER1$/check_icmp -w 3000.0,80% -c 50 00.0,100% -p 5 -H $HOSTADDRESS$ 
}

define command{
   command_name check_ping
   command_line $USER1$/check_icmp -w $ARG1$ -c $ARG2$ -p 5 -H $HOSTADDRESS$ 
}

Od tej doby Nagios počúva na slovo. 🙂 Každopádne, nedávno vyšla nová verzia 4.0, ktorá prináša mnoho výkonnostných optimalizácií. Ešte som ju neskúšal nasadiť, ale istotne sa o túto skúsenosť podelím.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *