Todos os produtos
Search
Central de documentação

Alibaba Cloud Linux:Detectar travamentos de I/O em sistemas de arquivos e camadas de bloco

Última atualização: Jul 04, 2026

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:

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

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

  3. Analise /proc/<pid>/wait_res ou /proc/<pid>/task/<tid>/wait_res — identifique qual processo ou thread está bloqueado e o recurso aguardado.

Interfaces

Interface

Descrição

Unidade

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

Consulta ou defina o limiar para travamentos de I/O. Padrão: 5000.

ms

/sys/block/<device>/hang

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

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

Obtém detalhes sobre requisições de I/O travadas.

/proc/<pid>/wait_res

Consulta os recursos aguardados por um processo.

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

Consulta os recursos aguardados por uma thread.

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

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.

  1. Grave o novo limiar na interface. Este exemplo define o limiar no disco vdb como 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

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

.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 da fila de hardware atribuída à requisição

.internal_tag

Tag da 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

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.

current_time

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

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

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.