Linux पर VPS disk सच में NVMe है या नहीं जाँचें
Host के NVMe दावे को guest के अंदर जाँचें: lsblk, sysfs, nvme-cli और सीमित fio latency run चलाकर जानें कि virtio disk को कैसे छिपाता है।
Linux पर NVMe डिस्क को चार चरणों में सत्यापित करना
Linux VPS पर NVMe डिस्क को सत्यापित करने के लिए, क्रमवार चार जाँचें करें: डिवाइस नाम के लिए lsblk, rotational फ्लैग और sysfs में बस पाथ, वास्तविक NVMe कंट्रोलर के लिए nvme list, और उस एक नंबर के लिए एक संक्षिप्त fio रन जिसे होस्ट बदल नहीं सकता। पहली तीन जाँचों में एक-एक सेकंड का समय लगता है। अंतिम जाँच स्थिति स्पष्ट कर देती है, क्योंकि अधिकांश VPS प्लेटफॉर्म पर हाइपरवाइजर गेस्ट से भौतिक डिस्क को छिपा देता है।
NVMe (non-volatile memory express) वह प्रोटोकॉल है जिस पर फ्लैश स्टोरेज PCIe (peripheral component interconnect express) लेन्स के माध्यम से संचार करता है। इसने SATA और AHCI पाथ की जगह ली है जिसे घूमने वाली डिस्क (spinning drives) के लिए डिज़ाइन किया गया था, और यह तेज़ है क्योंकि यह CPU और फ्लैश के बीच कतारबद्ध बाधा (queueing bottleneck) को हटा देता है। वर्चुअल मशीन के अंदर आप शायद ही कभी उस प्रोटोकॉल का उपयोग करते हैं। आप एक ऐसी वर्चुअल डिस्क से बात करते हैं जिसे होस्ट आपके लिए तैयार करता है, इसलिए आपके गेस्ट में डिवाइस का नाम मीडिया के बजाय ड्राइवर का वर्णन करता है।
चरण 1: lsblk क्या दिखाता है?
lsblk कर्नेल की ब्लॉक डिवाइस की सूची को पढ़ता है। -d फ्लैग पार्टिशन्स को छिपा देता है, जिससे आपको प्रति डिस्क एक लाइन दिखाई देती है।
lsblk -d -o NAME,ROTA,SIZE,TYPE,TRAN,MODELएक KVM VPS आमतौर पर इस तरह उत्तर देता है:
NAME ROTA SIZE TYPE TRAN MODEL
vda 1 80G disk virtioतीन नामकरण पैटर्न लगभग हर Linux सर्वर को कवर करते हैं:
nvme0n1NVMe कंट्रोलर 0 पर नेमस्पेस 1 है। आपका गेस्ट एक NVMe डिवाइस चला रहा है, चाहे वह वास्तविक हो या एमुलेटेड।sdaSCSI लेयर है। वास्तविक SATA और SAS डिस्क यहाँ आती हैं, और virtio-scsi ड्राइवर भी इसी का उपयोग करता है।vdavirtio-blk है, जो कि पैरा-वर्चुअल ब्लॉक ड्राइवर है जिसे अधिकांश KVM होस्ट डिफ़ॉल्ट रूप से उपयोग करते हैं।
TRAN (ट्रांसपोर्ट) कॉलम NVMe डिवाइस के लिए nvme और SATA डिस्क के लिए sata पढ़ता है जिसे गेस्ट सीधे देख सकता है। virtio-blk के अंतर्गत, वर्तमान util-linux रिलीज़ virtio प्रिंट करते हैं, जिसे lsblk vd डिवाइस नाम से अनुमानित करता है, और पुरानी रिलीज़ इसे खाली छोड़ देती हैं। किसी भी स्थिति में गेस्ट के रिपोर्ट करने के लिए कोई भौतिक ट्रांसपोर्ट नहीं होता है। MODEL भी इसी कारण से खाली रहता है। VPS पर एक खाली मॉडल स्ट्रिंग सामान्य है और यह आपको हार्डवेयर के बारे में कुछ नहीं बताती है।
चरण 2: spinning disk की संभावना को खारिज करना
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 तब होता है जब kernel डिवाइस को spinning platters वाला मानता है और 0 तब होता है जब ऐसा नहीं होता। Bare metal पर यह मान ड्राइव से आता है। Virtio-blk के अंतर्गत यह कहीं से नहीं आता: virtio-blk specification में मीडिया प्रकार या rotation rate के लिए कोई feature bit नहीं है, और Linux virtio-blk driver हर डिस्क को rotational के रूप में चिह्नित करता है। इसलिए एक vda सामान्यतः 1 दिखाता है, भले ही host पूरी तरह से flash-based हो, जब तक कि किसी ने udev rule के साथ इसे जबरन 0 पर सेट न किया हो। Virtio-scsi sda पर यह मान वही होता है जिसे host ने configure करने के लिए चुना है। अतः एक VPS के अंदर यह flag किसी hard drive की पुष्टि या खंडन नहीं कर सकता, और केवल एक 1 के आधार पर support ticket नहीं खोला जा सकता। नीचे दिया गया fio test इस प्रश्न का सही उत्तर देता है।
readlink -f sysfs symlink को resolve करता है और उस bus को print करता है जिससे डिवाइस जुड़ा है:
/sys/devices/pci0000:00/0000:00:05.0/virtio2/block/vdaउस path में virtio शब्द इस चरण का आपका उत्तर है। एक NVMe डिवाइस ऐसा path देता है जिसमें nvme शामिल हो, जैसे कि /sys/devices/pci0000:00/0000:01:00.0/nvme/nvme0/nvme0n1, और सीधे attached ATA डिस्क में ata1 वाला path मिलता है। यह वही तथ्य है जिसे lsblk ने print किया था, जिसे formatted column के बजाय सीधे kernel से लिया गया है, जो तब उपयोगी होता है जब TRAN field खाली हो।
चरण 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 का serial number, model string और firmware revision शामिल होते हैं। खाली table का अर्थ है कि आपके guest को कोई NVMe device expose नहीं किया गया है। lspci का कोई matching line प्रिंट न करना भी यही बात दूसरे तरीके से बताता है: आपके guest को दिखाई देने वाले virtual PCI bus पर कोई NVMe controller मौजूद नहीं है। virtio VPS पर दोनों परिणाम खाली मिलना सामान्य है। इनमें से किसी भी परिणाम से यह सिद्ध नहीं होता कि host पर कोई NVMe drive नहीं है।
यदि कोई namespace दिखाई देता है, तो nvme-cli अधिक जानकारी दे सकता है। sudo nvme id-ctrl /dev/nvme0 controller की पहचान प्रिंट करता है, जबकि sudo nvme smart-log /dev/nvme0n1 temperature, power-on hours और rated write endurance में उपयोग किए गए प्रतिशत को प्रिंट करता है। इन्हें केवल तब चलाएँ जब nvme list ने वास्तव में कोई device सूचीबद्ध किया हो, क्योंकि दोनों commands को खोलने के लिए वास्तविक /dev/nvme* node आवश्यक होता है।
वास्तव में NVMe host होने पर भी /dev/vda क्यों दिखाई देता है
Hypervisor यह तय करता है कि आपके guest को कौन-सा device model दिखाई देगा। यह चुनाव underlying storage media से स्वतंत्र होता है। आम तौर पर 3 व्यवस्थाएँ होती हैं।
- किसी file, logical volume या NVMe drives पर मौजूद ZFS dataset के ऊपर virtio-blk या virtio-scsi। आपको
vdaयाsdaदिखाई देता है। Storage NVMe है, लेकिन guest के पास यह जानने का कोई तरीका नहीं होता। - किसी भी प्रकार के storage के सामने emulated NVMe controller। आपको
nvme0n1दिखाई देता है, भले ही data SATA array या दो racks दूर स्थित network volume पर लिखा जा रहा हो। - PCIe passthrough, जिसमें host किसी physical controller को एक guest को सौंप देता है। आपको वास्तविक model string के साथ वास्तविक
nvme0n1दिखाई देता है। Shared VPS plans में यह व्यवस्था दुर्लभ है, क्योंकि तब card केवल एक customer के लिए dedicated होता है।
इसलिए device name आपको दोनों दिशाओं में भ्रमित कर सकता है। इससे भी महत्वपूर्ण बात यह है कि host आपके writes और flash के बीच write-back cache, RAID layer या replicated network volume रख सकता है। इनमें से प्रत्येक, /sys में एक भी name बदले बिना, आपको मिलने वाले performance को बदल देता है। इसलिए device name से जाँच शुरू करें, लेकिन वहीं समाप्त न करें। यदि आप अभी plan चुन रहे हैं, तो NVMe और SATA SSD storage के बीच का अंतर बताता है कि प्रत्येक tier के लिए वास्तव में भुगतान करना कितना उचित है।
ईमानदार परीक्षण latency है, इसलिए इसे मापें
fio (flexible I/O tester) किसी वास्तविक file से वास्तविक reads करता है और बताता है कि प्रत्येक read में कितना समय लगा। यहाँ छोटे random reads सही workload हैं, क्योंकि वे media तक के round trip को उजागर करते हैं और read-ahead से serve नहीं किए जा सकते।
पहले test file बनाएँ और सुनिश्चित करें कि यह filesystem unbuffered I/O स्वीकार करता है। --direct=1 file को O_DIRECT के साथ खोलता है, जिससे page cache bypass हो जाता है। इसके बिना आप अपनी RAM को मापेंगे और ऐसे numbers मिलेंगे जिन्हें कोई disk उत्पन्न नहीं कर सकती।
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"यदि इसने refusal message प्रदर्शित किया, तो चुना गया path ऐसे filesystem पर है जिसमें O_DIRECT support नहीं है। Container overlay filesystems और कुछ network filesystems इसी तरह काम करते हैं। VPS के root filesystem पर किसी directory का चयन करें और फिर प्रयास करें। यदि इसने success प्रदर्शित किया, तो measurement चलाएँ:
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यह run जानबूझकर सीमित है: एक job, queue depth 1, बीस seconds और 256 MB data। इससे disk भर नहीं जाएगी और abuse के लिए आपका account flag नहीं होगा। इस प्रश्न के लिए queue depth 1 ही ईमानदार setting है, क्योंकि deep queues parallelism के पीछे धीमे device को छिपा सकती हैं, जबकि latency अधिक बनी रहती है।
fio आउटपुट को पढ़ना
दो पंक्तियाँ महत्वपूर्ण हैं। सारांश पंक्ति read: IOPS=9012, BW=35.2MiB/s जैसी दिखती है, और इसके नीचे fio एक clat ब्लॉक प्रिंट करता है। clat कंप्लीशन लेटेंसी है: वह समय जो fio द्वारा रीड सबमिट करने और कर्नल द्वारा डेटा वापस देने के बीच बीतता है। avg मान को पढ़ें, फिर clat percentiles सूची में 99.00th परसेंटाइल को देखें। औसत मान आपको स्टोरेज क्लास के बारे में बताता है। 99वां परसेंटाइल यह बताता है कि सबसे धीमे 1 प्रतिशत रीड कितने धीमे थे, जहाँ आमतौर पर शेयर्ड होस्ट पर कंटेंशन सबसे पहले दिखाई देता है।
जब मान छोटे होते हैं तो fio लेटेंसी को माइक्रोसेकंड में प्रिंट करता है और जब वे बड़े होते हैं तो मिलीसेकंड में बदल जाता है। किसी भी तुलना से पहले पंक्ति में दी गई यूनिट की जाँच अवश्य करें।
NVMe क्लास और SATA क्लास को अलग करने वाली संख्याएँ
नीचे दिए गए आंकड़े अगस्त 2026 तक वेंडर डॉक्यूमेंटेशन और कम्युनिटी बेंचमार्क से लिए गए, queue depth 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 वॉल्यूम लगभग 110 माइक्रोसेकंड में एक 4k रैंडम रीड का उत्तर देता है और queue depth 1 पर लगभग 9,000 IOPS तक पहुँचता है। एक लोकल SATA SSD लगभग 320 माइक्रोसेकंड और 3,100 IOPS के आसपास रहती है। नेटवर्क अटैच्ड ब्लॉक स्टोरेज लगभग 900 माइक्रोसेकंड और 1,100 IOPS पर काम करता है, क्योंकि जो रीड किसी भी होस्ट-साइड कैश से मिस हो जाता है, उसे फ्लैश तक पहुँचने से पहले नेटवर्क को पार करना पड़ता है।
Queue depth 1 पर ये दोनों कॉलम लगभग एक ही तथ्य को दो बार बताते हैं: एक समय में एक रीड इन-फ्लाइट होने पर, थ्रूपुट लगभग एक को लेटेंसी से विभाजित करने पर प्राप्त होता है, और प्रति-अनुरोध ओवरहेड की गणना करने पर यह थोड़ा कम हो जाता है। यदि आपका औसत 320 माइक्रोसेकंड की तुलना में 110 के अधिक करीब है, तो आप NVMe क्लास स्टोरेज पर हैं, चाहे lsblk ने डिवाइस को कुछ भी कहा हो। यदि यह 900 माइक्रोसेकंड के करीब है, तो या तो पाथ में लोकल फ्लैश से धीमी कोई चीज़ है या होस्ट आपके वॉल्यूम के IOPS को सीमित कर रहा है, जो कि QEMU जैसे हाइपरवाइजर स्टोरेज के बावजूद कर सकते हैं। दोनों ही स्थितियों में आपका वॉल्यूम NVMe क्लास लेटेंसी नहीं दे रहा है, चाहे ऑर्डर पेज पर होस्ट की ड्राइव के बारे में कुछ भी लिखा हो।
शिकायत करने से पहले इसे एक से अधिक बार चलाएँ
एक बार चलाना केवल एक नमूना है, परिणाम नहीं। VPS अपने disks साझा करता है, इसलिए व्यस्त पड़ोसी दस मिनट के लिए आपकी latency दोगुनी कर सकता है और फिर सामान्य हो सकता है। कुछ platforms burst credits भी देते हैं, जिससे किसी भी test के शुरुआती मिनट बहुत अच्छे दिख सकते हैं। उसी command को दिन के अलग-अलग समय में तीन या चार बार चलाएँ और सबसे अच्छे परिणाम के बजाय सबसे खराब परिणाम की तुलना करें। एक खराब run केवल अस्थायी स्थिति हो सकता है। बार-बार दिखने वाला pattern ऐसी समस्या है जिसके लिए support ticket बनाना उचित है। तीन timestamp वाले fio outputs संलग्न करने पर ticket अधिक प्रभावी रहेगा। CPU और network के साथ disk का व्यापक आकलन करने के लिए पूर्ण VPS benchmark run अन्य subsystems पर भी यही प्रक्रिया अपनाता है।
उत्तर के साथ क्या करें
यदि latency NVMe श्रेणी में है, तो device name की चिंता करना बंद करें और आगे बढ़ें। vda downgrade नहीं है। यह अधिकांश hosts द्वारा उपलब्ध कराया जाने वाला सबसे तेज virtual disk driver है, और आपको यही चाहिए।
यदि local NVMe के रूप में बेचे गए plan पर latency network storage श्रेणी में है, तो आपके पास एक स्पष्ट और दोहराए जा सकने वाला दावा है: सटीक fio command, average completion latency और वे समय जब आपने इसे चलाया था। यह forum argument नहीं, बल्कि support ticket का विषय है। इसे भेजने से पहले पुष्टि करें कि disk केवल full या अत्यधिक fragmented नहीं है। यह भी पुष्टि करें कि test के दौरान box पर कोई process लगातार भारी write नहीं कर रहा है।
यह check provisioning वाले दिन चलाएँ, उस दिन नहीं जब कुछ slow महसूस हो, ताकि बाद में तुलना करने के लिए आपके पास baseline हो। यह नए VPS पर पहले दस मिनट के काम में स्वाभाविक रूप से शामिल है, firewall और SSH keys सेट करने के साथ। यदि storage tiers के बीच का अंतर अभी भी स्पष्ट नहीं है, तो SSD VPS वास्तव में आपको क्या देता है इस विषय की आधारभूत जानकारी देता है।
FAQ
जब मेरा होस्ट NVMe का विज्ञापन करता है, तो lsblk /dev/vda क्यों दिखाता है?
क्योंकि vda आपके गेस्ट में virtio-blk ड्राइवर का नाम बताता है, न कि होस्ट पर मौजूद हार्डवेयर का। एक KVM हाइपरवाइजर एक पैरा-वर्चुअल ब्लॉक डिवाइस प्रस्तुत करता है जो किसी फाइल, लॉजिकल वॉल्यूम या डेटासेट द्वारा समर्थित होता है। यह बैकिंग स्टोर NVMe ड्राइव पर स्थित हो सकता है, बिना गेस्ट को इसके बारे में पता चले। यह नाम वर्चुअलाइजेशन लेयर को दर्शाता है। केवल लेटेंसी (latency) का मापन ही मीडिया के बारे में सही जानकारी दे सकता है।
क्या rotational 0 यह साबित करता है कि मेरे पास NVMe डिस्क है?
नहीं। /sys/block/<dev>/queue/rotational में 0 होने का मतलब है कि कर्नेल डिवाइस को घूमने वाली प्लेटर्स (spinning platters) वाला नहीं मानता है, लेकिन VPS के अंदर यह एक सेटिंग है, मापन नहीं। virtio-blk में मीडिया प्रकार के लिए कोई फीचर बिट नहीं होता है, और Linux virtio-blk ड्राइवर हर डिस्क के लिए 1 रिपोर्ट करता है जब तक कि कोई इसे ओवरराइड न करे। इसलिए वहां 0 का मतलब आमतौर पर यह होता है कि किसी ने इसे मैन्युअल रूप से सेट किया है। यह NVMe और SATA SSD के बीच अंतर नहीं बता सकता, और न ही यह लोकल फ्लैश और नेटवर्क वॉल्यूम के बीच अंतर कर सकता है। VPS के अंदर 1 भी हार्ड ड्राइव होने का प्रमाण नहीं है, इसलिए इस फ्लैग के बजाय fio लेटेंसी के आधार पर निर्णय लें।
मेरे VPS पर nvme list खाली क्यों है?
क्योंकि आपके गेस्ट को कोई NVMe कंट्रोलर एक्सपोज नहीं किया गया है। nvme list और lspci दोनों वही पढ़ते हैं जो वर्चुअल मशीन देख सकती है, और एक virtio-blk या virtio-scsi डिस्क एन्यूमरेट करने के लिए कोई NVMe कंट्रोलर प्रस्तुत नहीं करती है। अधिकांश VPS प्लान पर खाली टेबल मिलना सामान्य परिणाम है और यह इस बात का प्रमाण नहीं है कि होस्ट में NVMe ड्राइव की कमी है। sudo apt install -y nvme-cli के साथ nvme-cli इंस्टॉल करें और खाली टेबल की अपेक्षा रखें, जब तक कि कंट्रोलर को पास-थ्रू (pass-through) न किया गया हो।
कौन सा fio परिणाम NVMe क्लास स्टोरेज माना जाता है?
4k रैंडम रीड्स और --direct=1 के साथ 1 की क्यू डेप्थ (queue depth) पर, 110 माइक्रोसेकंड के आसपास की औसत पूर्णता लेटेंसी (completion latency) NVMe क्लास है, और लगभग 9,000 IOPS इससे प्राप्त होते हैं। 320 माइक्रोसेकंड के आसपास का मान SATA SSD की ओर इशारा करता है, और 900 माइक्रोसेकंड के आसपास का मान नेटवर्क अटैच्ड स्टोरेज की ओर इशारा करता है, जहाँ होस्ट के कैश से बाहर के रीड्स नेटवर्क हॉप पार करते हैं, या ऐसे वॉल्यूम की ओर इशारा करता है जिसे होस्ट थ्रॉटल (throttle) कर रहा है। ये अगस्त 2026 के लिए विशिष्ट प्रकाशित बैंड हैं, इसलिए सटीक आंकड़ों के बजाय परिमाण (orders of magnitude) की तुलना करें, और निष्कर्ष निकालने से पहले अलग-अलग समय पर रन को दोहराएं।