Alibaba Cloud Linux 2 (version du noyau 4.19.81-17.al7 et ultérieures) et Alibaba Cloud Linux 3 ajoutent cinq interfaces au sous-système de limitation blkio. La politique de limitation upstream suit uniquement les octets et le nombre d'opérations, sans fournir de métriques de latence ni de file d'attente. Ces interfaces comblent cette lacune et permettent de déterminer si la latence d'E/S observée provient de la limitation ou d'une contention au niveau du périphérique sous-jacent.
Raison d'être de ces interfaces
La limitation des E/S bloc sous Linux restreint le débit en octets par seconde (BPS) ou les opérations d'entrée/sortie par seconde (IOPS) pour les cgroups. Le sous-système de limitation upstream ne mesure ni la latence ni la profondeur de file d'attente. Vous ne pouvez donc pas distinguer la latence induite par la limitation de celle liée au périphérique, en particulier lorsque le writeback de cgroup est activé.
Les cinq interfaces d'Alibaba Cloud Linux apportent cette observabilité directement au sein du sous-système de limitation.
Interfaces disponibles
Toutes les interfaces se trouvent dans /sys/fs/cgroup/blkio/<cgroup>/, où <cgroup> correspond au groupe de contrôle cible.
| Interface | Description | Unité |
|---|---|---|
blkio.throttle.io_service_time |
Temps total écoulé entre la soumission et l'achèvement des requêtes d'E/S | nanosecondes |
blkio.throttle.io_wait_time |
Temps total passé par les opérations d'E/S dans les files d'attente de l'ordonnanceur | nanosecondes |
blkio.throttle.io_completed |
Nombre d'opérations d'E/S terminées ; à utiliser avec les deux interfaces temporelles pour calculer la latence moyenne | — |
blkio.throttle.total_io_queued |
Nombre d'opérations d'E/S ayant subi une limitation ; comparez les relevés périodiques pour déterminer si la latence d'E/S est liée à la limitation | — |
blkio.throttle.total_bytes_queued |
Volume d'octets d'E/S ayant subi une limitation | octets |
Calculer la latence moyenne d'écriture
Cet exemple supervise la latence des E/S en écriture pour le disque vdd (périphérique 254:48) appartenant au cgroup blkcg1, sur un intervalle de 5 secondes.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cgroup (
blkcg1) avec une limite BPS ou IOPS configuréeLe numéro
major:minordu disque à superviser (exécutezlsblk -o NAME,MAJ:MINpour l'obtenir)Un accès root au système
Exécuter le script de mesure de latence
Exécutez le script suivant en tant que root :
#!/bin/bash
CGROUP_PATH="/sys/fs/cgroup/blkio/blkcg1"
DEVICE="254:48"
INTERVAL=5
# Collect T1 readings
write_wait_time1=$(cat "$CGROUP_PATH/blkio.throttle.io_wait_time" | grep -w "$DEVICE Write" | awk '{print $3}')
write_service_time1=$(cat "$CGROUP_PATH/blkio.throttle.io_service_time" | grep -w "$DEVICE Write" | awk '{print $3}')
write_completed1=$(cat "$CGROUP_PATH/blkio.throttle.io_completed" | grep -w "$DEVICE Write" | awk '{print $3}')
sleep "$INTERVAL"
# Collect T2 readings (T1 + 5 seconds)
write_wait_time2=$(cat "$CGROUP_PATH/blkio.throttle.io_wait_time" | grep -w "$DEVICE Write" | awk '{print $3}')
write_service_time2=$(cat "$CGROUP_PATH/blkio.throttle.io_service_time" | grep -w "$DEVICE Write" | awk '{print $3}')
write_completed2=$(cat "$CGROUP_PATH/blkio.throttle.io_completed" | grep -w "$DEVICE Write" | awk '{print $3}')
# Calculate average I/O latency over the interval
avg_delay=$(echo "((write_wait_time2 + write_service_time2) - (write_wait_time1 + write_service_time1)) / (write_completed2 - write_completed1)" | bc)
echo "Average write latency over ${INTERVAL}s: ${avg_delay} ns"
Ce script applique la formule suivante :
avg_delay = (total_io_duration_T2 - total_io_duration_T1) / (completed_ops_T2 - completed_ops_T1)
où total_io_duration = io_wait_time + io_service_time.
| Variable | Interface | Description |
|---|---|---|
write_wait_time<N> |
blkio.throttle.io_wait_time |
Durée de la limitation au niveau de la couche de limitation des E/S bloc |
write_service_time<N> |
blkio.throttle.io_service_time |
Temps cumulé entre la soumission et l'achèvement des requêtes d'E/S en écriture, en nanosecondes |
write_completed<N> |
blkio.throttle.io_completed |
Nombre cumulé d'opérations d'E/S en écriture terminées |
Exécutez ce script périodiquement, par exemple avec watch ou une tâche cron, afin de suivre l'évolution de la latence dans le temps.