Diagnostiquer un serveur GNU/Linux

Introduction

Quels sont les outils pour comprendre ce qui se passe sur un serveur qui “semble” lent? Pour répondre, voici une liste des principaux outils en ligne de commande pour diagnostiquer un serveur GNU/Linux.

Escargot géant africain (Achatina fulica)

Cette liste est extraite d’un article écrit par Brendan D. Gregg paru sur le blog technique de Netflix. Contrairement à l’article original je ne présenterai pas uptime (qui donne la charge moyenne pendant la dernière minute écoulée, ainsi que celle des 5 et des 15 dernières minutes), top , ou dmesg | tail, pour me concentrer uniquement sur des outils moins connus.

Liste des outils

vmstat 1

vmstat affiche des informations sur l’état de la mémoire. vmstat 1 ajoute en plus une ligne de mise à jour de ces informations toutes les secondes.

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0 3504512 743984 1847300 4610056    3   10  1538  2221   20   20 31 17 51  1  0
 0  0 3504512 736676 1847316 4616228    0    0     0    17 1884 4703  4  3 93  0  0
 1  0 3504512 728116 1847320 4624320    2    0     2    90 1433 3385  3  2 94  0  0
 0  0 3504512 734148 1847332 4616124    0    0     3   125 1451 3574  4  2 94  0  0
 2  0 3504512 733700 1847336 4616124    0    0     0     5 1443 3480  4  2 94  0  0

Les colonnes à surveiller:

  • r: nombre de processus en cours (running) ou en attente;
  • free: mémoire disponible en kilobytes;
  • si et so: swap in et swap out.
  • us, sy, id, wa, et st: moyenne sur l’ensemble des processeurs des valeurs suivantes
    • user time
    • system time
    • idle
    • wait
    • stolen time

À noter que la première ligne affiche les valeurs moyennes depuis le démarrage de la machine. D’ailleurs vmstat (sans le 1) n’affiche que cette ligne.

Autres options:

  • -w: affiche sur plus de largeur, ce qui améliore la visibilité des nombres dans les colonnes;
  • le nombre à la fin de la commande indique l’intervalle de rafraîchissement (ici 1 = toutes les secondes);
  • si deux nombre apparaissent, le deuxième indique le nombre de rafraîchissement à effectuer avant de s’arrêter.

mpstat -P ALL 1

mpstat -P ALL 1 affiche l’occupation des processeurs, toute les secondes.

18:01:48     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
18:01:49     all    8.08    0.00    4.04    0.00    0.00    1.01    0.00    0.00    0.00   86.87
18:01:49       0    8.08    0.00    4.04    0.00    0.00    1.01    0.00    0.00    0.00   86.87
^C

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    5.12    0.00    1.71    0.00    0.00    0.68    0.00    0.00    0.00   92.49
Average:       0    5.12    0.00    1.71    0.00    0.00    0.68    0.00    0.00    0.00   92.49

Si la charge reste haute et toujours sur le même processeur, on est en présence d’une application non threadée, qui bloque le processeur.

Comme vmstat, cette commande prend deux nombres en arguments (période et nombre de rafraîchissements)

pidstat 1

Affichage par processeur (avant dernière colonne) les processus les plus gourmands en détaillant la répartition user time, system time et wait.

Linux 4.19.97-v7+ (thelibrary)  05/16/2020      _armv7l_        (4 CPU)

04:41:01 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
04:41:02 PM     0       522    0.96    0.00    0.00    0.00    0.96     2  tmux: server
04:41:02 PM     0     29866    0.96    3.85    0.00    0.00    4.81     1  pidstat

04:41:02 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
04:41:03 PM     0      9173    0.00    3.00    0.00    0.00    3.00     0  top
04:41:03 PM     0     29856    0.00    1.00    0.00    0.00    1.00     0  kworker/u8:0-events_unbound
04:41:03 PM     0     29858    1.00    0.00    0.00    0.00    1.00     2  kworker/2:2-events
04:41:03 PM     0     29866    3.00    2.00    0.00    0.00    5.00     1  pidstat
^C

Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        0       522    0.49    0.00    0.00    0.00    0.49     -  tmux: server
Average:        0      9173    0.00    1.47    0.00    0.00    1.47     -  top
Average:        0     29856    0.00    0.49    0.00    0.00    0.49     -  kworker/u8:0-events_unbound
Average:        0     29858    0.49    0.00    0.00    0.00    0.49     -  kworker/2:2-events
Average:        0     29866    1.96    2.94    0.00    0.00    4.90     -  pidstat

Cette commande se rapproche de la commande top mais au lieu de rafraîchir l’écran en effaçant les informations précédentes, elle affiche continuellement des nouvelles données. Ce qui est le cas de la plupart des commandes fournies ici.

pidstat est aussi une commande qui prend deux nombres en arguments (période et nombre de rafraîchissements).

iostat -xz 1

Cette command affiche la charge sur les disques (sur les périphériques de type block plus exactement).

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1,00    0,00    2,25    0,00    0,00   96,75

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     0,00    6,00    0,00   636,00     0,00   212,00     0,00    0,00    0,00    0,00   0,00   0,00
dm-0              0,00     0,00    6,00    0,00   636,00     0,00   212,00     0,00    0,00    0,00    0,00   0,00   0,00
dm-1              0,00     0,00    6,00    0,00   636,00     0,00   212,00     0,00    0,00    0,00    0,00   0,00   0,00

^C

Les informations les plus importantes sont:

  • r/s, w/s, rkB/s, wkB/s: les lectures/écrites, en nombre et en bande passante par seconde;
  • await: l’attente moyenne en milli-seconde avant la réponse à une requête, ce qui est un bon indicateur de problème, si l’attente est trop longue;
  • avgqu­sz: taille moyenne de la queue d’attente du périphérique;
  • %util: l’utilisation du périphérique.

À noter que iostat -xy 1 affiche aussi des informations sur l’utilisation moyenne de tous les processeurs.

Note sur les options:

  • il est possible de spécifier un périphérique (exemple: iostat -xz sda 1)
  • -x: affiche plus de statistiques;
  • -z: n’affiche pas les périphériques inactifs pendant la période d’analyse;
  • -h: statistiques pour les humains;
  • -t: affiche l’heure;
  • encore une commande à deux nombres pour arguments.

free -m (ou mieux free -m -h)

Cette command affiche simplement l’état de la mémoire.

              total        used        free      shared  buff/cache   available
Mem:          7.3Gi       2.2Gi       2.0Gi       468Mi       3.1Gi       4.3Gi
Swap:          15Gi       1.0Mi        15Gi

sar -n DEV 1

Cette commande affiche la bande passante utilisée par chaque interface réseau.

^C

16:37:46        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
16:37:47           lo     12.86     12.86      1.65      1.65      0.00      0.00      0.00      0.00
16:37:47         eth0      7.14      7.14      0.41      1.48      0.00      0.00      0.00      0.01
16:37:47         eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
Average:           lo      6.68      6.68      1.07      1.07      0.00      0.00      0.00      0.00
Average:         eth0     23.06     36.29      1.83     43.52      0.00      0.00      0.00      0.36
Average:         eth1     33.11     19.87     42.08      2.10      0.00      0.00      0.00      0.03

La dernière colonne est particulièrement intéressante puisqu’elle affiche le taux d’usage, qui permet de voir si une interface est saturée.

Sar est une commande à deux nombres pour arguments.

sar -n TCP,ETCP 1

Cette commande affiche un résumé des métriques TCP et des erreurs réseaux.

^C

16:49:36     active/s passive/s    iseg/s    oseg/s
16:49:36         0.00      0.00     50.00     47.06

16:49:36     atmptf/s  estres/s retrans/s isegerr/s   orsts/s
16:49:36         0.00      0.00      0.00      0.00      0.00

Average:     active/s passive/s    iseg/s    oseg/s
Average:         0.00      0.00     13.98     13.74

Average:     atmptf/s  estres/s retrans/s isegerr/s   orsts/s
Average:         0.00      0.00      0.00      0.00      0.00

Les colonnes indiquent:

  • active/s: le nombre de connexions ouvertes par la machine elle même par seconde;
  • passive/s: le nombre de connexions entrantes par seconde;
  • retrans/s: le nombre de retransmission.

Si ce dernier nombre est élevé, cela signifie qu’il y a certainement un problème réseau.

La commande sar possède de nombreuses option pour analyser le réseau:

  • -n EDEV:
  • -n EIP (ou -n EIP6): les erreurs au niveau de la couche ip v4 (ou v6)

Les arguments à l’option -n peuvent se combiner (par exemple: -n EDEV,EIP,EIP6) et surtout n’oublier l’argument 1 pour calculer et afficher les résultats toutes les minutes.

Conclusion

Pour obtenir plus d’informations, la page manuelle (aka man) de chaque commande viendra compléter cet article qui ne fait qu’effleurer le sujet.

Aucun de ces outils ne s’appuient sur BPF, une technologie qui est en passe de devenir le passage obligé pour l’analyse de performance des machines en temps réel.

En attendant les outils basés sur BPF, ceux présentés ici ont l’avantage d’être disponibles sur toutes les machines, y compris celles ayant des noyaux âgés.