Monitorování zátěže |
David Haring, 25. prosince 2000 |
Asi bychom si sotva dokázali představit provozování jakéhokoliv serveru
bez pomůcek pro sledování zdraví a zátěže systému. Sledování vytížení
procesoru, síťových rozhraní nebo diskových subsystémů, hledání "úzkého
hrdla" a ladění konfigurace hardware či software systému pomocí k tomu
určených nástrojů patří k běžné praxi systémových administrátorů.
V tomto článku se podíváme na několik běžných utilit sloužících k "online"
i "offline" monitorování stavu systému a to zejména na utilitu vmstat,
která je součástí balíčku procps a dále sar a iostat, které jsou součástí
balíčku sysstat. Interaktivní nástroje pro sledování zátěže jako top,
gtop, kim, xosview a další nejsou předmětem tohoto článku.
Vmstat periodicky vypisuje informace o počtu běžících či zablokovaných
procesů, stavu paměti, stránkování, I/O operacích blokových zařízení,
počtu přerušení, počtu přepnutí kontextu a vytížení procesoru. Je součástí
balíčku procps. Vmstat čte informace z příslušných souborů v /proc a pro
jeho spuštění nepotřebujeme žádná privilegia. Můžeme zadat 2 parametry,
a to prodlevu mezi jednotlivými výpisy a počet výpisů. Jako příklad uveďme
. První řádek výpisu
uvádí průměrné hodnoty sledovaných parametrů od restartu systému (s výjimkou
statistiky procesů a paměti, ta je vždy aktuální).
procs memory swap io system cpu
r b w swpd free buff cache si so bi bo in cs us sy id
13 0 0 0 6500 541636 143576 0 0 3 5 1 4 0 6 3
16 0 0 0 6496 541636 143576 0 0 0 0 1856 24114 12 31 57
18 0 0 0 6512 541636 143576 0 0 1 560 1778 21169 9 32 60
20 0 0 0 6580 541636 143576 0 0 0 0 1565 21616 11 37 52
65 0 0 0 6888 541636 142732 0 0 0 10 1722 23836 10 45 46
výpis: výstup příkazu vmstat -n 1 5
|
procs:
- r: počet procesů připravených k běhu (ve výpisu utility
"top" odpovídá stavu R)
- b: počet zablokovaných procesů (ve výpisu utility top stav D)
- w: počet procesů připravených k běhu ale odložených (odswapovaných)
memory:
- swpd: využitý odkládací prostor (swap)
- free: volná paměť
- buff: volná paměť využitá jako vyrovnávací "buffer" pro zápisy na
disk. V případě potřeby je uvolněna.
- cache: volná paměť využitá jako vyrovnávací "cache" pro čtení
(read(), mmap() atd.). V případě potřeby je uvolněna.
swap:
- si: objem paměti načtené z odkládacího prostoru v kB/s (swapu)
- so: objem paměti odložené v kB/s (odswapované) na disk.
io:
- bi: počet bloků načtených z disků (blokových zařízení)
- bo: počet bloků zapsaných na disky (bloková zařízení)
system:
- in: počet přerušení za sekundu. Žádostí o přerušení dávají
periferní zařízení najevo, že došlo k události, kterou je třeba ošetřit - např. signalizují dokončení I/O operace apod. Pokud jádro obdrží žádost
o přerušení, přeruší vykonávání procesu, uloží jeho stav, ošetří přerušení,
obnoví stav procesu a pokračuje v jeho vykonávání. V unixových systémech
jsou tedy přerušení obsluhována v kontextu právě běžícího procesu.
- cs: počet přepnutí kontextu za sekundu. Přepnutím kontextu se rozumí
přerušení vykonávání jednoho procesu, uložení stavu procesu a pokračování
ve vykonávání jiného procesu.
cpu:
- us: čas procesoru (v %) strávený v režimu uživatele
- sy: čas procesoru (v %) strávený v režimu jádra. V unixových systémech
mohou procesy běžet ve dvou režimech: v režimu jádra a v režimu uživatele.
Proces běžící v uživatelském režimu má přístup pouze ke svým datům zatímco
proces v režimu jádra má přístup i k datovým strukturám jádra. Proces
vstupuje do režimu jádra např. v případě, kdy vykonává volání jádra.
- id: nevyužitý čas procesoru
Utilitu sar (z angl. "System Activity Reporter" nalezneme v téměř každém
UN*Xu a stejně tak existuje i její linuxová varianta - je obsažena
v balíčku sysstat.
Sar sbírá mimo jiné data o vytížení procesorů, I/O operacích, stránkování,
zpracování přerušení, vytížení síťových rozhraní, obsazení paměti, swapu,
přepnutí kontextu, počtu nově vytvářených procesů. Balíček sysstat
obsahuje utility sar, sadc a skripty sa1, sa2.
sar - "sa reporter" vypisuje hodnoty
zvolených parametrů systému ve zvoleném intervalu a je určen pro přímé
použití z příkazové řádky.
Linux 2.2.18-RAID (server.domena.cz) 01/09/01
16:34:57 CPU %user %nice %system %idle
16:35:02 all 9.30 35.10 30.60 25.00
16:35:07 all 9.20 36.60 29.70 24.50
16:35:12 all 9.50 37.40 28.30 24.80
16:35:17 all 8.70 37.80 27.40 26.10
16:35:22 all 8.40 38.80 25.50 27.30
Average: all 9.02 37.14 28.30 25.54
výpis: příklad výstupu příkazu sar 5 5
|
Utilita sadc - "sa data collector" sbírá údaje o systému a tato
zapisuje do určeného souboru (v binárním formátu). Sadc není určen pro
přímé použití, buď je spouštěn dle potřeby utilitou sar anebo může být
spouštěn v rámci pravidelně spouštěných skriptů (např. pomocí cronu),
pokud chceme offline monitorovat stav systému.
Skript příkazového interpretu sa1 ukládá denní systémové statistiky v binárním formátu
do souboru s názvem /var/log/sadd, kde se řetězec "dd" nahradí
dnem v měsíci. Pro prohlížení statistik pak použijeme utilitu sar.
Skript volá sadc.
Skript sa2 je určený pro zpracování denních statistik
a jejich uložení v textové podobě do souboru \file{/var/log/sardd}. Skript
volá sar.
Podobně jako vmstat, sar akceptuje jako parametr prodlevu mezi
jednotlivými měřeními/výpisy statistik a počet měření/výpisů. Sar nabízí
řadu přepínačů, kterými vybíráme mezi jednotlivými typy statistik,
standardně vypisuje vytížení procesorů. Nebudeme zde popisovat funkce
jednotlivých přepínačů, protože jich je hodně a pouze odkážeme na
manuálovou stránku.
Následující příklad výstupu příkazu sar 5 5 vypíše zátěž
procesorů pětkrát v intervalu 5 sekund. Poslední rádek vždy uvádí průměrné hodnoty
statistik.
Pokud chceme nepřetržitě monitorovat stav systému, stačí pomocí cronu
pravidelně spouštět skripty sa1 a sa2, které můžeme podle potřeby
upravit. Následující příklad zajistí monitorování systému v intervalu 10
minut (skript sa1). Statistiky budou v 1 hod. následujícího dne zpracovány
a uloženy v textové podobě v souboru /var/log/sadd (za dd dosaďme den
v měsíci). Současně budou smazány statistiky starší 7 dnů (skript sa2).
Nastavení crontab:
0 * * * * /usr/lib/sa/sa1 600 6 &
0 1 * * * /usr/lib/sa/sa2 -A &
Ve skriptu sa2 pouze zaměníme řádek
DATE=`date +%d`"
za řádek
DATE=`date -d yesterday +%d`
Iostat je utilitou určenou pro sledování aktivity I/O zařízení.
V současných jádrech řady 2.2 je možné sledovat pouze 4 disky
a nejsou k dispozici údaje o terminálových zařízeních. Pokud
požadujeme statistiky v Kb/s, je zapotřebí uplatnit
(patch jádra -
jinak jsou k dispozici pouze ve formě čtených / zapisovaných bloků za
sekundu tak, jak to ukazuje příklad výstupu příkazu iostat 5 2).
Poznámka k instalaci: Pro jádra 2.4.x existuje verze sysstatu 3.3
-- vývojová, pro jádra 2.2.xx je určena stabilní verze 3.2.4. Pokud
používáte jádra s podporou více procesorů (SMP), je třeba buď použít
jádro 2.2.16 a vyšší anebo při kompilaci balíčku sysstat zvolit opravu
chyby v ovladači sériových linek, jinak může sadc vyvolat chybu kernelu
při čtení souboru /proc/tty/driver/serial.
Linux 2.2.18 (server.domena.cz) 01/09/01
avg-cpu: %user %nice %sys %idle
11.01 1.04 11.04 12.91
Disks: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
hdisk0 4.16 2.11 6.00 5164034 12632280
hdisk1 6.02 0.07 11.12 1869432 23470406
hdisk2 0.00 0.00 0.00 0 0
hdisk3 0.00 0.00 0.00 0 0
avg-cpu: %user %nice %sys %idle
16.50 0.00 47.85 35.65
Disks: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
hdisk0 3.10 0.00 6.20 0 124
hdisk1 6.60 0.00 13.20 0 264
hdisk2 0.00 0.00 0.00 0 0
hdisk3 0.00 0.00 0.00 0 0
výpis: příklad výstupu příkazu iostat 5 2
|
Teď už víme, jak aktivitu systému zaznamenat, zbývá tedy statistiky
prezentovat nějakým přehledným grafickým způsobem. Existuje řada nástrojů,
které umožňují data offline graficky zpracovat, můžeme použít například
balíček Gnuplot, který je běžnou součástí distribucí.
Gnuplot je nástroj, který umožňuje tvorbu běžných typů grafů a podporuje
výstup do řady grafických formátů. Je ovládaný z příkazové řádky a lze jej využít pro "offline" zpracování dat. Používání gnuplotu však
není předmětem tohoto článku, zde pouze pro inspiraci uvedeme dva
příklady skriptů, které pomocí utilit vmstat (skript gvmstat.sh)
a sar (skript gsar.sh
zaznamenají zátěž systému, pomocí gnuplotu zátěž systému vykreslí a výsledný obrázek uloží ve formátu gif. Grafické výstupy skriptu gvmstat.sh a gsar.sh ukazují přiložené obrázky.
#!/bin/bash
# použití: gvmstat.sh [prodleva] [počet měření]
# zaznamenáme statistiky pomocí vmstat(1)
DELAY=${1:-5};NUM_RECORDS=${2:-50};
vmstat -n $DELAY $[$NUM_RECORDS+1] | sed -e 1,3d -e 's/^ //' -e 's/ \+/ /g' \
> /tmp/vmstatlog.$$
# zjistíme rozsahy grafů
MAX_CS=$(cut -f 13 -d ' ' < /tmp/vmstatlog.$$ | sort -n -r | head -n 1);
MIN_CS=$(cut -f 13 -d ' ' < /tmp/vmstatlog.$$ | sort -n | head -n 1);
MAX_IO_IN=$(cut -f 11 -d ' ' < /tmp/vmstatlog.$$ | sort -n -r | head -n 1);
MIN_IO_IN=$(cut -f 11 -d ' ' < /tmp/vmstatlog.$$ | sort -n | head -n 1);
MAX_IO_OUT=$(cut -f 12 -d ' ' < /tmp/vmstatlog.$$ | sort -n -r | head -n 1);
MIN_IO_OUT=$(cut -f 12 -d ' ' < /tmp/vmstatlog.$$ | sort -n | head -n 1);
MAX_IO=$[$MAX_IO_IN+$MAX_IO_OUT];MIN_IO=$[$MIN_IO_IN+$MIN_IO_OUT];
# skript pro gnuplot
cat <EOF | gnuplot
# nejprve obecné nastavení
set terminal gif size 640,480 # nastavíme výstup do GIFu, rozměry
set output "/tmp/vmstatlog.$$.gif" # kam uložit výsledný GIF
set size 1,1 # nastavíme kreslicí plochu
set origin 0,0 # nastavíme levý dolní roh plochy
set multiplot # více grafů v jednom obrázku
set grid # zobrazit mřížku
set xrange [0:$NUM_RECORDS] # nastavení rozsahu osy x
set nokey # vypneme legendu
# 1. graf - vytížení procesoru (součet sloupců 14 a 15 výpisu vmstat)
set size 1,0.25 # nastavení rozměrů grafu
set origin 0,0
set yrange [0:100] # rozsah osy y
set label "CPU load [%]" at screen 0.5,0.2 center # popis grafu
plot "/tmp/vmstatlog.$$" using ($14+$15) with lines # vykreslení
# 2. graf - běžící procesy (sloupec 1 výpisu vmstat)
set size 1,0.25
set origin 0,0.25
set autoscale y
set label "Runnable processes" at screen 0.5,0.45 center
plot "/tmp/vmstatlog.$$" using 1 with lines
# 3. graf - přepnutí kontextu (sloupec 13 výpisu vmstat)
ycs=($MAX_CS-$MIN_CS)/5
set size 1,0.25
set origin 0,0.5
set autoscale y
set ytics ycs
set label 1 "Context switches [cws/s]" at screen 0.5,0.7 center
set nokey
plot "/tmp/vmstatlog.$$" using 13 with lines
# 4. graf - i/o statistiky (součet sloupců 11 a 12 výpisu vmstat)
ycs=($MAX_IO-$MIN_IO)/5
set size 1,0.25
set origin 0,0.75
set autoscale y
set ytics ycs
set label "I/O activity [block/s]" at screen 0.5,0.95 center
plot "/tmp/vmstatlog.$$" using ($11+$12) with lines
EOF
# prohlédnutí obrázku pomocí xv
xv /tmp/vmstatlog.$$.gif
výpis: ukázka skriptu pro zobrazení aktivity systému pomocí vmstat
|
#! /bin/bash
# ukázka skriptu pro zobrazení aktivity systému pomocí sar
#
# použití: gsar.sh [prodleva] [počet měření]
# zaznamenáme statistiky pomocí sar(1)
DELAY=${1:-1};NUM_RECORDS=${2:-5};
sar -o /tmp/sarlog$$ $DELAY $[$NUM_RECORDS]
sar -f /tmp/sarlog$$ | sed -e 1,3d -e '$d' -e 's/ \+/ /g' -e '/^$/{N
d
}' > /tmp/sarlog$$.cpu
sar -w -f /tmp/sarlog$$ | sed -e 1,3d -e '$d' -e 's/ \+/ /g' -e '/^$/{N
d
}' > /tmp/sarlog$$.csw
sar -r -f /tmp/sarlog$$ | sed -e 1,3d -e '$d' -e 's/ \+/ /g' -e '/^$/{N
d
}' > /tmp/sarlog$$.mem
sar -b -f /tmp/sarlog$$ | sed -e 1,3d -e '$d' -e 's/ \+/ /g' -e '/^$/{N
d
}' > /tmp/sarlog$$.io
# zjistíme rozsahy grafů
MAX_CS=$(cut -f 2 -d ' ' < /tmp/sarlog$$.csw | sort -n -r | head -n 1);
MAX_IO_IN=$(cut -f 5 -d ' ' < /tmp/sarlog$$.io | sort -n -r | head -n 1);
MAX_IO_OUT=$(cut -f 6 -d ' ' < /tmp/sarlog$$.io | sort -n -r | head -n 1);
MAX_IO=`echo "$MAX_IO_IN+$MAX_IO_OUT" | bc`;
MEM_TOTAL=`grep MemTotal /proc/meminfo | sed 's/[a-zA-Z: ]//g'`;
START_TIME=$(head -n 1 /tmp/sarlog$$.csw | cut -f 1 -d ' ');
STOP_TIME=$(tail -n 1 /tmp/sarlog$$.csw | cut -f 1 -d ' ')
# skript pro gnuplot
cat <EOF | gnuplot
# nejprve obecné nastavení
set terminal gif size 640,480;
set output "/tmp/sarlog$$.gif"
set size 1,1;
set origin 0,0;
set multiplot
set grid
set xrange [0:$NUM_RECORDS]
set nokey
# 1. graf - vytížení procesoru
set size 1,0.25; set origin 0,0
set yrange [0:100]
set xdata time; set timefmt "%H:%M:%S"
set xrange ["$START_TIME":"$STOP_TIME"]
set format x "%H:%M:%S"
set label "CPU activity [%]" at screen 0.5,0.2 center
plot "/tmp/sarlog$$.cpu" using 1:($3+$4+$5) with lines
# 2. graf - paměť (použitá celkem - (cacheˇ+ buffer))
set size 1,0.25; set origin 0,0.25
set yrange [0:$MEM_TOTAL]; set ytics 0,$MEM_TOTAL/5,$MEM_TOTAL
set xdata time; set timefmt "%H:%M:%S"
set xrange ["$START_TIME":"$STOP_TIME"]
set format x "%H:%M:%S"
set label "Used memory [kb]" at screen 0.5,0.45 center
plot "/tmp/sarlog$$.mem" using 1:($3-($6+$7)) with lines
# 3. graf - přepnutí kontextu
set size 1,0.25; set origin 0,0.5
set autoscale ymax; set ytics $MAX_CS/5
set xdata time; set timefmt "%H:%M:%S"
set xrange ["$START_TIME":"$STOP_TIME"]
set format x "%H:%M:%S"
set label 1 "Context switches [csw/s]" at screen 0.5,0.7 center
plot "/tmp/sarlog$$.csw" using 1:2 with lines
# 4. graf - i/o statistiky
set size 1,0.25; set origin 0,0.75
set autoscale ymax; set ytics $MAX_IO/5
set xdata time; set timefmt "%H:%M:%S"
set xrange ["$START_TIME":"$STOP_TIME"]
set format x "%H:%M:%S"
set label "I/O activity [blocks/s]" at screen 0.5,0.95 center
plot "/tmp/sarlog$$.io" using 1:($5+$6) with lines
EOF
# display using xv
xv /tmp/sarlog$$.gif
výpis: ukázka skriptu pro zobrazení aktivity systému pomocí sar
|
|