Como confirmar se o disco da VPS é NVMe no Linux
Veja por que o erro “NVMe não aparece” ocorre na VPS e confirme o disco com lsblk, sysfs, nvme-cli e um teste fio de latência limitado.
Verificar um disco NVMe no Linux em quatro passos
Para verificar um disco NVMe numa VPS Linux, execute quatro verificações pela ordem indicada: lsblk para obter o nome do dispositivo, a flag rotational no sysfs para confirmar se o suporte é rotativo, nvme list para confirmar a existência de um controlador NVMe real e uma execução breve de fio para obter o único valor que o host não consegue falsificar. As três primeiras verificações demoram cerca de um segundo cada. A última resolve a questão, porque, na maioria das plataformas VPS, o hypervisor oculta o disco físico do sistema convidado.
NVMe (non-volatile memory express) é o protocolo utilizado pelo armazenamento flash através das ligações PCIe (peripheral component interconnect express). Substituiu o percurso SATA e AHCI, concebido para discos rotativos, e é rápido porque elimina um gargalo de filas entre a CPU e o armazenamento flash. Dentro de uma máquina virtual, raramente comunica diretamente com esse protocolo. Comunica com um disco virtual que o host prepara, por isso o nome do dispositivo no sistema convidado identifica um driver, não o suporte físico instalado no rack.
Passo 1: o que o lsblk mostra?
lsblk lê a lista de dispositivos de bloco do kernel. O sinalizador -d oculta as partições, para que seja apresentada uma linha por disco.
lsblk -d -o NAME,ROTA,SIZE,TYPE,TRAN,MODELUm KVM VPS normalmente responde assim:
NAME ROTA SIZE TYPE TRAN MODEL
vda 0 80G diskTrês padrões de nomes abrangem praticamente todos os servidores Linux:
nvme0n1é o namespace 1 no controlador NVMe 0. O seu guest usa um dispositivo NVMe, real ou emulado.sdaé a camada SCSI. Os discos SATA e SAS reais aparecem aqui, assim como o driver virtio-scsi.vdaé virtio-blk, o driver paravirtualizado de blocos que a maioria dos hosts KVM usa por predefinição.
A coluna TRAN (transporte) apresenta nvme para um dispositivo NVMe e sata para um disco SATA que o guest consegue ver diretamente. Normalmente fica vazia com virtio-blk, porque não existe um transporte físico que o guest possa comunicar. MODEL fica vazia pela mesma razão. Uma cadeia de modelo vazia num VPS é normal e não fornece informações sobre o hardware.
Etapa 2: excluir um disco magnético
DISK=$(lsblk -dno NAME,TYPE | awk '$2 == "disk" { print $1; exit }')
echo "checking $DISK"
cat "/sys/block/$DISK/queue/rotational"
readlink -f "/sys/block/$DISK"O ficheiro rotational contém 1 quando o kernel considera que o dispositivo tem pratos magnéticos rotativos e 0 nos restantes casos. Em bare metal, o valor vem da unidade. Com virtio-blk, vem de um bit de funcionalidade definido pelo host. Por isso, um 0 exclui um disco rígido convencional, mas não prova mais nada. Leia-o na mesma: um 1 num plano vendido como armazenamento SSD é uma contradição inequívoca, e é a única captura de ecrã contra a qual o suporte não pode argumentar.
readlink -f resolve o symlink de sysfs e mostra o barramento ao qual o dispositivo está ligado:
/sys/devices/pci0000:00/0000:00:05.0/virtio2/block/vdaA palavra virtio nesse caminho é a resposta para esta etapa. Um dispositivo NVMe apresenta um caminho que contém nvme, como /sys/devices/pci0000:00/0000:01:00.0/nvme/nvme0/nvme0n1, e um disco ATA ligado diretamente apresenta um caminho que contém ata1. Este é o mesmo facto apresentado por lsblk, obtido diretamente do kernel em vez de uma coluna formatada. Isso é útil quando o campo TRAN está vazio.
Etapa 3: consultar o nvme-cli e o barramento PCI
sudo apt update
sudo apt install -y nvme-cli pciutils
sudo nvme list || echo "nvme-cli found no NVMe device"
lspci | grep -i -e nvme -e 'non-volatile' || echo "no NVMe controller on this guest's PCI bus"nvme list mostra uma linha por namespace, com o número de série do controlador, a string do modelo e a revisão do firmware. Uma tabela vazia significa que nenhum dispositivo NVMe está exposto ao seu guest. Se lspci não mostrar nenhuma linha correspondente, isso indica o mesmo do outro lado: o barramento PCI virtual visível para o seu guest não transporta nenhum controlador NVMe. Ambos os resultados vazios são normais numa VPS virtio e nenhum deles prova que o host não tem unidades NVMe.
Se aparecer um namespace, o nvme-cli fornece mais informações. sudo nvme id-ctrl /dev/nvme0 mostra a identidade do controlador, e sudo nvme smart-log /dev/nvme0n1 mostra a temperatura, as horas de funcionamento e a percentagem da resistência nominal de escrita já utilizada. Execute esses comandos apenas quando nvme list tiver listado efetivamente um dispositivo, porque ambos precisam de abrir um nó /dev/nvme* real.
Por que um host realmente NVMe ainda mostra /dev/vda
O hypervisor decide qual modelo de dispositivo o guest vê, e essa escolha é independente do meio de armazenamento subjacente. Há 3 configurações comuns.
- virtio-blk ou virtio-scsi sobre um ficheiro, um volume lógico ou um dataset ZFS alojado em unidades NVMe. É apresentado
vdaousda. O armazenamento é NVMe. O guest não tem forma de saber isso. - Um controlador NVMe emulado à frente de qualquer armazenamento. É apresentado
nvme0n1mesmo quando os dados ficam numa matriz SATA ou num volume de rede a 2 racks de distância. - PCIe passthrough, em que o host atribui um controlador físico a um guest. É apresentado um
nvme0n1real, com uma cadeia de modelo real. Isto é raro nos planos VPS partilhados, porque a placa fica dedicada a esse cliente.
Por isso, o nome do dispositivo pode induzir em erro nos 2 sentidos. Além disso, o host pode colocar uma cache write-back, uma camada RAID ou um volume de rede replicado entre as suas escritas e a memória flash. Cada uma dessas camadas altera o desempenho obtido sem alterar um único nome em /sys. É por isso que o nome é o ponto de partida, não o ponto final. Se ainda estiver a escolher um plano, a diferença entre armazenamento NVMe e SSD SATA explica quanto vale realmente pagar por cada nível.
O teste honesto é a latência, por isso meça-a
O fio (flexible I/O tester) faz leituras reais num ficheiro real e indica quanto tempo demorou cada uma. As leituras aleatórias pequenas são a carga de trabalho adequada neste caso, porque expõem a viagem de ida e volta até ao suporte de armazenamento e não podem ser servidas pelo read-ahead.
Primeiro, crie o ficheiro de teste e confirme que este sistema de ficheiros aceita I/O sem buffer. --direct=1 abre o ficheiro com O_DIRECT, ignorando a page cache. Sem essa opção, mede a sua própria RAM e obtém valores que nenhum disco consegue produzir.
sudo apt install -y fio
fio --name=prep --filename=/var/tmp/nvme-check.tmp --size=256M --bs=1M --rw=write --direct=1 --end_fsync=1 > /dev/null \
&& echo "unbuffered writes work here, the timing test is valid" \
|| echo "this filesystem refuses direct=1, so the timing test below will not run"Se isso tiver apresentado a recusa, o caminho escolhido está num sistema de ficheiros sem suporte para O_DIRECT. Os sistemas de ficheiros overlay de contentores e alguns sistemas de ficheiros de rede comportam-se desta forma. Escolha um diretório no sistema de ficheiros raiz da VPS e tente novamente. Se tiver apresentado sucesso, execute a medição:
fio --name=randread4k --filename=/var/tmp/nvme-check.tmp --bs=4k --rw=randread \
--direct=1 --iodepth=1 --numjobs=1 --runtime=20 --time_based --group_reporting \
|| echo "fio stopped early, read its first line for the reason"
rm -f /var/tmp/nvme-check.tmpA execução tem limites definidos de propósito: um job, profundidade de fila 1, vinte segundos e 256 MB de dados. Não vai encher o disco nem fazer com que seja sinalizado por abuso. A profundidade de fila 1 também é a configuração correta para esta questão, porque filas profundas permitem que um dispositivo lento oculte a sua latência através do paralelismo, enquanto a latência continua elevada.
Leitura da saída do fio
Duas linhas são importantes. A linha de resumo tem o formato read: IOPS=9012, BW=35.2MiB/s e, abaixo dela, o fio apresenta um bloco clat. clat é a latência de conclusão: o tempo entre o fio submeter uma leitura e o kernel devolver os dados. Leia o valor avg e, em seguida, o percentil 99.00th na lista clat percentiles. A média indica a classe de armazenamento. O percentil 99 indica com que frequência outro utilizador no mesmo host faz com que tenha de esperar.
O fio apresenta a latência em microssegundos quando os valores são pequenos e muda para milissegundos quando deixam de o ser. Confirme a unidade na linha anterior antes de comparar os valores.
Quais números distinguem a classe NVMe da classe SATA
Os valores abaixo são valores publicados típicos para leituras aleatórias 4k de uma única tarefa, com profundidade de fila 1, recolhidos na documentação dos fabricantes e em benchmarks da comunidade até agosto de 2026. São intervalos para comparação, não medições do seu servidor.
The data behind this chart
[
{
"label": "Local NVMe",
"avg_latency_us": 110
},
{
"label": "Local SATA SSD",
"avg_latency_us": 320
},
{
"label": "Network block storage",
"avg_latency_us": 900
}
]The data behind this chart
[
{
"label": "Local NVMe",
"iops": "9,000"
},
{
"label": "Local SATA SSD",
"iops": "3,100"
},
{
"label": "Network block storage",
"iops": "1,100"
}
]Um volume NVMe local responde a uma leitura aleatória 4k em aproximadamente 110 microssegundos e atinge cerca de 9,000 IOPS com profundidade de fila 1. Um SSD SATA local fica perto de 320 microssegundos e 3,100 IOPS. O armazenamento de blocos ligado à rede fica normalmente perto de 900 microssegundos e 1,100 IOPS, porque cada leitura atravessa um salto de rede antes de qualquer acesso à memória flash.
Com profundidade de fila 1, essas duas colunas expressam o mesmo facto de formas diferentes: uma leitura de cada vez significa que o débito é simplesmente o inverso da latência. Se a sua média estiver mais próxima de 110 do que de 320 microssegundos, está perante armazenamento da classe NVMe, independentemente do nome que lsblk tenha atribuído ao dispositivo. Se estiver mais próxima de 900 microssegundos, existe no caminho algo mais lento do que a memória flash local, e a palavra NVMe na página do pedido descreve as unidades do host, não o seu volume.
Execute-o mais do que uma vez antes de reclamar
Uma execução é uma amostra, não um resultado. Um VPS partilha os discos, por isso um vizinho com muita carga pode duplicar a sua latência durante dez minutos e depois deixar de o fazer. Algumas plataformas também atribuem créditos de burst, o que faz com que os primeiros minutos de qualquer teste pareçam excelentes. Execute o mesmo comando três ou quatro vezes em horas diferentes do dia e compare o pior resultado, não o melhor. Uma execução anormal isolada pode ser apenas uma variação temporária. Um padrão é uma falha que justifica abrir um pedido de suporte, e o pedido terá mais força com três resultados de fio com marca temporal anexados. Para uma visão mais ampla, que inclua CPU e rede além do disco, uma execução completa de benchmark do VPS aplica a mesma disciplina aos outros subsistemas.
O que fazer com o resultado
Se a latência estiver na faixa de NVMe, deixe de se preocupar com o nome do dispositivo e avance. vda não representa uma degradação. É o driver de disco virtual mais rápido que a maioria dos hosts oferece e é o que deve usar.
Se a latência estiver na faixa do armazenamento de rede num plano vendido como NVMe local, terá uma reclamação específica e reproduzível: o comando fio exato, a latência média de conclusão e os horários em que executou o teste. Isso justifica um pedido de suporte, não uma discussão num fórum. Antes de o enviar, confirme que o disco não está simplesmente cheio nem muito fragmentado e que nenhum processo no servidor está a fazer muitas gravações durante o teste.
Execute esta verificação no dia em que aprovisionar o servidor, e não apenas quando algo parecer lento. Assim, terá uma linha de base para comparar mais tarde. A verificação enquadra-se naturalmente nos primeiros dez minutos num VPS novo, juntamente com a configuração da firewall e das chaves SSH. Se a distinção entre os níveis de armazenamento ainda não estiver clara, o que um VPS com SSD oferece explica os fundamentos desta questão.
FAQ
Por que o lsblk mostra /dev/vda quando o meu host anuncia NVMe?
Porque vda identifica o controlador virtio-blk no seu guest, não o hardware no host. Um hypervisor KVM apresenta um dispositivo de bloco paravirtualizado suportado por um ficheiro, um volume lógico ou um dataset. Esse armazenamento de suporte pode estar em unidades NVMe sem que o guest tenha acesso a essa informação. O nome descreve a camada de virtualização. Apenas uma medição de latência descreve o suporte de armazenamento.
O valor rotational 0 prova que tenho um disco NVMe?
Não. /sys/block/<dev>/queue/rotational com o valor 0 significa que o kernel não considera que o dispositivo tenha pratos magnéticos em rotação. Em virtio, esse valor é definido por um bit de funcionalidade escolhido pelo host. Isto exclui um disco rígido comum. Não permite distinguir NVMe de um SSD SATA nem armazenamento flash local de um volume de rede. Um 1 continua a justificar uma verificação, porque contradiz qualquer plano apresentado como armazenamento de estado sólido.
Por que o nvme list está vazio no meu VPS?
Porque nenhum controlador NVMe é exposto ao seu guest. nvme list e lspci leem o que a máquina virtual consegue ver. Um disco virtio-blk ou virtio-scsi não apresenta nenhum controlador NVMe para enumeração. Uma tabela vazia é o resultado normal na maioria dos planos VPS e não prova que o host não tenha unidades NVMe. Instale o nvme-cli com sudo apt install -y nvme-cli e espere uma tabela vazia, exceto se tiver sido feito passthrough de um controlador.
Que resultado do fio corresponde a armazenamento de classe NVMe?
Com queue depth 1, leituras aleatórias de 4k e --direct=1, uma latência média de conclusão próxima de 110 microssegundos corresponde à classe NVMe, e dela resultam aproximadamente 9,000 IOPS. Cerca de 320 microssegundos aponta para um SSD SATA. Cerca de 900 microssegundos aponta para armazenamento ligado à rede, em que cada leitura atravessa um salto de rede. Estes são intervalos publicados típicos para agosto de 2026. Compare, por isso, as ordens de grandeza em vez dos valores exatos. Repita o teste em horários diferentes antes de tirar uma conclusão.