Linux VPS 如何確認磁碟是否真的為 NVMe
主機聲稱使用 NVMe,不代表 guest 看得到實體硬體。用 lsblk、sysfs、nvme-cli 與受限 fio 延遲測試驗證,並了解 virtio 為何會隱藏磁碟。
在 Linux 上分 4 個步驟驗證 NVMe 磁碟
若要在 Linux VPS 上驗證 NVMe 磁碟,請依序執行 4 項檢查:使用 lsblk 確認裝置名稱,使用 rotational 確認 sysfs 中的旗標與匯流排路徑,使用 nvme list 確認實際的 NVMe 控制器,最後執行簡短的 fio,取得主機無法偽裝的唯一數值。前 3 項各需 1 秒。最後一項才能確定結果,因為多數 VPS 平台都會將實體磁碟隱藏,不讓來賓系統存取。
NVMe(non-volatile memory express)是快閃儲存裝置透過 PCIe(peripheral component interconnect express)通道通訊所使用的協定。它取代了原本為旋轉式磁碟設計的 SATA 與 AHCI 路徑,並透過移除 CPU 與快閃儲存裝置之間的佇列瓶頸來提升速度。在虛擬機器內,您通常根本不會直接使用這項協定。您使用的是主機為您組合的虛擬磁碟,因此來賓系統中的裝置名稱描述的是驅動程式,而不是機架中的實體媒體。
第 1 步:lsblk 顯示什麼?
lsblk 會讀取核心的區塊裝置清單。-d 旗標會隱藏分割區,因此每個磁碟只會顯示一行。
lsblk -d -o NAME,ROTA,SIZE,TYPE,TRAN,MODELKVM VPS 通常會顯示如下:
NAME ROTA SIZE TYPE TRAN MODEL
vda 1 80G disk virtio以下 3 種命名模式幾乎涵蓋所有 Linux 伺服器:
nvme0n1是 NVMe 控制器 0 上的命名空間 1。您的 guest 使用的是實體或模擬的 NVMe 裝置。sda是 SCSI 層。實體 SATA 和 SAS 磁碟會出現在這裡,virtio-scsi 驅動程式也是如此。vda是 virtio-blk,也就是大多數 KVM 主機預設使用的半虛擬化區塊驅動程式。
TRAN(傳輸)欄位會在 NVMe 裝置上顯示 nvme,在 guest 可直接看到的 SATA 磁碟上顯示 sata。對於 virtio-blk,目前的 util-linux 發行版本會顯示 virtio。lsblk 會根據 vd 裝置名稱推斷這個值;較舊的發行版本則會留白。無論是哪種情況,guest 都沒有可回報的實體傳輸介面。MODEL 也會因相同原因留白。VPS 上的空白型號字串很正常,無法據此判斷硬體資訊。
步驟 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 下,這個值沒有來源:virtio-blk 規格沒有媒體類型或轉速的功能位元,而 Linux virtio-blk 驅動程式會將每個磁碟標記為旋轉式。除非有人透過 udev 規則強制設為 0,否則即使主機全部使用快閃儲存,vda 通常仍會顯示 1。在 virtio-scsi sda 上,這個值則取決於主機的設定。因此,在 VPS 內部無法用這個旗標判定是否存在硬碟,而單獨看到 1 也不足以提出支援請求。下方的 fio 測試才能回答這個問題。
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。您會看到
vda或sda。儲存媒體實際上是 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 百分位數。平均值可反映儲存類別。第 99 百分位數則顯示最慢的 1% 讀取有多慢;共用主機上的資源爭用通常會先在這裡出現。
數值較小時,fio 會以微秒顯示延遲;數值較大時,則會切換為毫秒。比較數值前,先確認該行使用的單位。
區分 NVMe 等級與 SATA 等級的數值
以下數值是截至 2026 年 8 月,從廠商文件與社群基準測試整理出的單一工作、佇列深度 1、4k 隨機讀取常見值。這些是用於比較的範圍,不是從您的伺服器測得的數值。
此圖表背後的資料
[
{
"label": "Local NVMe",
"avg_latency_us": 110
},
{
"label": "Local SATA SSD",
"avg_latency_us": 320
},
{
"label": "Network block storage",
"avg_latency_us": 900
}
]此圖表背後的資料
[
{
"label": "Local NVMe",
"iops": "9,000"
},
{
"label": "Local SATA SSD",
"iops": "3,100"
},
{
"label": "Network block storage",
"iops": "1,100"
}
]本機 NVMe 磁碟區完成一次 4k 隨機讀取的延遲約為 110 微秒,並在佇列深度 1 時達到約 9,000 IOPS。本機 SATA SSD 的延遲約為 320 微秒,IOPS 約為 3,100。網路附加區塊儲存的延遲約為 900 微秒,IOPS 約為 1,100,因為讀取若未命中主機端快取,就必須先經過網路才能抵達 flash。
在佇列深度 1 時,這兩欄幾乎是在陳述同一項資訊:一次只有一個讀取要求處於處理中,因此吞吐量約等於 1 除以延遲;計入每個要求的額外負荷後,實際值會略低一些。如果您的平均延遲更接近 110 而不是 320 微秒,無論 lsblk 將該裝置稱為什麼,您使用的都是 NVMe 等級儲存。如果更接近 900 微秒,表示路徑中有比本機 flash 更慢的元件,或主機限制了磁碟區的 IOPS;無論底層儲存為何,QEMU 等 hypervisor 都可能造成這種限制。在這兩種情況下,您的磁碟區都沒有提供 NVMe 等級的延遲,無論訂購頁面如何描述主機的磁碟。
執行多次後再提出問題
單次執行只能算取樣,不代表結果。VPS 會與其他租戶共用磁碟,因此鄰近租戶的高負載可能讓延遲在 10 分鐘內增加一倍,之後又恢復正常。有些平台也會提供突發效能額度,導致任何測試的前幾分鐘看起來特別好。請在一天中不同時段執行相同的命令 3 或 4 次,並比較最差結果,而不是最佳結果。單次異常執行可能只是暫時狀況。若異常反覆出現,才是值得提交支援請求的故障;附上 3 份含時間戳記的 fio 輸出,也能讓支援請求更容易處理。若要取得涵蓋 CPU、網路與磁碟的完整概況,完整的 VPS 基準測試 會以相同方法檢查其他子系統。
如何處理這個答案
如果延遲落在 NVMe 範圍,請不要再糾結裝置名稱,直接繼續處理後續工作。vda 並不是降級方案。它是大多數主機能提供的最快虛擬磁碟驅動程式,也正是你需要的選項。
如果方案標示為本機 NVMe,但延遲落在網路儲存範圍,你就有一項具體且可重現的問題回報:確切的 fio 指令、平均完成延遲,以及執行測試的時間。這應該提交給技術支援,而不是拿來在論壇爭論。提交前,請確認磁碟不是單純已滿或嚴重碎片化,也確認測試期間沒有其他程序持續大量寫入。
請在配置服務的當天執行這項檢查,不要等到感覺速度變慢時才執行,這樣日後才能有基準可供比較。這項工作很適合放在新 VPS 啟用後的前 10 分鐘內,與設定防火牆及 SSH 金鑰一併完成。如果你仍不清楚儲存層級之間的差異,請參閱SSD VPS 實際能提供什麼,其中會說明本節所依據的基礎概念。
FAQ
為什麼主機宣稱使用 NVMe,但 lsblk 顯示的是 /dev/vda?
因為 vda 指的是 guest 中的 virtio-blk 驅動程式,不是主機上的硬體。KVM hypervisor 會提供半虛擬化區塊裝置,其後端可能是檔案、邏輯磁碟區或 dataset,而該儲存後端可以位於 NVMe 磁碟上,guest 完全不會得知。這個名稱描述的是虛擬化層。只有延遲測量結果能描述實際儲存媒體。
rotational 0 能證明我使用 NVMe 磁碟嗎?
不能。/sys/block/<dev>/queue/rotational 設為 0,表示 kernel 不會將該裝置視為具有旋轉碟片,但在 VPS 中這是設定值,不是測量結果。virtio-blk 沒有表示媒體類型的 feature bit,而 Linux virtio-blk 驅動程式會對每個磁碟回報 1,除非有其他設定覆寫它,因此其中的 0 通常表示有人手動設定。這無法區分 NVMe 與 SATA SSD,也無法區分本機 flash 與網路磁碟區。VPS 中的 1 也不能證明是硬碟,因此應依據 fio 延遲,而不是這個旗標做判斷。
為什麼我的 VPS 中 nvme list 顯示空白?
因為 guest 未取得任何 NVMe 控制器。nvme list 與 lspci 都會讀取虛擬機器可見的裝置,而 virtio-blk 或 virtio-scsi 磁碟不會提供可列舉的 NVMe 控制器。在多數 VPS 方案中,空白表格是正常結果,不能證明主機沒有 NVMe 磁碟。使用 sudo apt install -y nvme-cli 安裝 nvme-cli;除非有控制器以 passthrough 方式提供,否則應預期看到空白表格。
哪種 fio 結果可算是 NVMe 等級的儲存裝置?
在佇列深度為 1、使用 4k 隨機讀取與 --direct=1 時,平均完成延遲接近 110 微秒,即可視為 NVMe 等級,並可由此得到約 9,000 IOPS。約 320 微秒通常指向 SATA SSD;約 900 微秒則通常指向網路連接儲存裝置,因為未命中主機快取的讀取必須跨越一次網路,或指向受到主機限速的磁碟區。這些是 August 2026 發布的典型區間,因此應比較數量級,而不是比對精確數值;在不同時段重複測試後,再下結論。