SSD Nodes Learn 🎉 VPS $5.50/月起
指南 Matt Connor作者: Matt Connor · 已更新 2026-08-13

Linux VPS 如何確認磁碟是否真的為 NVMe

主機聲稱使用 NVMe,不代表 guest 看得到實體硬體。用 lsblk、sysfs、nvme-cli 與受限 fio 延遲測試驗證,並了解 virtio 為何會隱藏磁碟。

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

在 Linux 上分 4 個步驟確認 NVMe 磁碟

若要在 Linux VPS 上確認 NVMe 磁碟,請依序執行 4 項檢查:使用 lsblk 確認裝置名稱、查看 sysfs 中的 rotational 旗標以判斷是否為旋轉式媒體、使用 nvme list 確認是否為實際的 NVMe 控制器,最後執行簡短的 fio,取得主機無法偽造的唯一數值。前 3 項檢查各需約 1 秒。最後一項才能確定結果,因為在大多數 VPS 平台上,hypervisor 會對 guest 隱藏實體磁碟。

NVMe(non-volatile memory express)是快閃儲存透過 PCIe(peripheral component interconnect express)通道使用的通訊協定。它取代了原本為旋轉式磁碟設計的 SATA 與 AHCI 路徑,並移除 CPU 與快閃儲存之間的佇列瓶頸,因此速度較快。在虛擬機器內,您通常根本不會直接使用這項通訊協定。您使用的是主機為您組合出的虛擬磁碟,因此 guest 中的裝置名稱描述的是驅動程式,而不是機架中的儲存媒體。

步驟 1:lsblk 會顯示什麼?

lsblk 會讀取 kernel 的 block device 清單。-d flag 會隱藏 partition,因此每個 disk 只會顯示一行。

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

KVM VPS 通常會顯示如下:

NAME ROTA  SIZE TYPE TRAN MODEL
vda     0   80G disk

以下 3 種命名模式幾乎涵蓋所有 Linux server:

  • nvme0n1 是 NVMe controller 0 上的 namespace 1。你的 guest 使用的是 NVMe device,可能是真實裝置,也可能是模擬裝置。
  • sda 是 SCSI layer。真實的 SATA 與 SAS disk 會出現在這裡,virtio-scsi driver 也一樣。
  • vda 是 virtio-blk,也就是大多數 KVM host 預設使用的半虛擬化 block driver。

TRAN(transport)欄位對 NVMe device 會顯示 nvme;對 guest 可直接看見的 SATA disk 則會顯示 sata。在 virtio-blk 下通常會留白,因為 guest 沒有可回報的實體 transport。MODEL 也會因相同原因留白。VPS 上的 model 字串為空是正常情況,無法據此判斷硬體。

步驟 2:排除傳統硬碟

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"

rotational 檔案會在核心判定裝置具有旋轉碟片時保存 1,其他情況則保存 0。在裸機上,這個值來自磁碟本身。在 virtio-blk 下,這個值來自主機設定的功能位元,因此 0 只能排除一般硬碟,無法據此證明其他事項。仍應讀取這個值:若以固態儲存方案銷售的方案回報 1,兩者便明顯矛盾;而且這是支援人員無法爭辯的唯一截圖。

readlink -f 會解析 sysfs 符號連結,並列印裝置所連接的匯流排:

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

路徑中的 virtio 就是本步驟的答案。NVMe 裝置的路徑會包含 nvme,例如 /sys/devices/pci0000:00/0000:01:00.0/nvme/nvme0/nvme0n1;直接連接的 ATA 磁碟則會包含 ata1。這與 lsblk 列印的資訊相同,但來源是核心,而不是格式化後的欄位。當 TRAN 欄位為空時,這項資訊特別有用。

步驟 3:查詢 nvme-cli 與 PCI bus

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 會為每個 namespace 顯示一列,其中包含 controller 的序號、型號字串與 firmware revision。若表格為空,表示 guest 未取得任何 NVMe device。lspci 沒有輸出相符的列,則從另一側表示相同結果:guest 可見的 virtual PCI bus 上沒有 NVMe controller。在 virtio VPS 上,這兩個查詢都沒有結果是正常情況,不能據此判定 host 沒有 NVMe drive。

如果有 namespace 出現,nvme-cli 還能提供更多資訊。sudo nvme id-ctrl /dev/nvme0 會顯示 controller identity,sudo nvme smart-log /dev/nvme0n1 會顯示溫度、通電時數,以及額定寫入耐久度的使用百分比。只有在 nvme list 實際列出 device 時才執行這些指令,因為兩個指令都需要開啟實際的 /dev/nvme* node。

為何真正使用 NVMe 的主機仍會顯示 /dev/vda

虛擬機器管理程式決定來賓系統看到的裝置模型,而這項選擇與底層儲存媒體無關。常見的配置有 3 種。

  • 透過檔案、邏輯磁碟區或位於 NVMe 磁碟上的 ZFS 資料集提供 virtio-blk 或 virtio-scsi。您會看到 vdasda。儲存媒體實際上是 NVMe,但來賓系統無法得知這件事。
  • 在任何儲存設備前方模擬 NVMe 控制器。您會看到 nvme0n1,即使資料實際寫入 SATA 陣列,或寫入相隔 2 個機架的網路磁碟區。
  • 使用 PCIe passthrough,讓主機將實體控制器交給單一來賓系統。您會看到真正的 nvme0n1,以及真實的型號字串。共用 VPS 方案很少採用這種配置,因為該控制器會專門分配給單一客戶。

因此,裝置名稱可能在兩個方向上誤導您。更嚴重的是,主機可能在您的寫入操作與快閃儲存之間加入 write-back cache、RAID 層或複寫的網路磁碟區。這些元件都會改變您獲得的效能,但不會修改 /sys 中的任何名稱。這就是為何裝置名稱是調查的起點,而不是終點。如果您仍在選擇方案,NVMe 與 SATA SSD 儲存設備的差異說明各個等級實際值得支付的費用。

真正應檢驗的是延遲,因此請進行測量

fio (flexible I/O tester) 會針對實際檔案執行實際讀取,並回報每次讀取所需的時間。這裡應使用小型隨機讀取,因為這種工作負載能反映往返儲存媒體的時間,且無法由預讀機制提供。

首先建立測試檔案,並確認此檔案系統接受未緩衝 I/O。--direct=1 會使用 O_DIRECT 開啟檔案,繞過頁面快取。未使用此選項時,測量到的是 RAM 的效能,結果會高於任何磁碟可能達到的數值。

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"

如果輸出拒絕訊息,表示所選路徑位於不支援 O_DIRECT 的檔案系統上。容器 overlay 檔案系統及部分網路檔案系統可能會有這種情況。請改用 VPS 根檔案系統上的目錄,然後重新嘗試。如果輸出成功訊息,請執行測量:

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

這次測試會刻意限制範圍:1 個工作、佇列深度 1、20 秒,以及 256 MB 資料。它不會填滿磁碟,也不會讓你因濫用資源而遭到標記。對這個問題而言,佇列深度 1 也是最能反映實際情況的設定,因為深佇列可透過平行處理掩蓋裝置速度緩慢的問題,但延遲仍然很高。

閱讀 fio 輸出

有兩行需要注意。摘要行的格式如 read: IOPS=9012, BW=35.2MiB/s,其下方 fio 會輸出 clat 區塊。clat 是完成延遲,也就是 fio 提交讀取要求到 kernel 傳回資料之間的時間。先讀取 avg 值,再讀取 clat percentiles 清單中的 99.00th 百分位數。平均值可反映儲存類別。99th percentile 則可反映同一台主機上的其他租戶讓你等待的頻率。

數值較小時,fio 會以微秒顯示延遲;數值較大時,則會切換為毫秒。比較前,請先確認該行使用的單位。

哪些數值可區分 NVMe 等級與 SATA 等級

以下數值是截至 2026 年 8 月,根據供應商文件與社群基準測試整理的單一工作、queue depth 1、4k 隨機讀取典型值。這些是用於比較的範圍,不是從您的伺服器測得的數值。

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"
  }
]

本機 NVMe 磁碟區完成一次 4k 隨機讀取約需 110 微秒,並在 queue depth 1 時達到約 9,000 IOPS。本機 SATA SSD 約為 320 微秒,效能約為 3,100 IOPS。網路連接的區塊儲存約為 900 微秒,效能約為 1,100 IOPS,因為每次讀取都必須先經過一次網路跳接,才能存取 flash。

在 queue depth 1 時,這兩欄其實是在重述同一項事實:一次只處理一個讀取,因此 throughput 就是 latency 的倒數。如果您的平均值更接近 110,而不是 320 微秒,無論 lsblk 如何命名該裝置,您使用的都是 NVMe 等級儲存設備。如果更接近 900 微秒,表示資料路徑中存在比本機 flash 更慢的元件;訂購頁面上的 NVMe 指的是主機的磁碟,而不是您的磁碟區。

執行多次後再提出問題

單次執行只能算取樣,不代表結果。VPS 會與其他租戶共用磁碟,因此鄰近租戶的高負載可能讓延遲在 10 分鐘內增加一倍,之後又恢復正常。有些平台也會提供突發效能額度,導致任何測試的前幾分鐘看起來特別好。請在一天中不同時段執行相同的命令 3 或 4 次,並比較最差結果,而不是最佳結果。單次異常執行可能只是暫時狀況。若異常反覆出現,才是值得提交支援請求的故障;附上 3 份含時間戳記的 fio 輸出,也能讓支援請求更容易處理。若要取得涵蓋 CPU、網路與磁碟的完整概況,完整的 VPS 基準測試 會以相同方法檢查其他子系統。

如何處理這個答案

如果延遲落在 NVMe 範圍,請不要再糾結裝置名稱,直接繼續處理後續工作。vda 並不是降級方案。它是大多數主機能提供的最快虛擬磁碟驅動程式,也正是你需要的選項。

如果方案標示為本機 NVMe,但延遲落在網路儲存範圍,你就有一項具體且可重現的問題回報:確切的 fio 指令、平均完成延遲,以及執行測試的時間。這應該提交給技術支援,而不是拿來在論壇爭論。提交前,請確認磁碟不是單純已滿或嚴重碎片化,也確認測試期間沒有其他程序持續大量寫入。

請在配置服務的當天執行這項檢查,不要等到感覺速度變慢時才執行,這樣日後才能有基準可供比較。這項工作很適合放在新 VPS 啟用後的前 10 分鐘內,與設定防火牆及 SSH 金鑰一併完成。如果你仍不清楚儲存層級之間的差異,請參閱SSD VPS 實際能提供什麼,其中會說明本節所依據的基礎概念。

FAQ

為什麼 lsblk 顯示 /dev/vda,但主機標示使用 NVMe?

因為 vda 指的是 guest 中的 virtio-blk 驅動程式,不是主機上的硬體。KVM hypervisor 會提供由檔案、邏輯磁區或 dataset 支援的半虛擬化區塊裝置,而這些後端儲存可能位於 NVMe 磁碟上,guest 卻完全無法得知。這個名稱描述的是虛擬化層。只有延遲測量結果能描述實際儲存媒體。

rotational 0 能證明我使用 NVMe 磁碟嗎?

不能。/sys/block/<dev>/queue/rotational 的值為 0,表示 kernel 判定該裝置沒有旋轉碟片;在 virtio 環境中,這個值由主機選擇的功能位元設定。它可以排除一般硬碟,但無法區分 NVMe 與 SATA SSD,也無法區分本機 flash 與網路磁碟區。若出現 1,仍值得處理,因為這與任何標榜為固態儲存的方案相矛盾。

為什麼我的 VPS 中 nvme list 顯示空白?

因為 guest 沒有暴露任何 NVMe 控制器。nvme listlspci 讀取的都是虛擬機器可見的裝置,而 virtio-blk 或 virtio-scsi 磁碟不會提供可供列舉的 NVMe 控制器。在大多數 VPS 方案中,空白表格是正常結果,不能證明主機沒有 NVMe 磁碟。請使用 sudo apt install -y nvme-cli 安裝 nvme-cli;除非有控制器透過直通方式提供給 guest,否則應預期看到空白表格。

哪種 fio 結果可算是 NVMe 等級的儲存裝置?

在佇列深度為 1、使用 4k 隨機讀取並搭配 --direct=1 時,平均完成延遲接近 110 微秒可視為 NVMe 等級,並可由此推得約 9,000 IOPS。約 320 微秒通常指向 SATA SSD,約 900 微秒則通常指向網路附加儲存,因為每次讀取都必須跨越一次網路跳點。這些是 August 2026 公開資料中的典型區間,因此比較數量級,不要過度解讀精確數值;在不同時段重複測試後,再下結論。