minitorovaniio
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
| minitorovaniio [2013/09/09 12:59] – [UseCase1] djbuldog | minitorovaniio [2025/08/28 10:09] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| + | ====== Monitorovani IO ====== | ||
| + | * kolik CPU/RAM zere jaky proces se zjisti snadno, napriklad vypisem top | ||
| + | * monitorovani IO je zlozitejsi a dost casto zpomaluje system nejvic | ||
| + | |||
| + | * existuji programy: | ||
| + | * iotop | ||
| + | * atop | ||
| + | * pidstat | ||
| + | * dstat (--topio, --topbio) | ||
| + | * vmstat (-d) | ||
| + | * iostat | ||
| + | * iozone | ||
| + | * sar | ||
| + | |||
| + | ===== iostat ===== | ||
| + | * využívá hodnoty ze sar | ||
| + | * příklad statistik | ||
| + | < | ||
| + | iostat -d 2 | ||
| + | Linux 2.6.18-194.3.1.el5 (nejaky.stroj.nekde.cz) | ||
| + | |||
| + | Device: | ||
| + | sda | ||
| + | sda1 0.07 | ||
| + | sda2 0.00 | ||
| + | sda3 2.51 | ||
| + | sda4 555.50 | ||
| + | |||
| + | Device: | ||
| + | sda | ||
| + | sda1 0.00 | ||
| + | sda2 0.00 | ||
| + | sda3 0.00 | ||
| + | sda4 0.50 | ||
| + | |||
| + | ... | ||
| + | </ | ||
| + | |||
| + | * první statistika je myslím průmer za celý den, další výpisy odpovídají už zadanému časovému období | ||
| + | |||
| + | ===== sar ===== | ||
| + | * ukládá statistiky dlouhodobě (období lze specifikovat) | ||
| + | * příklad: | ||
| + | < | ||
| + | # sar -b | ||
| + | Linux 2.6.18-194.3.1.el5 (nejakej.stroj.nekde.cz) | ||
| + | |||
| + | 12:00:01 AM | ||
| + | 12:10:01 AM 843.15 | ||
| + | 12:20:01 AM | ||
| + | 12:30:01 AM | ||
| + | 12:40:01 AM | ||
| + | 12:50:01 AM | ||
| + | 01:00:01 AM | ||
| + | 01:10:01 AM 891.21 | ||
| + | 01:20:01 AM 838.14 | ||
| + | .. | ||
| + | </ | ||
| + | * výpis obsahuje průměry za 10 minut. Sloupec bread/bwrtn udává, kolik bloků bylo přečteno/ | ||
| + | * Bloky jsou pravdepodobne velikosti 512B, prestoze filesystem pouziva bloky vetsi, typicky 4k. | ||
| + | |||
| + | < | ||
| + | | ||
| + | Total amount of data read from the devices in blocks per second. | ||
| + | alent to sectors with 2.4 kernels and newer and therefore have a size of 512 bytes. | ||
| + | With older kernels, a block is of indeterminate size. | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | tune2fs -l /dev/sda4 | grep "Block size" | ||
| + | Block size: 4096 | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== UseCase1 (processes read/write old kernel method) ===== | ||
| + | |||
| + | Here’s how you use it. First, get it: | ||
| + | |||
| + | wget http:// | ||
| + | |||
| + | Then turn on kernel messages about I/O: | ||
| + | |||
| + | < | ||
| + | echo 1 > / | ||
| + | </ | ||
| + | |||
| + | This makes the kernel start writing messages about every I/O operation that takes place. Now all you have to do is get those messages and feed them into my script: | ||
| + | |||
| + | < | ||
| + | while true; do sleep 1; dmesg -c; done | perl iodump | ||
| + | </ | ||
| + | |||
| + | Wait a little while, then cancel the script. The results should look something like the following: | ||
| + | |||
| + | < | ||
| + | root@kanga: | ||
| + | ^C# Caught SIGINT. | ||
| + | TASK | ||
| + | firefox | ||
| + | kjournald | ||
| + | firefox | ||
| + | kjournald | ||
| + | pdflush | ||
| + | syslogd | ||
| + | firefox | ||
| + | firefox | ||
| + | firefox | ||
| + | firefox | ||
| + | firefox | ||
| + | </ | ||
| + | |||
| + | I deliberately generated a bunch of I/O by deleting my Firefox history and cache. | ||
| + | |||
| + | Do dmseq se zapisuje neco jako.... | ||
| + | < | ||
| + | firefox(4450): | ||
| + | firefox(4450): | ||
| + | firefox(4450): | ||
| + | </ | ||
| + | |||
| + | ===== UseCase2 (process read/write) ===== | ||
| + | |||
| + | A quick way is to look at the / | ||
| + | |||
| + | Example: | ||
| + | |||
| + | < | ||
| + | $ cat / | ||
| + | read_bytes: 17961091072 | ||
| + | write_bytes: | ||
| + | cancelled_write_bytes: | ||
| + | </ | ||
| + | |||
| + | ==== read/write per process ==== | ||
| + | |||
| + | <file bash iomon.sh> | ||
| + | #!/bin/bash | ||
| + | |||
| + | while [ 1 ] | ||
| + | do | ||
| + | |||
| + | # | ||
| + | CPIDS=`ls /proc/ | grep " | ||
| + | |||
| + | i=0 | ||
| + | for P in $CPIDS | ||
| + | do | ||
| + | STATA[i]=`cat /proc/$P/io 2>/ | ||
| + | i=$((i+1)) | ||
| + | done | ||
| + | |||
| + | sleep 1 | ||
| + | |||
| + | i=0 | ||
| + | for P in $CPIDS | ||
| + | do | ||
| + | STATB[i]=`cat /proc/$P/io 2>/ | ||
| + | i=$((i+1)) | ||
| + | done | ||
| + | |||
| + | i=0 | ||
| + | for P in $CPIDS | ||
| + | do | ||
| + | [[ ${STATB[$i]} -gt 0 ]] && [[ ${STATA[$i]} -gt 0 ]] && DIFF=$(( ${STATB[$i]} - ${STATA[$i]} | ||
| + | [[ $DIFF -gt 0 ]] && { | ||
| + | DIFF=$((DIFF/ | ||
| + | echo "PID $P: $DIFF kB/s (${STATB[$i]} - ${STATA[$i]})" | ||
| + | echo -e "PID $P: | ||
| + | } | ||
| + | i=$((i+1)) | ||
| + | done | ||
| + | |||
| + | echo " | ||
| + | |||
| + | done | ||
| + | </ | ||
| + | ===== UseCase3 (high IO waiting) ===== | ||
| + | | ||
| + | < | ||
| + | wa -- iowait (Amount of time the CPU has been waiting for I/O to complete) | ||
| + | </ | ||
| + | |||
| + | * procesy ve stavu D | ||
| + | < | ||
| + | PROCESS STATE CODES | ||
| + | D uninterruptible sleep (usually IO) | ||
| + | R running or runnable (on run queue) | ||
| + | S interruptible sleep (waiting for an event to complete) | ||
| + | T stopped, either by a job control signal or because it is being traced. | ||
| + | W paging (not valid since the 2.6.xx kernel) | ||
| + | X dead (should never be seen) | ||
| + | Z defunct (" | ||
| + | </ | ||
| + | |||
| + | * vypis procesu ve stavu D | ||
| + | < | ||
| + | for x in `seq 1 1 10`; do ps -eo state, | ||
| + | </ | ||
| + | |||
| + | * zdroj (http:// | ||
