15/11/2024

Pile des systèmes de fichiers : lsof, cachestat, filetop, etc.

Au sein d’un système d’exploitation tel que GNU/Linux, chaque composant est considéré comme un fichier. Le stockage de ces objets est donc organisé au sein d’un espace appelé système de fichiers et présenté le plus souvent au système grâce à un point de montage.

Chaque étage de cette pile d’administration permet de tracer et de vérifier l’ensemble des événements survenus au sein du système. La pile elle-même peut se représenter comme suit :

Au niveau de la couche VFS (Virtual File System), on peut facilement utiliser un outil comme lsof permettant de lister les utilisateurs ou les processus utilisant tel ou tel fichier.

Exemple : afficher les processus actifs pour un système de fichiers /myfs :

$ lsof /myfs

On peut aussi récupérer ainsi tous les fichiers ouverts pour un périphérique donné :

$ lsof /dev/sda2

Il existe également un autre utilitaire permettant de fournir la liste des fichiers mis en cache. Par exemple, pour lister les trois premiers fichiers "cachés", on doit alors exécuter :

$ sudo pcstat --top 3 --bname

Cette commande lit le contenu des fichiers se trouvant dans le pseudo-système de fichiers /proc/<pid>/stat dont les processus associés, ont un champ rss différent de zéro. On peut également utiliser la commande cachestat, issue des fonctionnalités eBPF/BCC, qui permet de comptabiliser des statistiques (exprimées en secondes) concernant le cache du tampon (aussi appelé buffer cache) ainsi que celles du cache de page (aussi appelé page cache) et du cache atteints (appelé cache hits) ou encore celles du cache manqué (appelé cache misses). Cela permet, entre autres choses de visualiser les métriques des entrées dirty buffer entries au sein du cache et d’en déduire le cache hit ratio.

Exemple : lister le cache hit ration des différentes statistiques sur les pages du cache :

# cachestat

Il existe également d’autres fonctions eBPF que l’on peut facilement utiliser telles que :

  • dcsnoop
  • mountsnoop
  • filetop
  • fileslower

Pour ces deux dernières commandes, on peut les utiliser essentiellement pour lister les entrées/sorties par processus sur des périphériques de type bloc :

# filetop

On peut également tracer les entrées/sorties vis-à-vis de fichiers synchrones plus lents qu’une milliseconde :

# fileslower 1 -p <n°PID>

Au niveau du système de fichiers lui-même, il existe également un éventail d’outil, en commençant par celui que l’on utilise quotidiennement. J’ai nommé df au sein des systèmes GNU/Linux :

# df -h

Il existe également, à ce niveau, des outils eBPF, concernant particulièrement les systèmes de fichiers de type ext4 tombés en latence (précision du 1er paramètre) pour un nombre d’itérations spécifique (2ème paramètre) :

# ext4dist 1 10

On trouve également un éventail d’outils eBPF propres aux autres types de système de fichiers : btrfs, xfs, zfs. Ainsi, on peut se servir des fonctions xfsslower ou xfsdist

Sous la couche des systèmes de fichiers, on trouve le niveau du gestionnaire de volumes, pour lequel on peut utiliser la commande lvm ainsi que différents outils de manipulation des volumes logiques : vgdisplay, lvdisplay, pvdisplay.

REMARQUE : on peut utiliser également la commande dmsetup. Il s’agit d’une enveloppe logique de commandes, permettant la communication avec le mapper de périphériques. Si l’on souhaite obtenir des informations concernant les périphériques LVM, on alors exécuter l’une des options info, ls, status, deps de la commande dmsetup.

Exemple : lister les informations concernant le périphérique srv01vg00-home :

# dmsetup info srv01vg00-home

Name :                srv01vg00-home
State :                 ACTIVE
Read Ahead :      8192
Tables present :  LIVE
Open count :       1
Event number :   0
Major, minor :    253, 3
Number of targets :2
UUID : LVM-JL8zts87fonmrDpckO4h2uN438i4ZNCyw2jX2YpPKo1T9xmYs06gh1aW8NgLnZHh

Dans le cas où l’on dispose également de matrice RAID, on peut également récupérer de l’information via la commande mdadm :

# mdadm --detail /dev/md0

RAPPEL : lorsque l’on se trouve en présence de matrices RAID sur un système GNU/Linux, on peut aussi éditer le contenu du fichier /proc/mdstat, retraçant ce qu’affiche la commande mdadm.

Par défaut, la vitesse d’écriture est assez faible lorsque l’on synchronise des volumes d’une matrice RAID entre eux. Mais, il est possible d’augmenter cette limite. Par exemple, si l’on souhaite autoriser une écriture à 100MB/s sur un disque, on devra alors exécuter la commande suivante :

# echo 1000000 > /proc/sys/dev/raid/speed_limit_max

Il est également possible de définir une valeur plancher d’écriture à 10MB/s en exécutant l’instruction suivante :

# echo 100000 > /proc/sys/dev/raid/speed_limit_min

Enfin, on trouve là encore à ce niveau un utilitaire eBPF appelé mdflush permettant de tracer les événements survenus dans le cadre de l’administration d’une matrice RAID et des commandes md :

# mdflush

En dernier ressort, concernant cette pile, on trouve le niveau de la couche d’administration des périphériques de type bloc (généralement pilotés au sein d’un stockage de type SAN). Pour l’ensemble de ces composants on doit être en mesure de débusquer les problèmes de performance et de contention, concernant les processus linux. On peut alors utiliser la commande pidstat, qui affiche la consommation en pourcentage pour les différents espaces : utilisateur, système, invité, ainsi que le pourcentage de CPU consommé :

# pidstat -p ALL

REMARQUE : si l’on souhaite plutôt disposer d’informations plus quantitatives, on peut exécuter la commande ci-dessous :

# pidstat -d

En ce qui concerne les entrées/sorties, il est possible d’utiliser la commande iotop ou encore htop, permettant de gérer les informations des différents processus, et ce, de façon un peu plus graphique, pour ce qui est de la commande htop.

A ce niveau encore, on trouve également des fonctions eBPF permettant d’obtenir des informations sur les périphériques bloc :

  • biotop
  • biosnoop
  • biolatency
  • ttysnoop
  • bitesize (capture la taille des bits manipulés au sein d’un programme)
  • hardirqs (concernant les interruptions matérielles)

En ce qui concerne les périphériques bloc, comme ils sont adressés par des volumes de stockage SAN, leur chemin d’accès est généralement sécurisé en démultipliant leur path. Ainsi, il existe une commande multipath permettant de fournir les informations d’accès à ces différents chemins :

# multipath -ll

Enfin, il ne faut surtout pas négliger de scruter également le Ring Buffer via la commande dmesg à la recherche des indications mentionnées dans ce journal de traces lors des phases de démarrage ou d’interruption des différents périphériques :

# dmesg

Le plus souvent, on peut y trouver des informations spécifiques sur les processus, leur initialisation, les périphériques et leur performance avérées ainsi que sur les systèmes de fichiers.

author avatar
Philippe PIERRE
A exercé de nombreuses années en tant qu'administrateur de base de données et comme administrateur Système Unix/Linux. Il a enseigné les réseaux au CNAM (Paris). Aujourd'hui, employé en tant qu'ingénieur infrastructure, au sein d'un laboratoire pharmaceutique et administrant un cluster de calculs HPC, il connaît parfaitement les environnements GNU/Linux dans le cadre d'une entreprise et des systèmes de haute disponibilité. Il aime partager son expérience.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail