Diagnóstico de Alta Latência de I/O em Disco: Um Guia Linux Passo a Passo

Diagnostique a latência de I/O de disco no Linux com iostat, iotop, pidstat, vmstat, logs e verificações práticas de carga de trabalho.

Diagnóstico de Alta Latência de I/O em Disco: Um Guia Linux Passo a Passo

A alta latência de I/O em disco tem uma sensação muito específica. O SSH ainda conecta, a CPU não está no máximo, mas todo comando que toca em arquivos trava por um momento. Uma aplicação web pausa ao escrever sessões. Uma consulta de banco de dados que normalmente retorna rapidamente começa a esperar pelo armazenamento. A máquina parece viva, mas parece que está andando na lama.

O truque é evitar suposições. "O disco está lento" pode significar um dispositivo de blocos saturado, troca excessiva (swap thrashing), uma unidade com falha, um trabalho de backup ruidoso, um volume de rede sobrecarregado ou um banco de dados fazendo leituras aleatórias porque um índice está faltando. O mesmo sintoma pode vir de causas muito diferentes.

Entendendo as Métricas de I/O de Disco

Antes de mergulhar no diagnóstico, é vital entender as métricas-chave que indicam um problema de I/O. A alta latência é o sintoma principal, mas precisamos de pontos de dados de suporte para confirmar a gravidade e a origem do problema.

Indicadores Chave de Contenção de I/O

  • Alta Latência (await): O tempo médio, em milissegundos, para que as requisições de I/O sejam concluídas. Isso inclui o tempo gasto na fila e o tempo gasto sendo atendido. O que conta como "alto" depende do armazenamento e da carga de trabalho; compare com a linha de base normal do sistema quando possível.
  • Alta Utilização (%util): Quando esta métrica se aproxima de 100%, o dispositivo está saturado e não consegue lidar com mais requisições de forma eficiente.
  • Alto Enfileiramento (avgqu-sz): Um tamanho médio de fila grande significa que muitos processos estão esperando o disco ficar livre.

Passo 1: Verificação Inicial de Saúde do Sistema com iostat

O utilitário iostat (parte do pacote sysstat) é a base para monitorar a utilização do dispositivo e as estatísticas de desempenho. Ele fornece dados históricos e atuais sobre CPU e I/O de dispositivos.

Para obter um resumo contínuo do desempenho de I/O, execute iostat com um intervalo (por exemplo, a cada 2 segundos):

sudo iostat -dxm 2

Analisando a Saída de iostat -dxm

Concentre-se especificamente nas colunas de estatísticas do dispositivo (flag x):

Coluna Descrição Implicação de Valor Alto
r/s, w/s Leituras/Escritas por segundo (IOPS) Valores altos indicam alta demanda de throughput.
rkB/s, wkB/s Kilobytes lidos/escritos por segundo Mede o volume de throughput.
await Tempo médio de espera (ms) para requisições de I/O (tempo de serviço + tempo de fila) Indicador principal de alta latência.
%util Percentual de tempo que o dispositivo esteve ocupado atendendo requisições Próximo de 100% indica saturação.

Exemplo de Cenário: Se /dev/sda mostra um tempo await de 150ms e %util em 98%, você confirmou um gargalo severo de I/O naquele disco.

Dica: Use a flag -x para estatísticas estendidas e -m para relatar em megabytes, o que geralmente é mais claro do que kilobytes (-k).

Passo 2: Identificando o Processo Culpado com iotop

Uma vez que o iostat confirma alta latência em um dispositivo específico (ex.: /dev/sda), o próximo passo crucial é determinar qual processo está gerando essa carga. O utilitário iotop, que espelha a funcionalidade do comando top, mas foca na atividade de I/O, é essencial aqui.

Se o iotop não estiver instalado, instale-o primeiro:

# Debian/Ubuntu
sudo apt update && sudo apt install iotop

# RHEL/CentOS/Fedora
sudo yum install iotop  # ou dnf install iotop

Execute o iotop com privilégios de root, mostrando apenas processos ativamente fazendo I/O:

sudo iotop -oP
  • -o: Mostra apenas processos ativamente fazendo I/O.
  • -P: Mostra processos, não threads individuais.

Examine a saída, prestando atenção nas colunas IO_READ e IO_WRITE. Os processos listados no topo estão consumindo mais largura de banda do disco. Os culpados comuns incluem servidores de banco de dados (MySQL, PostgreSQL), utilitários de backup, scripts de rotação de log ou sistemas escrevendo agressivamente em espaço de swap.

Interpretando a Saída do iotop

O iotop exibe o uso total de disco para cada processo. Se você vir uma única aplicação dominando a utilização do disco (ex.: um script de backup rodando a 50 MB/s enquanto a latência dispara), você encontrou a causa imediata.

Passo 3: Aprofundamento com pidstat

Enquanto o iotop mostra o I/O agregado por processo, o pidstat pode fornecer contexto histórico detalhado sobre operações de I/O iniciadas por PIDs específicos, o que é útil para problemas intermitentes ou de longa duração.

Para monitorar estatísticas de I/O (leitura e escrita de blocos) para todos os processos a cada 5 segundos por 5 iterações:

sudo pidstat -d 5 5

As métricas chave na saída -d incluem:

  • kB_rd/s: Quantidade de dados lidos do disco por segundo pela tarefa.
  • kB_wr/s: Quantidade de dados escritos no disco por segundo pela tarefa.
  • kB_ccwr/s: Quantidade de dados escritos no espaço de swap (escrita cancelada/confirmada).

Se leituras e escritas saltam para o mesmo processo sempre que os usuários reportam pausas, você tem uma pista útil. O pidstat é especialmente útil quando o iotop mostra um pico curto e depois limpa antes que você possa lê-lo.

Passo 4: Diagnosticando a Troca Excessiva de Memória (Uso de Swap)

A alta atividade de swap frequentemente se manifesta como alta latência de I/O de disco porque o sistema é forçado a usar o disco físico lento como RAM virtual. Use o comando free para verificar a pressão na memória:

free -h

Se a memória usada está próxima da memória total, e o valor de swap usado está aumentando rapidamente, o sistema está com falta de memória, e a latência de I/O é um sintoma secundário da troca excessiva.

Resolução para Troca Excessiva:

  1. Identifique processos que consomem muita memória usando top ou htop.
  2. Aumente a RAM do sistema, se possível.
  3. Ajuste as aplicações para usar menos memória.

Verifique também o vmstat enquanto o problema está ocorrendo:

vmstat 1

As colunas si e so mostram a atividade de swap-in e swap-out. Valores não nulos ocasionais não são automaticamente uma crise. Atividade sustentada enquanto o sistema está lento é um sinal mais forte. A coluna wa da CPU também é útil: I/O wait alto significa que as tarefas estão gastando tempo bloqueadas no armazenamento em vez de rodar na CPU.

Passo 5: Corresponder o Dispositivo ao Sistema de Arquivos

O iostat reporta dispositivos de bloco: sda, nvme0n1, dm-0, md0 e assim por diante. Os logs da sua aplicação geralmente mencionam caminhos: /var/lib/mysql, /var/log, /home, /data. Antes de culpar o disco errado, mapeie o caminho para o dispositivo.

df -hT /var/lib/mysql
findmnt /var/lib/mysql
lsblk -f

Isso é importante em hosts com LVM, RAID por software, volumes em nuvem ou pontos de montagem separados. Você pode ver alta latência em dm-0, mas o dispositivo de suporte real pode ser um volume EBS, um array mdraid ou um dispositivo de mapeador criptografado. Se o sistema de arquivos ocupado está em armazenamento de rede, as ferramentas de disco locais contam apenas parte da história. Você também precisará verificar NFS, iSCSI, métricas de volume em nuvem ou o appliance de armazenamento.

Passo 6: Procurar por Pistas do Kernel e Hardware

Quando a latência é alta, mas o throughput não é, verifique se há erros de armazenamento. Um disco com falha ou um controlador propenso a reset pode fazer o sistema rastejar mesmo com I/O modesto.

dmesg -T | egrep -i 'error|reset|timeout|nvme|scsi|blk_update|i/o error'
journalctl -k --since "30 minutes ago"

Para discos físicos, os dados SMART podem ser úteis:

sudo smartctl -a /dev/sda

Para dispositivos NVMe:

sudo nvme smart-log /dev/nvme0

Não interprete um campo SMART isoladamente. Diferentes fornecedores expõem diferentes contadores. Mas setores realocados, erros de mídia, timeouts de comando repetidos ou erros de I/O do kernel merecem atenção imediata. Se o disco serve um banco de dados de produção, pare de tratar como um exercício de ajuste e mova-se em direção à redundância, failover ou substituição.

Passo 7: Separar Problemas de Largura de Banda de Problemas de Latência

Dois incidentes podem ambos mostrar "disco lento" enquanto precisam de correções diferentes.

Um backup sequencial pode empurrar alto wkB/s e alto %util. Isso é um problema de largura de banda. Limitar o backup, movê-lo para fora do pico, usar backups incrementais ou escrever em um volume diferente pode ajudar.

Um banco de dados com índices faltando pode mostrar throughput modesto, mas await doloroso, muitas leituras pequenas e atrasos de consulta visíveis ao usuário. Isso é frequentemente um problema de I/O aleatório e formato de consulta. Jogar mais largura de banda pode ajudar menos do que adicionar o índice certo ou reduzir o conjunto de trabalho.

Use esta leitura rápida:

  • Alto rkB/s ou wkB/s, alto %util, grande trabalho óbvio: procure por leituras/escritas em massa.
  • Alto r/s ou w/s, alto await, throughput menor: procure por muitas operações aleatórias pequenas.
  • Alta atividade de swap, alto wa, pouca memória livre: trate a pressão de memória como a causa raiz.
  • Alta latência com erros do kernel: trate a saúde do armazenamento como a causa raiz.

Passo 8: Verificar o Contexto no Nível da Aplicação

As ferramentas do sistema dizem quem está tocando no armazenamento. Elas nem sempre dizem por quê.

Para bancos de dados, verifique logs de consulta lentas e métricas de buffer/cache. Um processo MySQL no topo do iotop pode ser normal durante um backup, ruim durante o tráfego de pico ou esperado após uma reinicialização enquanto o pool de buffers está frio. O PostgreSQL pode estar fazendo autovacuum, escritas de checkpoint ou uma consulta que derrama em disco. O MongoDB pode estar compactando, construindo índices ou lendo um conjunto de trabalho que não cabe mais na RAM.

Para servidores web e workers de aplicação, procure por tempestades de log. Um log de depuração deixado ativado pode criar escritas síncronas constantes. Uma dependência com falha também pode criar logs de erro repetidos, que então criam pressão no disco, que então piora o incidente original.

Para contêineres, lembre-se de que o processo ruidoso pode aparecer sob containerd, dockerd ou um sistema de arquivos overlay. Use também ferramentas no nível do contêiner:

docker stats
docker ps --format 'table {{.ID}}\t{{.Names}}\t{{.Status}}'

Em nós Kubernetes, compare o I/O no nível do host com o posicionamento dos pods. Um único pod escrevendo pesadamente em um emptyDir, hostPath ou volume persistente local pode fazer pods não relacionados no mesmo nó parecerem não saudáveis.

Causas Comuns e Estratégias de Remediação

Uma vez que a fonte é identificada, aplique a correção apropriada:

1. Backups ou Tarefas de Manutenção

Sintoma: Alta utilização de I/O coincidindo com tarefas agendadas (ex.: cron jobs). Remediação: Reagende grandes tarefas de I/O, limite-as se o utilitário suportar, ou mova a saída temporária para um volume diferente. Por exemplo, rsync --bwlimit, ionice e limitadores de backup nativos do banco de dados podem reduzir o raio de explosão.

2. Consultas de Banco de Dados Ineficientes

Sintoma: Processos de banco de dados (ex.: mysqld) são os principais consumidores no iotop. Remediação: Otimize consultas mal indexadas que forçam varreduras completas de tabela, levando a enormes leituras aleatórias.

3. Logs Excessivos

Sintoma: Processos de log da aplicação ou do sistema escrevendo grandes quantidades de dados. Remediação: Revise os níveis de log da aplicação. Considere armazenar logs em buffer ou usar uma solução de log remota (como Syslog ou stack ELK) para reduzir as escritas no disco local.

4. Falha ou Má Configuração de Disco

Sintoma: Tempos await extremamente altos que não se correlacionam com alto throughput, ou padrões estranhos de leitura/escrita. Isso pode indicar hardware com falha ou configuração RAID incorreta. Remediação: Verifique os dados SMART (smartctl) para a saúde do disco. Se estiver usando RAID, verifique o status do array.

5. Sistema de Arquivos ou Opções de Montagem

Sintoma: A latência aparece em torno de cargas de trabalho pesadas em metadados: criar muitos arquivos pequenos, excluir diretórios, rotacionar logs ou descompactar arquivos.

Remediação: Verifique o tipo de sistema de arquivos, opções de montagem, uso de inodes e comportamento do journal. Um sistema de arquivos cheio, inodes esgotados ou um volume thin-provisioned quase cheio podem parecer um problema de latência de I/O do lado da aplicação.

df -h
df -ih
findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS

Se o uso de inodes estiver em 100%, deletar um arquivo gigante não ajudará. Você precisa remover muitos arquivos pequenos ou mover essa carga de trabalho para um layout de sistema de arquivos projetado para isso.

Melhores Práticas para Monitoramento Proativo

Prevenir gargalos de I/O é melhor do que corrigi-los reativamente. Implemente monitoramento contínuo:

  • Defina Alertas: Configure ferramentas de monitoramento para alertar sobre mudanças sustentadas na latência do disco, profundidade da fila, I/O wait, plenitude do sistema de arquivos e contadores de erro. Use limites que correspondam à sua classe de armazenamento e carga de trabalho, em vez de copiar um número universal.
  • Linha de Base de Desempenho: Saiba como é a latência de I/O "normal" para sua carga de trabalho específica. Isso torna as anomalias mais fáceis de detectar.
  • Entenda o Tipo de Carga de Trabalho: Padrões de I/O aleatórios (comuns em bancos de dados) causam latência muito maior do que I/O sequencial (comum em streaming de mídia ou leitura de arquivos grandes).

As melhores investigações de latência de disco continuam estreitando a pergunta: qual dispositivo, qual sistema de arquivos, qual processo, qual carga de trabalho e qual mudança recente? Depois de ter essa cadeia, a correção geralmente é mais clara. Você para de ajustar configurações do kernel aleatoriamente e começa a mudar a agenda de backup, adicionar memória, reparar armazenamento, corrigir uma consulta ou mover uma carga de trabalho ruidosa para longe de um disco compartilhado.