Marcio Cunha

Disco lento? Como achar gargalos em NVMe no Linux

Aprenda a rastrear latências de filas de NVMe no Linux usando comandos nativos e contadores de desempenho de hardware para eliminar gargalos de armazenamento.

Marcio Cunha•5 min
Também disponível em:EnglishEspañol
Resumo
  • Filas de armazenamento profundas geram filas de espera invisíveis que estouram o tempo de resposta do kernel.
  • Comandos nativos como o blktrace revelam o ciclo exato de vida de cada requisição de leitura e escrita.
  • Contadores de hardware permitem isolar se o limite de desempenho vem do barramento PCIe ou do próprio controlador.
  • Monitores de desempenho ajudam a diagnosticar quando o sistema operacional tenta enviar mais dados do que o disco consegue processar.
  • Ajustar a profundidade das filas no nível do sistema operacional evita saturações repentinas sob alta carga de trabalho.

Por que o disco NVMe trava mesmo com alta velocidade?

Discos NVMe (Non-Volatile Memory Express, um protocolo ultrarrápido para unidades de estado sólido conectado direto ao barramento principal) prometem velocidades incríveis de leitura e escrita, mas sob alta carga eles ainda podem sofrer com lentidão inexplicável. Quando aplicações exigem milhares de operações por segundo, o sistema operacional cria filas de espera para organizar o tráfego de dados. Na prática, isso significa que se o fluxo de entrada for maior do que o dispositivo consegue processar, as requisições começam a se acumular, gerando o que chamamos de latência de fila. É semelhante a um pedágio automatizado que recebe mais carros do que as cancelas conseguem liberar por minuto, criando um congestionamento quilométrico mesmo com pistas modernas. Identificar onde esse tráfego empaca exige ir além dos contadores tradicionais de uso de disco e analisar diretamente como o núcleo do sistema operacional interage com o hardware. Assim como explicamos em nosso artigo sobre como depurar gargalos de memória RAM com o perf no Linux, ferramentas de rastreamento profundo são indispensáveis para revelar gargalos ocultos que afetam o desempenho geral da aplicação.

Como funcionam as filas de E/S no núcleo do Linux

O núcleo do Linux gerencia o armazenamento dividindo as tarefas em filas virtuais que conversam diretamente com os canais físicos do NVMe. Cada requisição gerada por um banco de dados ou por uma aplicação passa por camadas de software antes de virar um sinal elétrico no circuito impresso do disco. Quando o volume de dados explode, essas filas atingem sua capacidade máxima e o sistema precisa pausar novas solicitações até que o hardware libere espaço. Para monitorar esse comportamento em tempo real, podemos recorrer a utilitários nativos que capturam eventos do kernel sem a necessidade de instalar pacotes complexos de terceiros. Acompanhar a evolução dessas métricas ajuda a entender quando o limitador de performance está no software, na controladora do disco ou na própria infraestrutura da placa-mãe, garantindo diagnósticos mais assertivos e correções definitivas.

Rastreando eventos de armazenamento com blktrace

O utilitário blktrace é uma ferramenta poderosa do ecossistema Linux projetada para registrar detalhadamente todas as operações de E/S que entram e saem das camadas de bloco do sistema. Para utilizá-lo na prática e capturar o comportamento do seu disco NVMe sob carga intensa, você pode executar o comando a seguir no terminal. Antes de rodar, substitua nvme0n1 pelo identificador correto da sua unidade:

blktrace -d /dev/nvme0n1 -o - | blkparse -i -

Esse comando monitora em tempo real cada requisição enviada ao disco, mostrando o momento exato em que ela entra na fila, quando é despachada para o hardware e quanto tempo leva para receber a resposta. Na saída gerada, você verá letras como Q (queue), D (dispatch) e C (complete), que formam a linha do tempo completa da operação de disco. Se a distância temporal entre os eventos Q e D for muito alta, significa que o sistema operacional está segurando os dados por falta de recursos na fila interna. Por outro lado, se a demora ocorrer entre D e C, o gargalo reside estritamente na capacidade de processamento do próprio disco NVMe ou no barramento PCIe.

Interpretando os contadores de desempenho de hardware

Além de rastrear o fluxo de software, é fundamental avaliar os contadores de desempenho do próprio controlador NVMe para verificar se o componente físico está operando dentro dos limites seguros de temperatura e largura de banda. Ferramentas como o nvme-cli permitem extrair telemetria avançada diretamente do firmware da unidade de armazenamento, revelando informações vitais que o sistema operacional muitas vezes resume de forma genérica. Para verificar o log de erros e o estado de saúde do dispositivo sob estresse, execute o comando abaixo:

nvme smart-log /dev/nvme0n1

A análise atenta desses registros ajuda a identificar se o controlador está sofrendo com limitações térmicas, conhecidas como thermal throttling, onde o disco reduz drasticamente a velocidade de leitura e escrita para evitar superaquecimento. Em ambientes de alta densidade, monitorar a temperatura e a integridade do hardware evita falhas catastróficas e garante a estabilidade de serviços críticos que dependem de baixa latência contínua. Para cenários onde testes de estresse térmico e elétrico são necessários, vale a pena correlacionar esses dados com análises de consumo energético, conforme discutido em nosso guia sobre como medir consumo real de energia em fontes ATX de servidores.

Ajustando a profundidade das filas para mitigar a latência

Quando identificamos que a latência elevada é causada por saturação nas filas de E/S, uma das abordagens mais eficazes é ajustar o parâmetro de profundidade da fila, conhecido como queue depth. Por padrão, muitos sistemas utilizam valores genéricos que podem não refletir a capacidade real de paralelismo do seu modelo específico de NVMe. Podemos consultar a profundidade atual da fila navegando até o diretório do dispositivo no sistema de arquivos virtual do kernel e ajustando o parâmetro adequado. Para verificar e modificar dinamicamente o número máximo de requisições simultâneas suportadas, utilize as instruções a seguir no terminal:

  1. Navegue até a pasta de configuração do seu dispositivo NVMe no diretório sysfs com o comando cd /sys/block/nvme0n1/queue
  2. Consulte o limite atual de requisições na fila executando o comando cat nr_requests
  3. Altere o valor para um patamar otimizado gravando o novo número desejado com o comando echo 128 > nr_requests

Essa modificação simples reduz o volume de dados acumulados artificialmente pelo sistema operacional, permitindo que o controlador NVMe processe cada lote de requisições com maior agilidade e menor tempo de espera. É importante ressaltar que valores excessivamente altos na profundidade da fila aumentam a latência percebida pelas aplicações, enquanto valores muito baixos podem deixar o hardware ocioso, exigindo testes práticos para encontrar o ponto de equilíbrio ideal para cada carga de trabalho.

Considerações finais sobre o diagnóstico de armazenamento

Depurar gargalos de E/S em ambientes Linux de alta performance exige uma combinação equilibrada de monitoramento de software e análise de telemetria de hardware. Ao dominar ferramentas nativas como blktrace e nvme-cli, engenheiros e administradores ganham a capacidade de enxergar além das métricas superficiais de uso de disco, identificando a raiz exata de qualquer lentidão. Compreender o ciclo de vida das requisições nas filas do kernel transforma a solução de problemas em uma ciência exata, garantindo que suas aplicações alcancem a máxima eficiência e estabilidade operacional sob qualquer volume de carga.