1. Introduction

La surveillance de l’activité disque sur un système Linux est une problématique cruciale pour tous les administrateurs système.

Lorsque l’on souhaite diagnostiquer les causes d’un problème, il est souvent préférable d’avoir une vue complète de l’ensemble des métriques sur notre système : CPU, mémoire, mais aussi de l’activité du disque.

Dans notre tutoriel précédent, nous avons construit un dashboard Grafana qui surveille l’activité CPU et mémoire.

Dans ce tutoriel, nous allons construire un dashboard permettant de surveiller l’activité disque, l’occupation des systèmes de fichiers et même l’utilisation des inodes.

Nous allons utiliser Prometheus pour surveiller ces métriques, mais nous allons aussi découvrir que ce n’est pas la seule manière de le faire.

Ce tutoriel est divisé en trois parties :

  • premièrement, nous allons voir comment la surveillance disque est faite actuellement sur un système Linux, via le système de fichiers ou des outils externes;
  • par la suite, nous verrons comment Prometheus peut nous aider à surveiller l’activité du disque avec le Node Exporter. Nous allons mettre en place les outils en service et les lancer;
  • enfin, nous allons créer un dashboard Grafana pour y visualiser nos métriques.

Prêt?

2. Les bases de la surveillance disque

(Si vous êtes intéressé uniquement par Prometheus et le Node Exporter, dirigez-vous vers la section suivante !)

Sur les systèmes Linux, les métriques relatives au disque peuvent être surveillées via quelques fichiers sur votre système de fichiers.

Vous souvenez-vous de l’adage : « Sur Linux, tout est un fichier » ?

Cela ne peut être plus vrai !

Si vos disques et processus sont des fichiers, il existe des fichiers qui contiennent leurs métriques associées.

2-1. Un tour de procfs

Comme vous le savez déjà, le système de fichiers est construit à partir d’un point « root » contenant de multiples répertoires, chacun ayant une utilité particulière pour notre système.

L’un d’entre eux est /proc, aussi appelé procfs. Il s’agit d’un système de fichiers virtuel, créé à la volée par votre système et qui contient les fichiers relatifs aux processus en route sur votre système.

Image non disponible

procfs peut vous fournir la consommation CPU globale, celle de la mémoire ainsi que l’utilisation disque via plusieurs fichiers :

  • cpuinfo : qui fournit l’utilisation CPU ainsi que les caractéristiques techniques de votre CPU ;
  • meminfo : qui fournit l’utilisation mémoire en temps réel sur votre système ;
  • stat : qui agrège les métriques relatives au CPU et qui est une extension de ce que propose cpuinfo ;
  • /{pid}/io : qui agrège l’utilisation IO pour des processus spécifiques. Ce fichier est très intéressant lorsqu’il s’agit de surveiller certains processus en particulier sur votre système.
 
Sélectionnez
> sudo cat /proc/cpuinfo
dev@dev-ubuntu:/proc$ sudo cat cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 79
model name      : Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz

Comme vous l’avez deviné, Linux expose un ensemble de métriques intégrées qui vous donnent une idée de ce qui se passe sur votre instance.

Mais inspecter ces fichiers n’est pas très pratique. C’est la raison pour laquelle nous allons voir quelques possibilités pour surveiller ces métriques rapidement.

2-2. 5 utilitaires Shell interactifs pour le disque

De manière pratique, un administrateur système inspecte rarement procfs, il utilise un ensemble d’utilitaires créés pour résoudre ces problèmes.

En voici une liste non exhaustive.

2-2-1. Iotop

iotop est un utilitaire interactif qui fournit des métriques en temps réel sur l’utilisation de notre disque. Il n’est pas inclus par défaut sur Ubuntu.

Installation d'Iotop sur base Debian :

 
Sélectionnez
apt-get install iotop

Pour l’essayer, vous pouvez exécuter la commande suivante :

 
Sélectionnez
> sudo iotop -Po

> sudo iotop -Po --iter 4 >> /var/log/iotop

Vous devriez avoir une vue interactive de l’ensemble des processus (-P) qui consomment des ressources sur votre système (-o).

Iotop output example

Les résultats parlent d’eux-mêmes : ils fournissent l’utilisation du disque en lecture, en écriture, l’utilisation de la mémoire swap et l’utilisation actuelle I/O du disque.

Pratique !

2-2-2. Les autres outils : iostat, glances, netdata, pt-diskstats

Iotop n’est pas le seul outil qui fournit des métriques en temps réel. De plus, iotop nécessite les privilèges administrateur pour être exécuté.

La liste mériterait un article à elle toute seule, mais voici plusieurs options pour votre disque :

  • iostat : qui montre l’utilisation disque pour vos devices, en particulier les devices “block” ;
  • glances : cross-plateforme, il permet la surveillance du disque avec une interface Web ;
  • netdata : déjà introduit dans les meilleures solutions de surveillance, il fournit un plugin qui se concentre exclusivement sur l’utilisation disque ;
  • Pt-diskstats : construit par Percona, pt-diskstats est un utilitaire qui récupère l’utilisation du disque et qui l’exporte dans un format adapté à des outils d’analyse.

Glances command example

Maintenant que vous avez connaissance des outils intégrés, il est temps de construire notre propre solution de surveillance avec Prometheus et Node Exporter.

Félicitations, vous connaissez les bases de la surveillance disque.

3. Maîtrise du Node Exporter

Au-delà des outils présentés plus haut, Prometheus est l’une des solutions principales pour surveiller nos disques sur Linux.

Si vous n’êtes pas familier avec Prometheus, n’hésitez pas à lire notre guide disponible ici.

En guise de rappel, Prometheus expose un ensemble d’exporteurs qui peuvent facilement être mis en place pour surveiller : des outils internes (disques, processus), des bases de données (MongoDB, MySQL) ou des outils comme Kafka ou Elasticsearch.

Dans notre cas, nous allons utiliser le Node exporter(la documentation Github est disponible ici).

Le Node exporter est un exporteur qui permet de surveiller toutes les métriques sur votre système : CPU, mémoire, disque, systèmes de fichiers et même votre réseau (d’une façon très similaire à netstat).

Dans notre cas, nous allons nous concentrer sur les disques, les systèmes de fichiers via les collecteurs « filesystem » et « diskstats ».

3-1. Installer le Node Exporter

L’installation de Prometheus a été faite dans notre précédent tutoriel, rendez-vous sur ce lien.

Maintenant que Prometheus est installé et configuré, nous allons installer le Node Exporter en service sur notre instance.

Pour cette installation, j’utilise une machine Ubuntu 16.04 avec systemd.

À partir de root, dirigez-vous vers /etc/systemd/system et créez un nouveau service pour le Node Exporter.

 
Sélectionnez
> cd /etc/systemd/system/
> touch node-exporter.service

Avant de configurer notre service, créons un compte pour le Node Exporter.

 
Sélectionnez
> sudo useradd -rs /bin/false prometheus

Vérifiez que l’utilisateur est bien créé. Cette commande devrait retourner un résultat.

 
Sélectionnez
> sudo cat /etc/passwd | grep prometheus

Une fois qu’il est créé, éditez votre service de cette manière.

 
Sélectionnez
[Unit]
Description=Node Exporter
After=network.target
 
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=[path to node exporter executable]
 
[Install]
WantedBy=multi-user.target

Vérifiez que votre « system daemon » est bien rechargé et démarrez votre nouveau service.

 
Sélectionnez
> sudo systemctl daemon-reload
> sudo systemctl start node-exporter

# Optional : make sure that your service is up and running.
> sudo systemctl status node-exporter

Félicitations ! Votre service est maintenant en route.

Node exporter expose ses métriques sur le port 9100.

3-2. Le Node exporter comme cible pour Prometheus

Maintenant que le Node exporter est en route sur notre instance, il nous faut le configurer comme une cible pour Prometheus de manière à ce que celui-ci l’inspecte.

Rendez-vous à l’endroit où vous avez stocké votre configuration pour Prometheus et éditez le fichier.

Dans la section scrape_configs de votre fichier de configuration, en dessous de static_configs, ajoutez une nouvelle cible qui pointe vers le Node Exporter (port 9100).

 
Sélectionnez
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
            - targets: ['localhost:9100']

Redémarrez votre serveur Prometheus pour que les changements soient effectifs.

 
Sélectionnez
# Service
> sudo systemctl restart prometheus

# Simple background job
> ps aux | grep prometheus
> kill -9 [pidof prometheus]
> ./prometheus &

Dans l’interface Web de Prometheus, vous devriez maintenant voir le Node Exporter comme nouvelle cible de votre instance Prometheus.

Prometheus web UI Interface

3-3. Exploration de vos données

Maintenant que votre serveur Prometheus est connecté au Node Exporter, vous êtes en mesure d’explorer vos données dans l’interface de Prometheus.

Nous allons nous concentrer sur quelques métriques en particulier, pour vérifier que tout est correct.

Dans le champ expression, tapez la commande PromQL suivante :

 
Sélectionnez
> irate(node_disk_read_bytes_total{device="vda"}[5s]) / 1024 / 1024

Cette requête fournit le taux moyen d’opérations de lecture sur une période de cinq secondes, pour le disque vda en mégabits par seconde.

Image non disponible

Si vous êtes en mesure de voir vos données sur le graphe, cela signifie que tout est correct.

Félicitations, vous avez installé et configuré le Node Exporter.

4. Un dashboard Grafana complet

Maintenant que notre instance de Prometheus stocke nos données, il est temps de construire un dashboard Grafana qui représente l’utilisation de nos disques.

Pour rappel, voici l’apparence de notre dashboard final :

Image non disponible

Notre dashboard final est constitué de quatre composants :

  • Surveillance des systèmes de fichiers : pour tous les systèmes de fichiers montés sur une partition, nous aurons une surveillance de l’espace disponible ;
  • Latence en lecture et écriture sur nos disques : avec ces métriques couplées au nombre total de lectures et écritures sur nos disques, nous pouvons en déduire la latence disque ;
  • Nombre d’inodes total disponible ;
  • Charge globale de notre système en temps réel.

Comme toujours, les différentes sections ont été divisées de manière à ce que vous puissiez directement vous rendre à la section qui vous intéresse.

4-1. Surveillance des systèmes de fichiers

Notre premier panel se focalise sur l’espace global restant sur tous nos systèmes de fichiers.

Le node exporter expose deux métriques intéressantes : node_filesystem_avail_bytes et node_filesystem_size_bytes.

L’une divisée par l’autre, nous donne l’utilisation globale par device, ou par point de montage, comme vous préférez.

Comme toujours, voici le résumé :

Image non disponible

4-2. Latences en écriture et en lecture

Une autre métrique intéressante est la latence en lecture et en écriture sur nos disques.

Le node exporter expose plusieurs métriques de manière à la calculer.

Pour la partie lecture, nous avons :

  • node_disk_read_time_seconds_total
  • node_disk_reads_completed_total

Pour la partie écriture, nous avons :

  • node_disk_write_time_seconds_total
  • node_disk_writes_completed_total

Si nous calculons le taux de ces deux métriques, et que nous divisons l’une par l’autre, nous pouvons calculer la latence ou le temps que notre disque prend pour compléter ces opérations.

Image non disponible

4-3. Nombre d’inodes sur notre système

Maintenant que nous avons la latence en lecture et en écriture, nous voulons savoir le nombre d’inodes restant que notre système.

Par chance, ce sont des métriques exposées par le node exporter :

  • node_filesystem_files_free
  • node_filesystem_files

En suivant la même logique, en divisant l’une par l’autre, nous en déduisons le nombre d’inodes restant. En voici le résumé :

Image non disponible

4-4. Charge I/O globale sur notre instance

Une métrique facile à calculer. En tant que check global de notre système, nous voulons connaitre la charge globale. Le node exporter expose cette métrique :

  • node_disk_io_now

En calculant l’accroissement (via rate) de cette métrique par seconde, nous en déduisons la charge sur notre système. Voici le résumé :

Image non disponible

Félicitations, vous avez un dashboard complet de surveillance de vos disques.

5. Bonus : créer des alertes sur nos métriques

Les visualisations sont importantes, mais parfois vous voulez être averti lorsqu’un fait notable se passe sur vos disques.

Si vous avez suivi le guide complet pour Prometheus, vous savez que Prometheus est entouré de l’Alert Manager pour lever des alertes customisées.

Samuel Berthe, (@samber on Github) et créateur de awesome-prometheus-alerts a construit une liste très complète d’alertes dont voici un résumé.

5-1. Latence disque en lecture

 
Sélectionnez
- alert: UnusualDiskReadRate
  expr: sum by (instance) (irate(node_disk_read_bytes_total[2m])) / 1024 / 1024 > 50
  for: 30m
  labels:
    severity: warning
  annotations:
    summary: "Unusual disk read rate (instance {{ $labels.instance }})"
    description: "Disk is probably reading too much data (> 50 MB/s)\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"

5-2. Latence disque en écriture

 
Sélectionnez
- alert: UnusualDiskWriteRate
  expr: sum by (instance) (irate(node_disk_written_bytes_total[2m])) / 1024 / 1024 > 50
  for: 30m
  labels:
    severity: warning
  annotations:
    summary: "Unusual disk write rate (instance {{ $labels.instance }})"
    description: "Disk is probably writing too much data (> 50 MB/s)\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"

5-3. Espace disque insuffisant

 
Sélectionnez
- alert: OutOfDiskSpace
  expr: node_filesystem_free_bytes{mountpoint ="/rootfs"} / node_filesystem_size_bytes{mountpoint ="/rootfs"} * 100 < 10
  for: 30m
  labels:
    severity: warning
  annotations:
    summary: "Out of disk space (instance {{ $labels.instance }})"
    description: "Disk is almost full (< 10% left)\n  VALUE = {{ $value 
}}\n  LABELS: {{ $labels }}"

6. Un mot pour conclure

À travers ce tutoriel, vous avez appris qu’il est facile de surveiller l’activité de vos disques avec Prometheus et Grafana.

La surveillance de telles métriques est essentielle pour chaque administrateur système qui veut avoir des réponses claires aux problèmes qu’il peut rencontrer.

Maintenant, vous êtes en mesure de savoir s’il s’agit de latences en lecture, en écriture, ou si vos systèmes de fichiers sont à court d’espace.

NDLR : L'état SMART permet de connaitre l'état de santé de vos disques durs. Il est nécessaire de surveiller l’état de santé de ceux-ci. L'état SMART devrait pouvoir être facilement intégré aux outils présentés dans ce tutoriel.

Avec la surveillance disque, nous effleurons à peine la surface des capacités du node exporter, il existe bien plus d’options que cela.

Si vous avez créé un dashboard pour Grafana avec les outils décrits plus haut, montrez-le-nous !

J’espère que vous avez appris de nouvelles choses aujourd’hui.

Antoine Solnichkin.

6-1. Tutoriels en relation