SSD Nodes Learn Hosting plans →
Guias Matt ConnorPor Matt Connor · Atualizado 2026-10-18

Como verificar se o disco da VPS e realmente NVMe

Confirme se o armazenamento e NVMe via lsblk, sysfs e nvme-cli. Saiba por que o virtio mascara o hardware e use o fio para medir a latencia real e validar o desempenho do disco.

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, August 3, 2026.

Verifique um disco NVMe no Linux em quatro passos

Para verificar um disco NVMe numa VPS Linux, execute quatro verificações por ordem: lsblk para o nome do dispositivo, a flag rotational e o caminho do barramento no sysfs, nvme list para um controlador NVMe real, e uma execução curta do fio para o único número que um host não consegue mascarar. As três primeiras levam um segundo cada. A última resolve a questão, porque na maioria das plataformas VPS o hipervisor esconde o disco físico do sistema convidado.

NVMe (non-volatile memory express) é o protocolo que o armazenamento flash utiliza através de vias PCIe (peripheral component interconnect express). Ele substituiu o caminho SATA e AHCI que foi concebido para discos rígidos, e é rápido porque elimina um estrangulamento de filas entre a CPU e a memória flash. Dentro de uma máquina virtual, raramente utiliza esse protocolo. Você comunica com um disco virtual que o host monta para si, por isso o nome do dispositivo no sistema convidado descreve 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. A opção -d oculta as partições, para que seja apresentada uma linha por disco.

lsblk -d -o NAME,ROTA,SIZE,TYPE,TRAN,MODEL

Um KVM VPS normalmente responde assim:

NAME ROTA  SIZE TYPE TRAN   MODEL
vda     1   80G disk virtio

Três padrões de nomes abrangem quase todos os servidores Linux:

  • nvme0n1 é o namespace 1 no controlador NVMe 0. O guest está a utilizar um dispositivo NVMe, real ou emulado.
  • sda é a camada SCSI. Os discos SATA e SAS reais aparecem aqui, assim como o controlador virtio-scsi.
  • vda é virtio-blk, o controlador de blocos paravirtualizado que a maioria dos hosts KVM utiliza 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. Com virtio-blk, as versões atuais do util-linux apresentam virtio. O lsblk infere esse valor a partir do nome do dispositivo vd, enquanto as versões mais antigas deixam o campo vazio. Em qualquer dos casos, não existe um transporte físico que o guest possa comunicar. MODEL fica vazio pelo mesmo motivo. Uma cadeia de modelo vazia num VPS é normal e não fornece informações sobre o hardware.

Passo 2: excluir um disco rotativo

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 rotativos e 0 caso contrário. Em bare metal, o valor vem da unidade. Com virtio-blk, não vem de nenhum sítio: a especificação virtio-blk não tem um bit de funcionalidade para o tipo de suporte ou a velocidade de rotação, e o controlador virtio-blk do Linux marca todos os discos como rotativos. Por isso, um vda normalmente devolve 1 mesmo num host totalmente flash, a menos que alguém o tenha forçado para 0 com uma regra udev. Num sda virtio-scsi, o valor é o que o host tiver configurado. Assim, dentro de uma VPS, este sinalizador não permite confirmar nem excluir a presença de um disco rígido, e um 1, por si só, não justifica abrir um pedido de suporte. O teste fio abaixo é o que responde a essa questão.

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/vda

A palavra virtio nesse caminho é a resposta para este passo. 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 que lsblk mostrou, obtido a partir do kernel em vez de uma coluna formatada, o que é ú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 vda ou sda. O armazenamento é NVMe. O guest não tem forma de saber isso.
  • Um controlador NVMe emulado à frente de qualquer armazenamento. É apresentado nvme0n1 mesmo 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 nvme0n1 real, 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.tmp

A 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

Há duas linhas importantes. A linha de resumo é semelhante a read: IOPS=9012, BW=35.2MiB/s e, abaixo dela, o fio imprime 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 a lentidão dos 1 por cento de leituras mais lentas, que é normalmente onde a contenção num host partilhado aparece primeiro.

O fio apresenta a latência em microssegundos quando os valores são baixos e muda para milissegundos quando deixam de o ser. Confirme a unidade na linha anterior antes de comparar os valores.

Que 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 da documentação dos fabricantes e de benchmarks da comunidade em agosto de 2026. São intervalos para comparação, não medições do seu servidor.

GráficoTypical 4k random read latency at queue depth 1, by storage class
Os dados por trás deste gráfico
[
  {
    "label": "Local NVMe",
    "avg_latency_us": 110
  },
  {
    "label": "Local SATA SSD",
    "avg_latency_us": 320
  },
  {
    "label": "Network block storage",
    "avg_latency_us": 900
  }
]
GráficoTypical 4k random read IOPS at queue depth 1, by storage class
Os dados por trás deste gráfico
[
  {
    "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 próximo de 320 microssegundos e 3,100 IOPS. O armazenamento de blocos ligado pela rede fica próximo de 900 microssegundos e 1,100 IOPS, porque uma leitura que não encontra dados em nenhuma cache do host tem de atravessar a rede antes de chegar à memória flash.

Com profundidade de fila 1, essas duas colunas expressam praticamente o mesmo facto duas vezes: quando há apenas uma leitura em curso, o débito é aproximadamente igual a um dividido pela latência, ficando ligeiramente abaixo desse valor depois de contabilizar a sobrecarga de cada pedido. Se a sua média estiver mais próxima de 110 do que de 320 microssegundos, está a usar armazenamento da classe NVMe, independentemente do nome que lsblk decidiu dar ao dispositivo. Se estiver mais próxima de 900 microssegundos, há algo mais lento do que a memória flash local no caminho ou o host está a limitar os IOPS do volume, algo que hipervisores como o QEMU podem fazer, independentemente do armazenamento subjacente. Em ambos os casos, o volume não está a fornecer latência da classe NVMe, independentemente do que a página de encomenda diz sobre as unidades do host.

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 lsblk mostra /dev/vda quando o meu host anuncia NVMe?

Porque vda identifica o controlador virtio-blk no guest, não o hardware do host. Um hipervisor KVM apresenta um dispositivo de bloco paravirtualizado suportado por um ficheiro, um volume lógico ou um dataset. Esse armazenamento subjacente pode estar em unidades NVMe sem que o guest tenha conhecimento disso. O nome descreve a camada de virtualização. Apenas uma medição de latência descreve o suporte de armazenamento.

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 trata o dispositivo como tendo pratos magnéticos rotativos, mas, dentro de um VPS, isso é uma definição e não uma medição. O virtio-blk não tem um bit de funcionalidade que identifique o tipo de suporte. O controlador Linux virtio-blk comunica 1 para todos os discos, salvo se algo substituir esse valor. Por isso, 0 nesse campo normalmente significa que alguém o definiu manualmente. Não é possível distinguir NVMe de SSD SATA, nem flash local de um volume de rede. Um 1 dentro de um VPS também não prova que existe um disco rígido. Baseie a análise na latência do fio, não neste indicador.

Por que nvme list não mostra resultados no meu VPS?

Porque nenhum controlador NVMe está 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. Isso 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, salvo se tiver sido feito passthrough de um controlador.

Que resultado do fio corresponde a armazenamento da classe NVMe?

Com profundidade de fila 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. Dela resultam aproximadamente 9,000 IOPS. Cerca de 320 microssegundos aponta para um SSD SATA. Cerca de 900 microssegundos aponta para armazenamento ligado à rede, quando as leituras que não estão na cache do host atravessam um salto de rede, ou para um volume ao qual o host aplica limitação de desempenho. Estes são intervalos típicos publicados para agosto de 2026. Compare ordens de grandeza em vez de valores exatos. Repita o teste em horários diferentes antes de tirar uma conclusão.

Este artigo foi útil?