בקצרה
- NVMe הוא פרוטוקול שנבנה לזיכרון פלאש ומתחבר ישירות לערוץ PCIe, בלי שכבות שתוכננו לדיסקים מסתובבים.
- היתרון הגדול לאתרים הוא זמן תגובה נמוך ועבודה במקביל על הרבה בקשות קטנות, ולא מספרי ה‑MB/s שבפרסומות.
- וורדפרס ו‑MySQL מרוויחים בעיקר בכתיבות, כשהנתונים עוד לא בזיכרון, ובשעות עומס.
- NVMe לא מתקן קוד איטי, שאילתות בלי אינדקס או שרת עם מעט מדי זיכרון.
מה זה NVMe
NVMe (Non-Volatile Memory Express) הוא פרוטוקול, כלומר השפה שבה מערכת ההפעלה מדברת עם כונן האחסון. הוא תוכנן מההתחלה לזיכרון פלאש, ולא לדיסקים מסתובבים, ועובד על גבי PCIe, הערוץ המהיר שאליו מתחברים גם כרטיסי מסך וכרטיסי רשת.
כשמישהו אומר "דיסק NVMe", הוא מתכוון לכונן פלאש שמדבר בפרוטוקול הזה. כדי להבין למה זה משנה לאתר, צריך להכיר את שלושת סוגי הדיסקים שתמצאו היום בשרתים, ואת ההבדל בין מהירות שנראית טוב בפרסומת למהירות שמורגשת באתר.
HDD, SSD ב‑SATA ו‑NVMe: מה ההבדל
HDD: דיסק מכני
כונן קשיח קלאסי שומר מידע על פלטות מסתובבות, וראשי קריאה זזים מעליהן על זרוע אחת. כל קריאה ממקום אחר בדיסק דורשת להזיז את הזרוע ולחכות שהפלטה תסתובב למקום הנכון, וזה לוקח אלפיות שנייה. בקריאה רציפה של קובץ גדול זה פחות מורגש, אבל בהרבה קריאות קטנות ומפוזרות זה צוואר בקבוק חמור.
SSD ב‑SATA
כונן SSD (כונן מצב מוצק, בלי חלקים נעים) שומר מידע בשבבי פלאש, ולכן אין לו זמן חיפוש מכני. אבל כונני ה‑SSD הראשונים, ורבים מהם עד היום, מתחברים בממשק SATA, שתוכנן לדיסקים מכניים, ומדברים בפרוטוקול AHCI, שגם הוא נבנה עבורם. לממשק SATA יש תקרת רוחב פס של 6Gb/s, ול‑AHCI יש תור פקודות אחד, עם עד 32 פקודות שממתינות בו.
NVMe
NVMe מוותר על השכבות האלה. הכונן מתחבר ישירות ל‑PCIe, והמפרט של NVMe מאפשר עד כ‑64 אלף תורי פקודות, כל אחד עם עד כ‑64 אלף פקודות. בפועל מערכת ההפעלה מקצה בדרך כלל תור נפרד לכל ליבת מעבד, כך שליבות שונות שולחות בקשות לדיסק במקביל בלי לחכות זו לזו. גם הדרך מהבקשה לביצוע קצרה יותר, עם פחות עבודה של המעבד על כל פעולה.
| HDD | SSD ב‑SATA | NVMe | |
|---|---|---|---|
| מה יש בפנים | פלטות מסתובבות וראש קריאה | שבבי פלאש | שבבי פלאש |
| חיבור ופרוטוקול | SATA או SAS | SATA ו‑AHCI | PCIe ו‑NVMe |
| עבודה במקביל | מוגבלת, זרוע קריאה אחת שזזה | תור אחד, עד 32 פקודות | עד כ‑64 אלף תורים |
| גישה אקראית | איטית, אלפיות שנייה | מהירה | הכי מהירה, גם תחת עומס |
| שימוש מתאים | גיבויים וארכיון | אתרים קטנים ושרתים ישנים | אתרים, מסדי נתונים ושרתים עמוסים |
למה MB/s זה לא המספר החשוב
הפרסומות של כוננים מציגות בדרך כלל מהירות קריאה רציפה, במגהבייט לשנייה. המספר הזה נמדד בקריאה של קובץ גדול אחד ברצף, בבלוקים גדולים. הוא רלוונטי להעתקת קבצי וידאו או לשחזור גיבוי, אבל כמעט לא לאתר.
אתר ומסד נתונים עובדים אחרת: הרבה מאוד בקשות קטנות, למקומות מפוזרים. מסד הנתונים MySQL, למשל, שומר את הנתונים בדפים של 16KB כברירת מחדל, ושאילתה אחת יכולה לקרוא דפי אינדקס ודפי נתונים מכמה מקומות שונים בקובץ. כאן קובעים שני מדדים אחרים:
- זמן תגובה (Latency): כמה זמן לוקחת פעולה בודדת. כשעמוד צריך כמה קריאות מהדיסק, אחת אחרי השנייה, הזמנים מצטברים.
- IOPS (פעולות קלט ופלט בשנייה): כמה פעולות קטנות הדיסק מסוגל לבצע בשנייה, במיוחד כשהרבה גולשים ותהליכים פונים אליו בבת אחת.
שני המדדים האלה הם בדיוק המקום שבו NVMe מתבלט: פחות שכבות בדרך מורידות את זמן התגובה, והתורים המקבילים מאפשרים לשרת עמוס לשלוח הרבה בקשות בבת אחת בלי שייווצר פקק.
מה NVMe משנה לוורדפרס ול‑MySQL
חשוב לדייק: בשרת שמוגדר נכון, רוב הקריאות לא מגיעות לדיסק בכלל. PHP שומר קוד מקומפל בזיכרון (OPcache), ו‑MySQL מחזיק את הנתונים שבשימוש באזור זיכרון שנקרא Buffer Pool. ובכל זאת, יש הרבה רגעים שבהם הדיסק קובע:
- כתיבות: כברירת מחדל, MySQL מוודא שרישום של כל שינוי נכתב פיזית לדיסק לפני שהוא מאשר אותו. כל הזמנה ב‑WooCommerce, כל תגובה וכל שמירה של עמוד מחכות לפעולה הזו, וזמן תגובה נמוך מקצר אותן ישירות.
- נתונים שעוד לא בזיכרון: אחרי הפעלה מחדש של השרת, או כשניגשים לעמודים ישנים שלא נקראו מזמן, הנתונים חייבים להגיע מהדיסק.
- קאש עמודים בקבצים: תוספי קאש כותבים וקוראים אלפי קבצים קטנים, ובונים אותם מחדש אחרי כל עדכון באתר.
- עבודה ברקע: גיבויים, עדכוני תוספים, יבוא מוצרים וסריקות אבטחה קוראים וכותבים הרבה קבצים. על דיסק איטי הם מאטים גם את הגולשים שנמצאים באתר באותו זמן.
- שעות עומס: כשעשרות תהליכי PHP ושאילתות פונים לדיסק במקביל, היכולת לטפל בהרבה בקשות בבת אחת היא מה שמונע מהאתר להיתקע.
מה NVMe לא יפתור
דיסק מהיר הוא רק חוליה אחת בשרשרת. הוא לא יעזור כש:
- הקוד איטי: תבנית או תוסף שמריצים מאות שאילתות בכל עמוד, או פונים לשירות חיצוני בכל טעינה, יישארו איטיים. צוואר הבקבוק הוא המעבד וה‑PHP, לא הדיסק.
- חסרים אינדקסים: שאילתה שסורקת טבלה שלמה תרוץ מהר יותר על NVMe, אבל עדיין לאט מדי. התיקון הוא אינדקס, לא חומרה.
- אין מספיק זיכרון: כשהשרת מתחיל להשתמש ב‑Swap (זיכרון וירטואלי על הדיסק), גם NVMe איטי בהרבה מ‑RAM.
- אין קאש עמודים: בנייה של כל עמוד מחדש בכל ביקור עולה זמן מעבד, גם כשהדיסק מהיר.
- הבעיה בצד הגולש: תמונות לא מכווצות, יותר מדי סקריפטים ומרחק פיזי מהשרת לא קשורים לדיסק בכלל.
אם האתר איטי ואתם לא בטוחים למה, כדאי לעבור על הסיבות הנפוצות לאתר וורדפרס איטי לפני שמחליפים חומרה.
לא כל NVMe זהה
- כונני שרת מול כוננים ביתיים: כונני שרת בנויים לעומס רציף, עם הגנה מפני אובדן מידע בהפסקת חשמל ועמידות גבוהה יותר לכתיבות. כוננים ביתיים רבים נשענים על אזור קאש פנימי מהיר, ומאטים כשהוא מתמלא בכתיבה ארוכה.
- דיסק מקומי מול אחסון ברשת: בחלק משירותי הענן, הדיסק של השרת הווירטואלי לא יושב באותה מכונה, אלא במערכת אחסון שמחוברת ברשת. גם אם היא בנויה מכונני NVMe, הרשת מוסיפה זמן לכל פעולה.
- שכנים: ב‑VPS, כמה שרתים וירטואליים חולקים את אותה חומרה. ספק טוב מגביל ומנטר את העומס, כדי ששרת אחד לא יאט את האחרים.
- M.2 הוא לא בהכרח NVMe: M.2 הוא צורת הכונן, ויש כונני M.2 שעובדים ב‑SATA.
איך בודקים מה יש לכם בשרת
בשרת לינוקס, הפקודה הזו מציגה את סוג החיבור של כל דיסק:
lsblk -d -o NAME,ROTA,TRAN,SIZE,MODEL
בשרת פיזי, בעמודה TRAN תראו nvme או sata, ובעמודה ROTA הערך 1 מסמן דיסק מסתובב. בשרת וירטואלי הדיסק מופיע בדרך כלל כ‑vda, והעמודות האלה לא משקפות את מה שיש מתחת. לכן עדיף למדוד. הכלי fio בודק קריאות אקראיות קטנות, בדיוק מה שמעניין אתר:
fio --name=randread --filename=/root/fio-test --size=1G \
--rw=randread --bs=4k --iodepth=32 --ioengine=libaio \
--direct=1 --runtime=30 --time_based --group_reporting
rm /root/fio-test
בתוצאה מסתכלים על IOPS ועל זמני התגובה (clat), ובמיוחד על האחוזונים הגבוהים, שמראים כמה איטיות הבקשות האיטיות ביותר. כדי לראות בזמן אמת אם הדיסק הוא צוואר הבקבוק, הפקודה iostat -x 1 (מהחבילה sysstat) מציגה כמה זמן בקשות מחכות לדיסק ועד כמה הוא עסוק.
בשורה התחתונה
NVMe הפך לבחירה המקובלת לשרתי אתרים, ובצדק: זמן תגובה נמוך ועבודה במקביל הם בדיוק מה שאתרים ומסדי נתונים צריכים. אבל הוא חלק ממערכת שלמה: מספיק זיכרון, קאש עמודים, קוד סביר ושאילתות עם אינדקסים. שרתי ה‑VPS ואחסון הוורדפרס של MVN בנויים על דיסקי NVMe, כך שהדיסק כבר לא החוליה החלשה.
שאלות נפוצות
האם כל כונן M.2 הוא NVMe?
לא. M.2 הוא צורת הכונן והחיבור הפיזי, ויש כונני M.2 שעובדים ב‑SATA. כדי לדעת, בודקים במפרט של הכונן אם כתוב בו NVMe או PCIe.
האם NVMe יאיץ אתר וורדפרס?
כן, בעיקר בפעולות שתלויות בדיסק: שאילתות למסד הנתונים כשהנתונים לא בזיכרון, שמירת הזמנות ותוכן, עדכונים וגיבויים. אם האתר איטי בגלל תוספים כבדים או בלי קאש עמודים, הדיסק לא יפתור את זה.
איך יודעים אם בשרת יש NVMe?
בשרת פיזי, הפקודה lsblk -d -o NAME,TRAN מציגה nvme בעמודת החיבור. בשרת וירטואלי הדיסק מופיע בדרך כלל כ‑vda, בלי קשר למה שיש מתחת, ולכן שואלים את הספק או מודדים זמני תגובה.
מה עדיף: עוד זיכרון או דיסק NVMe?
לשרת עם מסד נתונים, קודם כל מספיק זיכרון כדי שהנתונים הפעילים יישבו ב‑RAM. NVMe מקטין את המחיר של כל פעם שבכל זאת צריך לגשת לדיסק. בשרת טוב יש את שניהם.
האם יש עדיין מקום לדיסק HDD?
כן, לגיבויים, לארכיון ולנפחים גדולים של קבצים שלא ניגשים אליהם הרבה, כי הוא זול יותר לכל יחידת נפח. לאתר או למסד נתונים פעילים, לא.