Todos os produtos
Search
Central de documentação

Alibaba Cloud Linux:Detect I/O hangs of file systems and block layers

Última atualização: Sep 22, 2026

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:

  1. Verifique /sys/block/<device>/hang — confirme se ocorreram I/O hangs no dispositivo.

  2. Consulte /sys/kernel/debug/block/<device>/rq_hang — obtenha detalhes sobre cada requisição travada.

  3. Examine /proc/<pid>/wait_res ou /proc/<pid>/task/<tid>/wait_res — identifique qual processo ou thread está bloqueado e o recurso que ele aguarda.

Interfaces

Interface

Descrição

Unidade

/sys/block/<device>/queue/hang_threshold

Consulta ou define o limiar para I/O hangs. Padrão: 5000.

ms

/sys/block/<device>/hang

Consulta a contagem de operações de I/O que excederam o limiar de hang. Formato de saída: <read_count> <write_count>.

—

/sys/kernel/debug/block/<device>/rq_hang

Consulta detalhes sobre as requisições de I/O travadas.

—

/proc/<pid>/wait_res

Consulta os recursos pelos quais um processo está esperando.

—

/proc/<pid>/task/<tid>/wait_res

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

<device>

Nome do dispositivo de armazenamento em bloco

<pid>

ID do processo

<tid>

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.

  1. Escreva o novo limiar na interface. Este exemplo define o limiar no disco vdb para 10.000 ms.

    echo 10000 > /sys/block/vdb/queue/hang_threshold
  2. Verifique a alteração.

    cat /sys/block/vdb/queue/hang_threshold

    Saí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

.op

Tipo de operação de I/O, como READ ou WRITE

.cmd_flags

Flags de comando da requisição, como SYNC

.rq_flags

Flags de estado da requisição, como STARTED e IO_STAT

.state

Estado atual da requisição na camada de bloco, como in_flight

.tag

Tag de fila de hardware atribuída à requisição

.internal_tag

Tag de fila de software atribuída internamente

start_time_ns

Momento em que a requisição foi enviada à camada de bloco (nanossegundos)

io_start_time_ns

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.

current_time

Momento do snapshot (nanossegundos). Subtraia io_start_time_ns de current_time para obter a duração decorrida do hang.

.bio

Endereço da estrutura bio associada

.bio_pages

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. 1 = cache de página no sistema de arquivos. 2 = camada de I/O de bloco.

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.