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.
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
etso
: swap in et swap out. -
us
,sy
,id
,wa
, etst
: 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;
- avgqusz: 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.