O Alibaba Cloud Linux 2 (versão do kernel 4.19.81-17.al7 e posteriores) e o Alibaba Cloud Linux 3 adicionam cinco interfaces ao subsistema de limitação blkio. A política de limitação upstream rastreia apenas bytes e contagens de operações, sem métricas de latência ou fila. Essas interfaces preenchem essa lacuna e permitem determinar se a latência de E/S observada resulta da limitação ou de contenção no dispositivo subjacente.
Motivo da existência dessas interfaces
A limitação de E/S de bloco do Linux restringe bytes por segundo (BPS) ou operações de entrada/saída por segundo (IOPS) para cgroups. O subsistema de limitação upstream não mede latência nem profundidade de fila. Assim, é impossível distinguir a latência causada pela limitação daquela originada no nível do dispositivo, especialmente com o writeback de cgroup ativado.
As cinco interfaces do Alibaba Cloud Linux adicionam essa observabilidade diretamente ao subsistema de limitação.
Interfaces disponíveis
Todas as interfaces residem em /sys/fs/cgroup/blkio/<cgroup>/, onde <cgroup> representa o grupo de controle alvo.
|
Interface |
Descrição |
Unidade |
|
|
Tempo total entre o envio e a conclusão das operações de E/S |
nanossegundos |
|
|
Tempo total de espera das operações de E/S nas filas do agendador |
nanossegundos |
|
|
Quantidade de operações de E/S concluídas; use com as duas interfaces de tempo para calcular a latência média |
— |
|
|
Número de operações de E/S limitadas; compare leituras periódicas para verificar se a latência de E/S tem relação com a limitação |
— |
|
|
Volume de bytes de E/S limitados |
bytes |
Calcular a latência média de escrita
Este exemplo monitora a latência de E/S de escrita do disco vdd (dispositivo 254:48) no cgroup blkcg1 durante um intervalo de 5 segundos.
Pré-requisitos
Antes de começar, verifique se você possui:
Um cgroup (
blkcg1) com limite de limitação BPS ou IOPS configuradoO número
major:minordo disco a ser monitorado (executelsblk -o NAME,MAJ:MINpara obtê-lo)Acesso root ao sistema
Executar o script de medição de latência
Execute o script abaixo como 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"
O script aplica a seguinte fórmula:
avg_delay = (total_io_duration_T2 - total_io_duration_T1) / (completed_ops_T2 - completed_ops_T1)
onde total_io_duration = io_wait_time + io_service_time.
|
Variável |
Interface |
Descrição |
|
|
|
Duração da limitação na camada de limitação de E/S de bloco |
|
|
|
Tempo acumulado entre o envio e a conclusão de solicitações de E/S de escrita, em nanossegundos |
|
|
|
Contagem acumulada de operações de E/S de escrita concluídas |
Execute o script periodicamente — por exemplo, com watch ou uma tarefa cron — para acompanhar as tendências de latência ao longo do tempo.