SSD Nodes Learn 🎉 VPS từ $4.99/tháng
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-07

Cách kiểm tra VPS có thật sự dùng NVMe trên Linux

Kiểm tra VPS từ guest bằng lsblk, sysfs, nvme-cli và fio. Tìm lỗi virtio che giấu đĩa vật lý, rồi đo latency trong một lượt chạy giới hạn.

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

Xác minh đĩa NVMe trên Linux trong bốn bước

Để xác minh một đĩa NVMe trên Linux VPS, hãy thực hiện lần lượt bốn kiểm tra: lsblk để xác định tên thiết bị, cờ rotational trong sysfs để kiểm tra thiết bị có phải loại dùng đĩa quay hay không, nvme list để xác minh đây là controller NVMe thật, và chạy fio trong thời gian ngắn để kiểm tra con số duy nhất mà nhà cung cấp không thể che giấu. Ba bước đầu chỉ mất khoảng một giây mỗi bước. Bước cuối sẽ giải đáp vấn đề, vì trên hầu hết nền tảng VPS, hypervisor ẩn đĩa vật lý khỏi guest.

NVMe (non-volatile memory express) là giao thức mà bộ nhớ flash sử dụng qua các lane PCIe (peripheral component interconnect express). Giao thức này thay thế đường truyền SATA và AHCI vốn được thiết kế cho ổ đĩa quay. NVMe nhanh vì loại bỏ điểm nghẽn xếp hàng giữa CPU và bộ nhớ flash. Bên trong máy ảo, bạn hiếm khi giao tiếp trực tiếp với giao thức đó. Bạn giao tiếp với một đĩa ảo do host tạo sẵn, nên tên thiết bị trong guest mô tả driver chứ không mô tả loại lưu trữ vật lý trong rack.

Bước 1: lsblk hiển thị gì?

lsblk đọc danh sách thiết bị block của kernel. Flag -d ẩn các partition, vì vậy bạn thấy một dòng cho mỗi disk.

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

KVM VPS thường hiển thị như sau:

NAME ROTA  SIZE TYPE TRAN MODEL
vda     0   80G disk

Ba mẫu tên này bao quát gần như mọi Linux server:

  • nvme0n1 là namespace 1 trên NVMe controller 0. Guest của bạn đang dùng thiết bị NVMe, có thể là thiết bị thật hoặc được mô phỏng.
  • sda là lớp SCSI. Disk SATA và SAS thật sẽ xuất hiện ở đây, cũng như thiết bị dùng driver virtio-scsi.
  • vda là virtio-blk, driver block paravirtual mà hầu hết KVM host sử dụng mặc định.

Cột TRAN (transport) hiển thị nvme cho thiết bị NVMe và sata cho disk SATA mà guest có thể thấy trực tiếp. Cột này thường để trống với virtio-blk vì guest không có transport vật lý để báo cáo. MODEL cũng để trống vì cùng lý do. Chuỗi model trống trên VPS là bình thường và không cho bạn biết gì về phần cứng.

Bước 2: loại trừ ổ đĩa quay

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"

File rotational chứa 1 khi kernel xác định thiết bị dùng platter quay và 0 cho mọi thiết bị khác. Trên bare metal, giá trị này đến từ ổ đĩa. Với virtio-blk, giá trị này đến từ một feature bit do host thiết lập, vì vậy 0 loại trừ ổ cứng thông thường nhưng không chứng minh được điều gì khác. Vẫn hãy đọc giá trị này: 1 trong một gói được bán là bộ nhớ solid state là một mâu thuẫn rõ ràng, và đây là ảnh chụp màn hình duy nhất mà bộ phận hỗ trợ không thể bác bỏ.

readlink -f phân giải symlink trong sysfs và in ra bus mà thiết bị kết nối vào:

/sys/devices/pci0000:00/0000:00:05.0/virtio2/block/vda

Từ virtio trong path đó, bạn có câu trả lời cho bước này. Thiết bị NVMe sẽ có path chứa nvme, chẳng hạn /sys/devices/pci0000:00/0000:01:00.0/nvme/nvme0/nvme0n1, còn ổ ATA gắn trực tiếp sẽ có path chứa ata1. Đây là cùng thông tin mà lsblk đã in ra, nhưng lấy trực tiếp từ kernel thay vì từ một cột đã được format, hữu ích khi field TRAN bị trống.

Bước 3: truy vấn nvme-cli và bus 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 in một dòng cho mỗi namespace, kèm số serial, chuỗi model và phiên bản firmware của controller. Bảng trống nghĩa là guest của bạn không được cung cấp thiết bị NVMe nào. lspci không in ra dòng khớp nào cũng cho cùng kết luận theo hướng ngược lại: bus PCI ảo mà guest nhìn thấy không có controller NVMe. Cả hai kết quả trống đều là bình thường trên VPS dùng virtio và không kết quả nào chứng minh host không có ổ NVMe.

Nếu có namespace xuất hiện, nvme-cli có thể kiểm tra sâu hơn. sudo nvme id-ctrl /dev/nvme0 in thông tin nhận dạng của controller, còn sudo nvme smart-log /dev/nvme0n1 in nhiệt độ, số giờ đã bật nguồn và phần trăm dung lượng ghi định mức đã sử dụng. Chỉ chạy các lệnh đó khi nvme list thực sự liệt kê một thiết bị, vì cả hai lệnh đều cần mở một node /dev/nvme* thực tế.

Vì sao host thực sự dùng NVMe vẫn hiển thị /dev/vda

Hypervisor quyết định guest của bạn nhìn thấy model thiết bị nào. Lựa chọn đó độc lập với loại storage bên dưới. Có 3 kiểu triển khai phổ biến.

  • virtio-blk hoặc virtio-scsi chạy trên một file, logical volume hoặc ZFS dataset nằm trên các ổ NVMe. Bạn sẽ thấy vda hoặc sda. Storage bên dưới là NVMe. Guest không có cách nào biết được điều đó.
  • Một controller NVMe được emulation ở phía trước bất kỳ loại storage nào. Bạn sẽ thấy nvme0n1, kể cả khi dữ liệu thực tế nằm trên một SATA array hoặc network volume cách đó 2 rack.
  • PCIe passthrough, trong đó host chuyển một controller vật lý cho riêng một guest. Bạn sẽ thấy nvme0n1 thực sự cùng chuỗi model thực. Cách này hiếm trên các gói shared VPS vì card đó sẽ được dành riêng cho một khách hàng.

Vì vậy, tên thiết bị có thể gây hiểu nhầm theo cả 2 hướng. Tệ hơn, host có thể đặt write-back cache, RAID layer hoặc replicated network volume giữa thao tác ghi của bạn và flash. Mỗi lớp này đều có thể thay đổi hiệu năng bạn nhận được mà không thay đổi bất kỳ tên nào trong /sys. Vì vậy, tên thiết bị là điểm bắt đầu, không phải điểm kết thúc. Nếu bạn vẫn đang chọn một gói, sự khác nhau giữa storage NVMe và SATA SSD giải thích giá trị thực tế của từng tier.

Đo latency mới là phép thử chính xác

fio (flexible I/O tester) thực hiện các thao tác đọc thực trên một file thực và báo thời gian của từng thao tác. Các thao tác đọc ngẫu nhiên với kích thước nhỏ là workload phù hợp ở đây. Chúng cho thấy đầy đủ thời gian round trip đến thiết bị lưu trữ và không thể được read-ahead phục vụ.

Trước tiên, hãy tạo file kiểm thử và xác nhận filesystem này chấp nhận unbuffered I/O. --direct=1 mở file bằng O_DIRECT, nhờ đó bỏ qua page cache. Nếu không dùng tùy chọn này, bạn đang đo RAM của chính mình và nhận được những con số mà không ổ đĩa nào có thể tạo ra.

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"

Nếu lệnh in ra thông báo từ chối, path bạn chọn nằm trên filesystem không hỗ trợ O_DIRECT. Container overlay filesystem và một số network filesystem hoạt động theo cách này. Hãy chọn một directory trên root filesystem của VPS rồi thử lại. Nếu lệnh in ra thông báo thành công, hãy chạy phép đ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

Lần chạy này được giới hạn có chủ đích: một job, queue depth bằng 1, chạy trong twenty seconds và sử dụng 256 MB dữ liệu. Lệnh sẽ không làm đầy disk và cũng không khiến bạn bị đánh dấu là abuse. Queue depth bằng 1 cũng là thiết lập trung thực cho câu hỏi này, vì queue sâu cho phép thiết bị chậm che giấu latency bằng tính song song trong khi latency vẫn cao.

Đọc output của fio

Có 2 dòng cần chú ý. Dòng tóm tắt có dạng read: IOPS=9012, BW=35.2MiB/s. Bên dưới là block clat do fio in ra. clat là độ trễ hoàn tất: khoảng thời gian từ lúc fio gửi yêu cầu đọc đến lúc kernel trả dữ liệu về. Đọc giá trị avg, sau đó đọc percentile 99.00th trong danh sách clat percentiles. Giá trị trung bình cho biết loại storage. Percentile 99 cho biết tần suất một tenant khác trên cùng host khiến bạn phải chờ.

Fio hiển thị độ trễ theo microsecond khi giá trị nhỏ và chuyển sang millisecond khi giá trị lớn hơn. Kiểm tra unit trên dòng đó trước khi so sánh.

Các con số nào phân biệt nhóm NVMe với nhóm SATA

Các giá trị dưới đây là những mức điển hình được công bố cho workload đọc ngẫu nhiên 4k, một job duy nhất, queue depth 1. Các giá trị này được tổng hợp từ tài liệu của nhà cung cấp và benchmark cộng đồng tính đến tháng 8 năm 2026. Đây là các khoảng để đối chiếu, không phải số đo từ server của bạn.

ChartTypical 4k random read latency at queue depth 1, by storage class
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
  }
]
ChartTypical 4k random read IOPS at queue depth 1, by storage class
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"
  }
]

Một volume NVMe cục bộ phản hồi một lần đọc ngẫu nhiên 4k trong khoảng 110 microsecond và đạt khoảng 9,000 IOPS ở queue depth 1. SSD SATA cục bộ thường ở khoảng 320 microsecond và 3,100 IOPS. Block storage gắn qua mạng thường ở khoảng 900 microsecond và 1,100 IOPS, vì mỗi lần đọc phải đi qua một network hop trước khi truy cập đến flash.

Ở queue depth 1, hai cột đó chỉ diễn đạt cùng một thực tế theo hai cách: mỗi lần chỉ có một lần đọc, nên throughput đơn giản là 1 chia cho latency. Nếu giá trị trung bình của bạn gần 110 microsecond hơn 320 microsecond, storage của bạn thuộc nhóm NVMe, bất kể lsblk gọi thiết bị đó là gì. Nếu giá trị này gần 900 microsecond hơn, trên đường xử lý đang có thành phần chậm hơn flash cục bộ; từ NVMe trên trang đặt hàng đang mô tả các drive của host, không phải volume của bạn.

Chạy nhiều hơn một lần trước khi phàn nàn

Một lần chạy chỉ là mẫu đo, chưa phải kết quả. VPS dùng chung ổ đĩa, nên một máy thuê cùng máy chủ đang bận có thể làm độ trễ của bạn tăng gấp đôi trong mười phút rồi biến mất. Một số nền tảng cũng cấp burst credit, khiến những phút đầu của bất kỳ bài kiểm tra nào trông rất tốt. Hãy chạy cùng một lệnh ba hoặc bốn lần vào các thời điểm khác nhau trong ngày và so sánh kết quả tệ nhất, không phải kết quả tốt nhất. Một lần chạy xấu chỉ là biến động nhất thời. Một xu hướng lặp lại là lỗi đáng để gửi support ticket, và ticket sẽ thuyết phục hơn nếu đính kèm ba output của fio có timestamp. Để có bức tranh đầy đủ hơn, bao gồm cả CPU và network bên cạnh disk, một lần benchmark VPS đầy đủ áp dụng cùng nguyên tắc cho các subsystem khác.

Cần làm gì với kết quả

Nếu độ trễ nằm trong dải NVMe, hãy bỏ qua tên thiết bị và tiếp tục. vda không phải là lựa chọn kém hơn. Đây là driver đĩa ảo nhanh nhất mà hầu hết host cung cấp, và đó là lựa chọn bạn cần.

Nếu độ trễ nằm trong dải storage qua network trong khi gói dịch vụ được bán là NVMe cục bộ, bạn có một nhận định cụ thể và có thể tái hiện: lệnh fio chính xác, độ trễ hoàn tất trung bình và thời điểm bạn chạy lệnh. Đây là nội dung để tạo support ticket, không phải tranh luận trên forum. Trước khi gửi, hãy xác nhận disk không chỉ đơn giản là đã đầy hoặc bị phân mảnh nghiêm trọng. Đồng thời xác nhận không có tiến trình nào trên máy đang ghi dữ liệu với tải cao trong lúc bạn kiểm tra.

Hãy chạy kiểm tra này ngay trong ngày provision VPS, không phải đợi đến khi có cảm giác máy chạy chậm. Như vậy, bạn có baseline để so sánh về sau. Việc này phù hợp với 10 phút đầu tiên khi thiết lập một VPS mới, cùng với việc cấu hình firewall và SSH keys. Nếu bạn vẫn chưa phân biệt rõ các tier storage, VPS SSD thực sự cung cấp cho bạn những gì sẽ giải thích phần nền tảng của vấn đề này.

FAQ

Tại sao lsblk hiển thị /dev/vda khi nhà cung cấp quảng cáo NVMe?

vda đặt tên cho driver virtio-blk trong guest của bạn, không phải phần cứng trên host. Hypervisor KVM cung cấp một block device paravirtual được hậu thuẫn bởi file, logical volume hoặc dataset. Kho lưu trữ phía sau đó có thể nằm trên các ổ NVMe mà guest không thể biết. Tên này mô tả lớp ảo hóa. Chỉ phép đo latency mới mô tả loại media.

rotational 0 có chứng minh tôi đang dùng ổ NVMe không?

Không. /sys/block/<dev>/queue/rotational có giá trị 0 nghĩa là kernel không cho rằng device có platter quay. Với virtio, giá trị này do một feature bit mà host chọn. Nó loại trừ hard drive thông thường. Nó không phân biệt được NVMe với SATA SSD, cũng không phân biệt được flash cục bộ với network volume. 1 vẫn đáng được xử lý, vì nó mâu thuẫn với mọi gói dịch vụ được bán là solid state storage.

Tại sao nvme list không hiển thị gì trên VPS của tôi?

Vì guest của bạn không được expose NVMe controller nào. nvme listlspci đều đọc những gì virtual machine có thể nhìn thấy. Disk virtio-blk hoặc virtio-scsi không cung cấp NVMe controller để enumerate. Bảng trống là kết quả bình thường trên hầu hết gói VPS. Nó không chứng minh host không có ổ NVMe. Cài nvme-cli bằng sudo apt install -y nvme-cli và dự kiến bảng vẫn trống, trừ khi một controller được passthrough.

Kết quả fio nào được xem là storage cấp NVMe?

Ở queue depth 1, với random read 4k và --direct=1, completion latency trung bình gần 110 microseconds là cấp NVMe. Từ đó suy ra khoảng 9,000 IOPS. Mức khoảng 320 microseconds thường chỉ ra SATA SSD. Mức khoảng 900 microseconds thường chỉ ra network attached storage, trong đó mỗi lần đọc phải đi qua một network hop. Đây là các khoảng điển hình được công bố cho tháng 8 năm 2026. Vì vậy, hãy so sánh theo bậc độ lớn thay vì các con số chính xác. Hãy chạy lại phép đo vào các thời điểm khác nhau trước khi kết luận.