Quando requisições de I/O demoradas ficam paralisadas, o sistema pode se tornar instável ou ficar indisponível antes que você tenha informações suficientes para diagnosticar a causa. O Alibaba Cloud Linux 2 e o Alibaba Cloud Linux 3 estendem as estruturas de dados principais do kernel para expor contagens de travamentos por dispositivo, detalhes por requisição e informações de espera por processo, tudo com baixa sobrecarga. 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 travamento configurado, o kernel a marca como travada. Para diagnosticar um travamento de I/O, consulte as interfaces na seguinte ordem:
Verifique
/sys/block/<device>/hang— confirme se ocorreram travamentos de I/O no dispositivo.Consulte
/sys/kernel/debug/block/<device>/rq_hang— obtenha detalhes sobre cada requisição travada.Analise
/proc/<pid>/wait_resou/proc/<pid>/task/<tid>/wait_res— identifique qual processo ou thread está bloqueado e o recurso aguardado.
Interfaces
|
Interface |
Descrição |
Unidade |
|
|
Consulta ou defina o limiar para travamentos de I/O. Padrão: 5000. |
ms |
|
|
Consulta a contagem de operações de I/O que excederam o limiar de travamento. Formato de saída: |
— |
|
|
Obtém detalhes sobre requisições de I/O travadas. |
— |
|
|
Consulta os recursos aguardados por um processo. |
— |
|
|
Consulta os recursos aguardados por uma thread. |
— |
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 |
Definir o limiar de travamento
O limiar padrão de travamento é 5.000 ms. Ajuste-o para corresponder à latência de I/O esperada da sua carga de trabalho.
-
Grave o novo limiar na interface. Este exemplo define o limiar no disco
vdbcomo 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
Verificar a contagem de travamentos
Leia a interface hang para ver quantas operações de leitura e gravação excederam o limiar em um dispositivo. O exemplo a seguir 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 em branco:
|
Campo |
Descrição |
|
Valor à esquerda |
Número de operações de leitura que causaram travamentos de I/O |
|
Valor à direita |
Número de operações de gravação que causaram travamentos de I/O |
Nesta saída, foram registrados 0 travamentos de leitura e 1 travamento de gravação.
Inspecionar requisições travadas
Leia a interface rq_hang para obter detalhes sobre cada requisição travada. O exemplo a seguir 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 da fila de hardware atribuída à requisição |
|
|
Tag da fila de software atribuída internamente |
|
|
Momento em que a requisição foi enviada à camada de bloco (nanossegundos) |
|
|
Hora 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 aguarda. O exemplo a seguir 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 aguardado pelo processo. |
|
Campo 2 |
Endereço do recurso (entrada de cache de páginas ou camada de I/O de bloco) aguardado pelo processo |
|
Campo 3 |
Momento em que o processo começou a esperar pelo recurso |
|
Campo 4 |
Hora 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, utilize /proc/<pid>/task/<tid>/wait_res com o mesmo formato de saída.