פתרון בעיות בדיסקים מסוג NVMe

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

אתם יכולים להשתמש בממשק NVMe ל-SSD מקומי ולדיסקים לאחסון מתמיד (Persistent Disk או Google Cloud Hyperdisk). רק בסדרות המכונות החדשות ביותר, כמו Tau T2A, ‏ M3, ‏ C3, ‏ C3D ו-H3, נעשה שימוש בממשק NVMe עבור Persistent Disk. ב-Confidential VMs נעשה שימוש גם ב-NVMe ל-Persistent Disk. כל שאר סדרות המכונות של Compute Engine משתמשות בממשק הדיסק SCSI עבור דיסקים קשיחים.

שגיאה – תם הזמן הקצוב לתפוגה של פעולת קלט/פלט

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

הודעת השגיאה:

[1369407.045521] nvme nvme0: I/O 252 QID 2 timeout, aborting
[1369407.050941] nvme nvme0: I/O 253 QID 2 timeout, aborting
[1369407.056354] nvme nvme0: I/O 254 QID 2 timeout, aborting
[1369407.061766] nvme nvme0: I/O 255 QID 2 timeout, aborting
[1369407.067168] nvme nvme0: I/O 256 QID 2 timeout, aborting
[1369407.072583] nvme nvme0: I/O 257 QID 2 timeout, aborting
[1369407.077987] nvme nvme0: I/O 258 QID 2 timeout, aborting
[1369407.083395] nvme nvme0: I/O 259 QID 2 timeout, aborting
[1369407.088802] nvme nvme0: I/O 260 QID 2 timeout, aborting
...

הפתרון:

כדי לפתור את הבעיה, צריך להגדיל את הערך של פרמטר הזמן הקצוב לתפוגה.

  1. צופים בערך הנוכחי של פרמטר הזמן הקצוב לתפוגה.

    1. קובעים באיזה בקר NVMe נעשה שימוש בדיסק לאחסון מתמיד או בכרך Local SSD.
      ls -l /dev/disk/by-id
      
    2. ההגדרה io_timeout מוצגת בשניות, עבור הדיסק.

      cat /sys/class/nvme/CONTROLLER_ID/NAMESPACE/queue/io_timeout
      
      מחליפים את מה שכתוב בשדות הבאים:

      • CONTROLLER_ID: המזהה של בקר הדיסק NVMe, לדוגמה, nvme1
      • NAMESPACE: מרחב השמות של דיסק NVMe, לדוגמה, nvme1n1

      אם יש לכם רק דיסק אחד שמשתמש ב-NVMe, אתם יכולים להשתמש בפקודה:

      cat /sys/class/nvme/nvme0/nvme0n1/queue/io_timeout
      

  2. כדי להגדיל את פרמטר הזמן הקצוב לתפוגה של פעולות קלט/פלט שנשלחות למכשירי NVMe, מוסיפים את השורה הבאה לקובץ /lib/udev/rules.d/65-gce-disk-naming.rules ואז מפעילים מחדש את המכונה הווירטואלית:

    KERNEL=="nvme*n*", ENV{DEVTYPE}=="disk", ATTRS{model}=="nvme_card-pd", ATTR{queue/io_timeout}="4294967295"
    

דיסקים מנותקים עדיין מופיעים במערכת ההפעלה של מופע Compute

במכונות וירטואליות שמשתמשות בגרסת ליבה 6.0 עד 6.2 של Linux, יכול להיות שפעולות שכוללות את שיטת Compute Engine API‏ instances.detachDisk או את הפקודה gcloud compute instances detach-disk לא יפעלו כמצופה. במסוף Google Cloud המכשיר מוצג כמוסר, במטא נתונים של מופע המחשוב (פקודה compute disks describe) המכשיר מוצג כמוסר, אבל נקודת הטעינה של המכשיר וכל הקישורים הסמליים שנוצרו על ידי כללי udev עדיין גלויים במערכת ההפעלה של האורח.

הודעת השגיאה:

ניסיון לקרוא מהדיסק המנותק במכונה הווירטואלית מוביל לשגיאות קלט/פלט:

sudo head /dev/nvme0n3

head: error reading '/dev/nvme0n3': Input/output error

בעיה:

אימג'ים של מערכות הפעלה שמשתמשים בקרנל Linux 6.0-6.2 אבל לא כוללים תיקון NVMe לא מצליחים לזהות מתי דיסק NVMe מנותק.

הפתרון:

מפעילים מחדש את ה-VM כדי להשלים את תהליך ההסרה של הדיסק.

כדי להימנע מהבעיה הזו, צריך להשתמש במערכת הפעלה עם גרסת ליבת לינוקס שבה הבעיה הזו לא קיימת:

  • ‫5.19 ומעלה
  • ‫6.3 ואילך

אפשר להשתמש בפקודה uname -r במערכת ההפעלה של האורח כדי לראות את גרסת ליבת Linux.

מה השלב הבא?