SSD Nodes Learn 🎉 VPS החל מ־$5.50/חודש
מדריכים Matt Connorמאת Matt Connor · עודכן 2026-08-13

איך לוודא שכונן ה-VPS שלכם הוא באמת NVMe בלינוקס

גלו אם ה-VPS שלכם משתמש ב-NVMe אמיתי או בסימולציה. השתמשו ב-lsblk, sysfs, nvme-cli ובבדיקת fio כדי לחשוף את הביצועים האמיתיים ולעקוף את ההסתרות של ה-hypervisor בשרת.

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

אימות כונן NVMe בלינוקס בארבעה שלבים

כדי לאמת כונן NVMe בשרת VPS מבוסס לינוקס, בצעו ארבע בדיקות לפי הסדר: lsblk לזיהוי שם ההתקן, דגל rotational בתוך sysfs עבור מדיה מסתובבת, nvme list עבור בקר NVMe אמיתי, והרצה קצרה של fio עבור הנתון היחיד שמארח אינו יכול לזייף. שלוש הבדיקות הראשונות לוקחות שנייה כל אחת. האחרונה מכריעה את הסוגיה, שכן ברוב פלטפורמות ה-VPS, ה-hypervisor מסתיר את הכונן הפיזי מה-guest.

NVMe (non-volatile memory express) הוא הפרוטוקול שבו משתמש אחסון פלאש מעל נתיבי PCIe (peripheral component interconnect express). הוא החליף את נתיבי ה-SATA וה-AHCI שתוכננו עבור כוננים מסתובבים, והוא מהיר משום שהוא מסיר צוואר בקבוק בתור ההמתנה בין ה-CPU לבין הפלאש. בתוך מכונה וירטואלית, לעיתים נדירות תדברו בפרוטוקול הזה. אתם מתקשרים מול כונן וירטואלי שהמארח מרכיב עבורכם, לכן שם ההתקן ב-guest שלכם מתאר דרייבר, ולא את המדיה שנמצאת ב-rack.

שלב 1: מה מציג lsblk?

lsblk קורא את רשימת התקני הבלוק של הליבה. הדגל -d מסתיר מחיצות, כך שמוצגת שורה אחת לכל דיסק.

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

שרת KVM VPS בדרך כלל מגיב כך:

NAME ROTA  SIZE TYPE TRAN MODEL
vda     0   80G disk

שלושה דפוסי שמות מכסים כמעט כל שרת Linux:

  • nvme0n1 הוא מרחב שמות 1 בבקר NVMe 0. האורח מפעיל התקן NVMe, אמיתי או מדומה.
  • sda הוא שכבת ה-SCSI. דיסקי SATA ו-SAS אמיתיים מופיעים כאן, וגם מנהל ההתקן virtio-scsi.
  • vda הוא virtio-blk, מנהל התקן הבלוק הווירטואלי שרוב מארחי KVM משתמשים בו כברירת מחדל.

עמודת ה-TRAN (תעבורה) מציגה nvme עבור התקן NVMe ו-sata עבור דיסק SATA שהאורח יכול לראות ישירות. היא בדרך כלל ריקה תחת virtio-blk, כיוון שאין תעבורה פיזית שהאורח יכול לדווח עליה. 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 כאשר הליבה (kernel) מזהה שהתקן כולל פלטות מסתובבות, ו-0 עבור כל השאר. בחומרה פיזית (bare metal), הערך מגיע ישירות מהכונן. תחת 0, הערך מגיע מביט תכונה שמוגדר על ידי המארח, לכן 0 שולל כונן קשיח רגיל אך אינו מוכיח דבר מעבר לכך. קראו את הערך בכל זאת: 1 בתוכנית שנמכרה כאחסון מבוסס זיכרון הבזק (solid state) הוא סתירה מוחלטת, וזהו צילום מסך שצוות התמיכה לא יוכל להתווכח איתו.

readlink -f פותר את הקישור הסימבולי של sysfs ומציג את אפיק התקשורת (bus) שאליו מחובר ההתקן:

/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

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, עם המספר הסידורי של הבקר, מחרוזת הדגם וגרסת ה-firmware. טבלה ריקה משמעותה שאף התקן NVMe אינו חשוף למכונה הווירטואלית שלכם. lspci, כאשר אינו מדפיס שורות תואמות, מעיד על אותו הדבר מהצד השני: אפיק ה-PCI הווירטואלי שהמכונה שלכם רואה אינו נושא בקר NVMe. שתי תוצאות ריקות הן התוצאה התקינה ב-VPS מסוג virtio, ואין באף אחת מהן עדות לכך שהמארח (host) אינו משתמש בכונני NVMe.

אם מופיע namespace, הכלי nvme-cli מאפשר העמקה. sudo nvme id-ctrl /dev/nvme0 מדפיס את זהות הבקר, ו-sudo nvme smart-log /dev/nvme0n1 מדפיס את הטמפרטורה, שעות העבודה ושיעור השחיקה של הכונן (percentage of rated write endurance). הריצו פקודות אלו רק כאשר nvme list אכן הציג התקן, כיוון ששתי הפקודות זקוקות לצומת /dev/nvme* אמיתי כדי להיפתח.

מדוע מארח NVMe אמיתי עדיין מציג /dev/vda

ה־hypervisor הוא שמחליט איזה מודל התקן יוצג למערכת האורחת, והחלטה זו אינה תלויה באמצעי האחסון הפיזי שמתחת. נפוצים שלושה סידורים:

  • virtio-blk או virtio-scsi מעל קובץ, כרך לוגי (logical volume), או ZFS dataset שנמצאים על כונני NVMe. אתם תראו vda או sda. האחסון הוא NVMe, אך למערכת האורחת אין דרך לדעת זאת.
  • בקר NVMe מדומה (emulated) לפני כל סוג של אחסון. אתם תראו nvme0n1 גם כאשר הנתונים נכתבים בפועל למערך SATA או לכונן רשת שנמצא שני ארונות משם.
  • PCIe passthrough, שבו המארח מעביר בקר פיזי למערכת אורחת אחת. אתם תראו nvme0n1 אמיתי עם מחרוזת מודל אמיתית. זה נדיר בתוכניות VPS שיתופיות, כיוון שהכרטיס מוקצה אז באופן בלעדי לאותו לקוח.

לכן, שם ההתקן יכול להטעות אתכם לשני הכיוונים. גרוע מכך, המארח יכול להציב cache מסוג write-back, שכבת RAID, או כרך רשת משוכפל בין פעולות הכתיבה שלכם לבין ה־flash, וכל אחד מאלה משנה את הביצועים שאתם מקבלים מבלי לשנות אפילו שם אחד ב־/sys. זו הסיבה שהשם הוא נקודת ההתחלה ולא נקודת הסיום. אם אתם עדיין בוחרים תוכנית, ההבדל בין אחסון NVMe לבין SATA SSD מסביר מה הערך האמיתי של כל שכבת אחסון.

המבחן האמין ביותר הוא השהיה (latency), לכן יש למדוד אותה

הכלי fio (flexible I/O tester) מבצע פעולות קריאה אמיתיות מול קובץ ומדווח כמה זמן ארכה כל פעולה. קריאות אקראיות קטנות הן עומס העבודה המתאים כאן, כיוון שהן חושפות את זמן הלוך-חזור (round trip) למדיה ולא ניתן להאיץ אותן באמצעות read-ahead.

ראשית, צרו את קובץ הבדיקה וודאו שמערכת הקבצים תומכת ב-I/O ללא חוצץ (unbuffered). הפרמטר --direct=1 פותח את הקובץ עם O_DIRECT, מה שעוקף את ה-page cache. בלעדיו, תמדדו את ה-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

ההרצה מוגבלת בכוונה: משימה אחת, עומק תור (queue depth) של 1, עשרים שניות, ו-256 MB של נתונים. היא לא תמלא את הדיסק שלכם ולא תגרום לסימון החשבון שלכם כשימוש לרעה. עומק תור של 1 הוא גם ההגדרה האמינה ביותר לשאלה זו, כיוון שתורים עמוקים מאפשרים להתקן איטי "להתחבא" מאחורי מקביליות, בעוד ההשהיה נותרת גבוהה.

קריאת הפלט של fio

שתי שורות הן בעלות חשיבות. שורת הסיכום נראית כמו read: IOPS=9012, BW=35.2MiB/s, ותחתיה מדפיס fio בלוק clat. הערך clat הוא ה־latency של השלמת הפעולה: הזמן שחולף מרגע ש־fio מגיש בקשת קריאה ועד שה־kernel מחזיר את הנתונים. קראו את הערך avg, ולאחר מכן קראו את האחוזון 99.00th ברשימת ה־clat percentiles. הממוצע מעיד על סוג האחסון. האחוזון ה-99 מעיד על תדירות המקרים שבהם שכן על אותו השרת גורם לכם להמתין.

fio מדפיס latency במיקרו-שניות כאשר הערכים קטנים, ועובר למילי-שניות כאשר הם גדולים. בדקו את היחידות בשורה לפני שאתם מבצעים השוואה כלשהי.

אילו מספרים מבדילים בין מחלקת NVMe למחלקת SATA

הנתונים להלן הם ערכים טיפוסיים שפורסמו עבור קריאות אקראיות של 4k בעבודה בודדת בעומק תור (queue depth) של 1, שנאספו מתיעוד יצרנים וממדדים קהילתיים נכון לאוגוסט 2026. אלו טווחי השוואה בלבד, ולא מדידות מהשרת שלכם.

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 מיקרו-שניות ומגיע לכ-9,000 IOPS בעומק תור 1. כונן SATA SSD מקומי נמצא בקרבת 320 מיקרו-שניות ו-3,100 IOPS. אחסון בלוקים מחובר רשת (network attached block storage) נע סביב 900 מיקרו-שניות ו-1,100 IOPS, כיוון שכל קריאה בודדת עוברת דרך רשת לפני שהיא מגיעה לזיכרון ה-flash.

בעומק תור 1, שתי העמודות הללו הן למעשה אותה עובדה המנוסחת פעמיים: קריאה אחת בכל פעם פירושה שקצב העבודה הוא פשוט אחד חלקי השיהוי (latency). אם הממוצע שלכם קרוב יותר ל-110 מאשר ל-320 מיקרו-שניות, אתם משתמשים באחסון ממחלקת NVMe, ללא קשר לאופן שבו lsblk בחר לקרוא להתקן. אם הוא קרוב יותר ל-900 מיקרו-שניות, סימן שיש משהו איטי יותר מזיכרון flash מקומי בנתיב הנתונים, והמילה NVMe שמופיעה בדף ההזמנה מתארת את הכוננים של המארח (host) ולא את הנפח שהוקצה לכם.

הריצו את הבדיקה יותר מפעם אחת לפני שאתם מתלוננים

הרצה אחת היא דגימה, לא תוצאה. שרת VPS חולק את הכוננים שלו עם אחרים, לכן שכן עמוס עלול להכפיל את ה-latency שלכם לעשר דקות ואז להיעלם. פלטפורמות מסוימות גם מעניקות "קרדיט burst" שגורם לדקות הראשונות של כל בדיקה להיראות מצוינות. הריצו את אותה פקודה שלוש או ארבע פעמים בשעות שונות של היום והשוו את התוצאה הגרועה ביותר, לא את הטובה ביותר. הרצה אחת גרועה היא עניין של מזל. דפוס קבוע הוא תקלה שראויה לפתיחת ticket בתמיכה, וה-ticket יתקבל טוב יותר אם תצרפו אליו שלושה פלטים של fio עם חותמות זמן. לקבלת תמונה רחבה יותר הכוללת גם את ה-CPU והרשת בנוסף לכונן, הרצת benchmark מלא ל-VPS משתמשת באותה משמעת גם עבור שאר תת-המערכות.

מה לעשות עם התוצאה

אם השיהוי (latency) נמצא בטווח של NVMe, הפסיקו לדאוג לגבי שם ההתקן והמשיכו הלאה. vda אינו נחשב לירידה בביצועים. זהו מנהל ההתקן המהיר ביותר לדיסק וירטואלי שרוב המארחים מציעים, וזה בדיוק מה שאתם צריכים.

אם השיהוי נמצא בטווח של אחסון רשתי בתוכנית שנמכרה כ-NVMe מקומי, יש לכם טענה ספציפית שניתן לשחזר: פקודת ה-fio המדויקת, שיהוי ההשלמה הממוצע, והזמנים שבהם הרצתם את הבדיקה. זהו נושא לפתיחת כרטיס תמיכה ולא לוויכוח בפורום. לפני השליחה, ודאו שהדיסק אינו מלא או מקוטע מאוד, וודאו ששום דבר בשרת אינו מבצע כתיבות אינטנסיביות בזמן הבדיקה.

בצעו בדיקה זו ביום הקצאת השרת, ולא ביום שבו משהו מרגיש איטי, כדי שיהיה לכם בסיס להשוואה בעתיד. זה משתלב באופן טבעי ב-עשר הדקות הראשונות ב-VPS חדש, לצד הגדרת ה-firewall ומפתחות ה-SSH. אם ההבחנה בין שכבות האחסון עדיין אינה ברורה, מה ש-SSD VPS באמת נותן לכם מכסה את הרקע לנושא זה.

FAQ

מדוע הפקודה lsblk מציגה /dev/vda כאשר המארח מצהיר על שימוש ב-NVMe?

הסיבה היא ש-vda מציין את מנהל ההתקן virtio-blk בתוך ה-guest, ולא את החומרה הפיזית במארח. היפר-ויזור מסוג KVM מציג התקן בלוק וירטואלי (paravirtual) המגובה על ידי קובץ, כרך לוגי או מערך נתונים; אמצעי האחסון הזה יכול לשבת על כונני NVMe מבלי שה-guest ידע על כך. השם מתאר את שכבת הווירטואליזציה. רק מדידת השהיה (latency) יכולה להעיד על סוג המדיה.

האם הערך 0 ב-rotational מוכיח שיש לי כונן NVMe?

לא. כאשר /sys/block/<dev>/queue/rotational מכיל 0, המשמעות היא שה-kernel אינו מזהה פלטות מסתובבות בהתקן. תחת virtio, ערך זה נקבע לפי bit תכונה שהמארח בוחר. זה שולל שימוש בכונן קשיח מכני רגיל, אך לא ניתן להבדיל באמצעותו בין NVMe לבין SATA SSD, וגם לא בין זיכרון פלאש מקומי לבין כונן רשת. עדיין כדאי להתייחס ל-1, שכן הוא סותר כל תוכנית שמשווקת כאחסון מבוסס solid state.

מדוע הפקודה nvme list ריקה ב-VPS שלי?

מכיוון שלא נחשף בקר NVMe ל-guest שלך. הפקודות nvme list ו-lspci קוראות את מה שהמכונה הווירטואלית מסוגלת לראות, וכונן virtio-blk או virtio-scsi אינו מציג בקר NVMe שניתן למנות. טבלה ריקה היא התוצאה התקינה ברוב תוכניות ה-VPS, ואין בה כדי להוכיח שהמארח אינו משתמש בכונני NVMe. התקינו את nvme-cli באמצעות sudo apt install -y nvme-cli וצפו לטבלה ריקה, אלא אם כן הועבר בקר (passthrough) ישירות למכונה.

איזו תוצאת fio נחשבת לאחסון ברמת NVMe?

בעומק תור (queue depth) של 1 עם קריאות אקראיות של 4k ו---direct=1, השהיית השלמה ממוצעת הקרובה ל-110 מיקרו-שניות נחשבת לרמת NVMe, ונגזרים ממנה בערך 9,000 IOPS. השהיה של סביב 320 מיקרו-שניות מצביעה על SATA SSD, וסביב 900 מיקרו-שניות מצביעה על אחסון מחובר לרשת (NAS), שבו כל קריאה עוברת דרך רכיב רשת. אלו הם טווחי ביצועים טיפוסיים שפורסמו נכון לאוגוסט 2026, לכן יש להשוות סדרי גודל ולא מספרים מדויקים, ומומלץ לחזור על הבדיקה בשעות שונות לפני הסקת מסקנות.