Quando requisições de I/O demoradas travam, o sistema pode se tornar instável ou parar completamente antes que haja informações suficientes para diagnosticar a causa. O Alibaba Cloud Linux 2 e o Alibaba Cloud Linux 3 estendem estruturas de dados essenciais do kernel para expor contagens de hang por dispositivo, detalhes por requisição e informações de espera por processo — tudo com baixo overhead. Este tópico descreve as interfaces disponíveis e mostra como utilizá-las.
Como funciona
O kernel rastreia cada requisição de I/O desde o envio até a conclusão. Quando uma requisição excede o limiar de hang configurado, o kernel a marca como hang. Consulte as interfaces na ordem a seguir para diagnosticar um I/O hang:
Verifique
/sys/block/<device>/hang— confirme se ocorreram I/O hangs no dispositivo.Consulte
/sys/kernel/debug/block/<device>/rq_hang— obtenha detalhes sobre cada requisição travada.Examine
/proc/<pid>/wait_resou/proc/<pid>/task/<tid>/wait_res— identifique qual processo ou thread está bloqueado e o recurso que ele aguarda.
Interfaces
|
Interface |
Descrição |
Unidade |
|
|
Consulta ou define o limiar para I/O hangs. Padrão: 5000. |
ms |
|
|
Consulta a contagem de operações de I/O que excederam o limiar de hang. Formato de saída: |
— |
|
|
Consulta detalhes sobre as requisições de I/O travadas. |
— |
|
|
Consulta os recursos pelos quais um processo está esperando. |
— |
|
|
Consulta os recursos pelos quais uma thread está esperando. |
— |
A tabela a seguir descreve as variáveis nos caminhos das interfaces.
|
Variável |
Descrição |
|
|
Nome do dispositivo de armazenamento em bloco |
|
|
ID do processo |
|
|
ID da thread |
Defina o limiar de hang
O limiar de hang padrão é 5.000 ms. Ajuste-o de acordo com a latência de I/O esperada para sua carga de trabalho.
-
Escreva o novo limiar na interface. Este exemplo define o limiar no disco
vdbpara 10.000 ms.echo 10000 > /sys/block/vdb/queue/hang_threshold -
Verifique a alteração.
cat /sys/block/vdb/queue/hang_thresholdSaída esperada:
10000
Verifique a contagem de hangs
Leia a interface hang para ver quantas operações de leitura e escrita excederam o limiar em um dispositivo. Este exemplo utiliza o disco vdb.
cat /sys/block/vdb/hang
Exemplo de saída:
0 1
A saída contém dois valores separados por espaço:
|
Campo |
Descrição |
|
Valor à esquerda |
Número de operações de leitura que causaram I/O hangs |
|
Valor à direita |
Número de operações de escrita que causaram I/O hangs |
Nesta saída, 0 hangs de leitura e 1 hang de escrita foram registrados.
Inspecionar requisições travadas
Leia a interface rq_hang para obter detalhes sobre cada requisição travada. Este exemplo utiliza o disco vdb.
cat /sys/kernel/debug/block/vdb/rq_hang
Exemplo de saída:
ffff9e50162fc600 {.op=WRITE, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=118, .internal_tag=67, .start_time_ns=1260981417094, .io_start_time_ns=1260981436160, .current_time=1268458297417, .bio = ffff9e4907c31c00, .bio_pages = { ffffc85960686740 }, .bio = ffff9e4907c31500, .bio_pages = { ffffc85960639000 }, .bio = ffff9e4907c30300, .bio_pages = { ffffc85960651700 }, .bio = ffff9e4907c31900, .bio_pages = { ffffc85960608b00 }}
Cada entrada representa uma requisição de I/O travada. Os campos principais são:
|
Campo |
Descrição |
|
|
Tipo de operação de I/O, como |
|
|
Flags de comando da requisição, como |
|
|
Flags de estado da requisição, como |
|
|
Estado atual da requisição na camada de bloco, como |
|
|
Tag de fila de hardware atribuída à requisição |
|
|
Tag de fila de software atribuída internamente |
|
|
Momento em que a requisição foi enviada à camada de bloco (nanossegundos) |
|
|
Momento de início da requisição de I/O (nanossegundos). Um valor diferente de zero indica que a requisição não foi processada em tempo hábil, sinalizando um tempo de I/O prolongado. |
|
|
Momento do snapshot (nanossegundos). Subtraia |
|
|
Endereço da estrutura bio associada |
|
|
Endereços das páginas referenciadas pela bio |
Identificar processos bloqueados
Leia /proc/<pid>/wait_res para descobrir quais recursos um processo está aguardando. Este exemplo verifica o processo 577.
cat /proc/577/wait_res
Exemplo de saída:
1 0000000000000000 4310058496 4310061448
A saída contém quatro campos separados por espaço:
|
Campo |
Descrição |
|
Campo 1 |
Tipo de recurso pelo qual o processo está esperando. |
|
Campo 2 |
Endereço do recurso (entrada de cache de página ou camada de I/O de bloco) pelo qual o processo está esperando |
|
Campo 3 |
Momento em que o processo começou a aguardar o recurso |
|
Campo 4 |
Momento atual da leitura do arquivo. Subtraia o Campo 3 do Campo 4 para obter o tempo total de espera. |
Para verificar uma thread específica, use /proc/<pid>/task/<tid>/wait_res com o mesmo formato de saída.