- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 01-02/2001

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

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

Co znamenají jednotlivé položky?

    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

Sar

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

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

Grafické znázornění

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

*


- předchozí článek - následující článek - obsah - úvodní stránka -