A armadilha do PCIe ASPM: resolvendo timeouts de QID em SSDs NVMe no Linux

      Roberto Uchoa 8 min de leitura
      A armadilha do PCIe ASPM: resolvendo timeouts de QID em SSDs NVMe no Linux

      Servidor travando com erros de NVMe no dmesg? Descubra como o gerenciamento de energia PCIe ASPM causa timeouts de QID e aprenda a desativar essa armadilha no Linux.

      Compartilhar:

      São três da manhã e o alerta do sistema de monitoramento grita na sua tela. O banco de dados travou, a latência disparou e o servidor de storage está em pânico. Você abre o terminal, digita um comando básico para ler os logs do kernel e vê uma enxurrada de texto vermelho. O seu caríssimo disco NVMe simplesmente decidiu tirar uma soneca no meio de uma transação crítica de I/O.

      Bem-vindo ao maravilhoso mundo do gerenciamento de energia moderno. Um lugar onde economizar meio watt de eletricidade no datacenter custa a integridade do seu sistema de arquivos e a sua paz de espírito. O culpado quase sempre tem nome e sobrenome: Active-State Power Management, ou simplesmente ASPM.

      Resumo em 30 segundos

      • Erros de nvme controller is down no Linux geralmente são causados pelo PCIe ASPM tentando economizar energia de forma agressiva.

      • O disco entra no estado de suspensão profunda L1.2 e não consegue acordar a tempo para processar a fila de comandos do host.

      • A solução definitiva é forçar o estado ativo permanente desativando o ASPM diretamente nos parâmetros do kernel via GRUB.

      O dmesg sangrando erros e a latência bizarra

      Quando um servidor de storage começa a falhar por causa do ASPM, o sintoma não é sutil. O log do kernel Linux, acessível via dmesg, começa a vomitar mensagens aterrorizantes. Você verá linhas indicando nvme: controller is down; will reset seguidas por timeouts de QID (Queue Identifier).

      O que está acontecendo nos bastidores é uma falha de comunicação patética. O driver NVMe do Linux envia um comando de leitura ou gravação para a fila de submissão do disco. O tempo passa. O limite de timeout padrão do kernel (geralmente 30 segundos) é atingido. Como o disco não respondeu, o kernel assume que o hardware morreu e tenta um reset forçado no controlador PCIe.

      ⚠️ Perigo: Ignorar esses timeouts de QID e deixar o kernel ficar resetando o controlador NVMe em loop resulta em corrupção silenciosa de dados, travamento do hypervisor ou perda total do pool ZFS.

      O disco não está quebrado. Ele apenas foi instruído pela placa-mãe a dormir profundamente e agora está grogue demais para acordar a tempo de atender o telefone.

      A transição de estado L1.2 do PCIe e o despertar que nunca acontece

      Para entender a falha, precisamos olhar para o padrão PCI-SIG. O ASPM foi criado para reduzir o consumo de energia dos links PCIe quando não há tráfego de dados. Ele define vários estados de energia. O estado L0 é o link totalmente ativo. O problema começa quando entramos nos sub-estados L1, especificamente o L1.2.

      No estado L1.2, os circuitos de alta velocidade do link PCIe são fisicamente desligados. A tensão cai. É uma hibernação profunda. Quando um novo pacote de I/O chega, o link precisa ser renegociado, os relógios sincronizados e a energia restaurada. Isso é chamado de latência de saída (exit latency).

      Em teoria, essa transição leva microssegundos. Na prática, a combinação de firmwares de placas-mãe mal codificados, controladores NVMe baratos e o driver do Linux cria um gargalo. O disco demora milissegundos a mais do que o esperado para acordar. O kernel perde a paciência, declara o disco morto e derruba a conexão.

      Representação visual do gargalo de latência quando o link PCIe falha ao sair do estado L1.2 para o L0. Figura: Representação visual do gargalo de latência quando o link PCIe falha ao sair do estado L1.2 para o L0.

      Como a imagem ilustra, o tráfego de dados se acumula enquanto o link tenta sair do estado de suspensão. Em ambientes de banco de dados ou virtualização de alta densidade, esse atraso é fatal.

      Por que atualizar firmware do SSD e trocar cabo riser não resolve a falha

      Se você abrir um chamado no suporte do fabricante do servidor, o roteiro do nível 1 será previsível. Eles vão mandar você atualizar a BIOS. Depois, vão mandar atualizar o firmware do SSD NVMe. Quando isso falhar, vão enviar um técnico para trocar a placa-mãe ou o cabo riser PCIe.

      Você vai perder semanas de janela de manutenção e o problema vai voltar. Por quê? Porque o hardware está funcionando exatamente como foi projetado para funcionar. O problema é o próprio design do ASPM sendo aplicado a um ambiente de storage enterprise que exige latência determinística.

      A negociação de energia entre o host e o dispositivo é falha por natureza em cargas de trabalho em rajada (bursty workloads). O link dorme, acorda, dorme e acorda milhares de vezes por segundo. O overhead dessa transição destrói a performance e eventualmente causa o timeout.

      Tabela comparativa: estados de energia do link PCIe

      Para deixar claro o nível de risco que cada estado de energia traz para o seu storage, observe a tabela abaixo. Fica evidente por que servidores sérios não devem sair do estado L0.

      Estado PCIe Descrição Técnica Economia de Energia Latência de Retorno (Wake) Risco de Timeout NVMe
      L0 Link 100% ativo e operante. Nenhuma (Máximo consumo). Zero. Imediato. Nulo. Ideal para Storage.
      L0s Standby leve de direção única. Baixa. Baixíssima (Dezenas de ns). Baixo.
      L1 Standby bidirecional. Clocks ativos. Média. Média (Alguns µs). Moderado.
      L1.2 Suspensão profunda. Clocks desligados. Alta. Altíssima (Dezenas de µs a ms). Crítico. Causa principal de falhas.

      Desativando o ASPM no kernel via grub para forçar o estado L0 permanente

      A única maneira de garantir que seus discos NVMe fiquem acordados e prontos para trabalhar é arrancar o controle de energia das mãos da BIOS e do sistema operacional. Nós fazemos isso forçando o kernel Linux a ignorar o ASPM completamente.

      Acesse o seu servidor e edite o arquivo de configuração do GRUB, geralmente localizado em /etc/default/grub. Você precisa adicionar um parâmetro específico na linha GRUB_CMDLINE_LINUX_DEFAULT.

      Adicione o parâmetro pcie_aspm=off. Isso diz ao kernel para manter todos os links PCIe no estado L0 permanentemente. Salve o arquivo e atualize o bootloader rodando update-grub (ou grub2-mkconfig em sistemas Red Hat). Depois, reinicie o servidor.

      💡 Dica Pro: Em servidores bare-metal de altíssima performance, adicione também o parâmetro nvme_core.default_ps_max_latency_us=0. Isso impede que o próprio protocolo NVMe tente gerenciar estados de energia autônomos (APST), blindando o disco em dupla camada contra suspensões indesejadas.

      Monitorando o lspci e o nvme-cli para provar que o link parou de dormir

      Sysadmins veteranos não confiam em reboots. Nós verificamos. Após o servidor voltar, você precisa provar que o ASPM está realmente morto. A ferramenta certa para isso é o lspci.

      Execute o comando lspci -vv | grep -i aspm como root. Você verá a saída detalhada dos barramentos PCIe. O que você procura é a frase mágica ASPM Disabled nos links que conectam seus controladores NVMe. Se você ainda vir L1 Enabled, algo na sua BIOS está forçando a política por hardware e você precisará desativar o ASPM nas configurações da placa-mãe também.

      Além disso, use o utilitário nvme-cli para verificar as features do próprio disco. Rodando nvme get-feature /dev/nvme0 -f 2, você consulta o gerenciamento de energia autônomo. O valor retornado deve indicar que as transições de estado estão desabilitadas. Com essas duas verificações, seu storage está finalmente seguro.

      O preço oculto dos padrões de fábrica

      Fabricantes de hardware adoram exibir certificações verdes e selos de eficiência energética. Para conseguir esses selos, eles enviam servidores com todas as políticas de economia de energia ativadas por padrão na BIOS e no kernel.

      Para um desktop de escritório, isso é ótimo. Para um servidor de banco de dados rodando ZFS sobre discos NVMe corporativos, é uma bomba-relógio. A estabilidade do link PCIe e a previsibilidade da latência valem infinitamente mais do que os poucos watts economizados no final do mês. Se você gerencia infraestrutura de storage crítica, faça um favor a si mesmo: mate o ASPM antes que ele mate o seu uptime.

      Referências & Leitura Complementar

      • PCI-SIG: PCI Express Base Specification Revision 4.0 (Seção sobre Active-State Power Management).

      • NVM Express: NVMe Base Specification 2.0 (Seção sobre Autonomous Power State Transitions - APST).

      • Kernel.org: Documentação oficial do Linux sobre parâmetros de boot do subsistema PCI (Documentation/admin-guide/kernel-parameters.txt).

      O que significa o erro 'nvme: controller is down; will reset' no Linux? Geralmente indica que o controlador NVMe parou de responder ao host. Em servidores, a causa mais comum é uma falha de transição de energia do PCIe ASPM, onde o disco entra em economia de energia e não consegue 'acordar' a tempo de processar a fila. O kernel perde a paciência e reseta o hardware.
      Desativar o PCIe ASPM vai aumentar muito o consumo de energia do servidor? O aumento é marginal, na casa de poucos watts por disco. Em ambientes de storage enterprise ou servidores de banco de dados, a estabilidade do link PCIe e a latência previsível valem infinitamente mais do que essa economia irrisória de energia. Deixe a economia de energia para os laptops.
      Como verificar se o ASPM está ativo no meu SSD NVMe? Utilize o comando 'lspci -vv | grep -i aspm' como root. Se a saída mostrar 'ASPM L1 Enabled' ou 'L1.2' no barramento do seu NVMe, o gerenciamento de energia está ativo e pode causar instabilidade sob carga. O objetivo é ver 'ASPM Disabled' em todos os links críticos.
      #pcie aspm #nvme linux #qid timeout #latência nvme #troubleshooting storage #dmesg nvme error
      Roberto Uchoa
      Assinatura Técnica

      Roberto Uchoa

      Sysadmin Veterano (Anti-Hype)

      "Sobrevivente da bolha pontocom e do hype do Kubernetes. Troco qualquer arquitetura de microsserviços 'inovadora' por um script bash que funciona sem falhas há 15 anos. Uptime não é opcional."