Gestion des IOs, iowaits

De wikiGite

S'il est assez simple avec ps de trouver ce qui provoque une utilisation excessive du CPU ou de la mémoire, c'est plus compliqué quand ce sont les attentes disques (iowaits). Si top indique un load average anormal, qui semble provenir d'iowaits importants ("%wa" dans l'entête), on peut utiliser iotop (sur CentOS : dépôt EPEL) :

# iotop
Total DISK READ: 0.00 B/s | Total DISK WRITE: 36.02 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                       
 1142 be/3 root        0.00 B/s    9.21 K/s  0.00 %  0.38 % [kjournald]
    5 rt/3 root        0.00 B/s    0.00 B/s  0.00 %  0.13 % [migration/1]
31527 be/4 dovecot     0.00 B/s    0.00 B/s  0.00 %  0.08 % imap-login
 2984 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % gpm -m /dev/input/mice -t exps2
 1638 be/2 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % audispd
 2401 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % automount
31959 be/4 dovecot     0.00 B/s    0.00 B/s  0.00 %  0.00 % pop3-login
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init [3]
29402 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % spamd child
 2797 be/4 mysql       0.00 B/s    0.00 B/s  0.00 %  0.00 % mysqld --basedir=/usr --~var/lib/mysql/mysql.sock
 2766 be/4 mysql       0.00 B/s    0.00 B/s  0.00 %  0.00 % mysqld --basedir=/usr --~var/lib/mysql/mysql.sock
 2767 be/4 mysql       0.00 B/s    0.00 B/s  0.00 %  0.00 % mysqld --basedir=/usr --~var/lib/mysql/mysql.sock
 2768 be/4 mysql       0.00 B/s    0.00 B/s  0.00 %  0.00 % mysqld --basedir=/usr --~var/lib/mysql/mysql.sock

La colonne IO> indique les processus qui génèrent des IO. Avec top dans une autre console, on peut faire le rapport sur ce qui provoque le load average.

iostat

iostat est l'outil "standard" des unices pour l'affichage de statistics I/O

# iostat 1
Linux 2.6.18-194.32.1.el5 (qsc1.systea.net) 	09.02.2012

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2,03    0,50    2,00    1,34    0,00   94,13

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
hda              11,40       375,18       283,42  923088631  697319402
hda1              0,02         0,55         0,05    1347920     123074
hda2             11,38       374,63       283,37  921740231  697196328

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0,00    0,00    1,03   98,97    0,00    0,00

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
hda              15,00         0,00       224,00          0        224
hda1              0,00         0,00         0,00          0          0
hda2             15,00         0,00       224,00          0        224

vmstat

vmstat, bien que plus aride, donne à peu près les mêmes informations que top. Pour afficher une stat par seconde :

# vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0   1380  16776  95812 260968    0    0     7    27    0   16  0  0 96  3  0
 0  0   1380  16776  95812 260972    0    0     0     0 1026   97  0  0 100  0  0
 0  0   1380  16776  95812 260972    0    0     0     0 1006   87  0  0 100  0  0
 0  0   1380  16776  95820 260964    0    0     0   164 1019  119  0  1 100  0  0
 0  0   1380  16776  95820 260972    0    0     0     0 1008   89  0  0 100  0  0

Par contre on a un vision plus claire de l'espace de swap : on voit avec vmstat s'il est écrit/lu souvent. La colonne 3 ("swpd") indique le swap utilisé, les colonnes si et so sous "---swap--" indiquent les IOs.

En cas de swap, ajouter de la mémoire RAM, ou réduire certains caches : par exemple MySQL dans son /etc/my.cnf.

A voir

"atop" existe aussi. A tester.