הפעלה של עיבוד מהיר יותר של מנות רשת באמצעות DPDK

במאמר הזה מוסבר איך להפעיל את Data Plane Development Kit‏ (DPDK) במכונה וירטואלית (VM) כדי לעבד מהר יותר חבילות נתונים ברשת.

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

  • פריסות של וירטואליזציה של פונקציות רשת (NFV)

  • אפליקציות של שירותי Networking מוגדרי-תוכנה (SDN)

  • אפליקציות של סטרימינג וידאו או של VoIP

אפשר להריץ DPDK במכונה וירטואלית שמשתמשת באחד מסוגי כרטיסי הרשת הווירטואליים (vNIC) הבאים:

  • מומלץ: gVNIC

    ממשק רשת וירטואלי (vNIC) מאובטח, בעל ביצועים גבוהים ועם יכולת התאמה לעומס, שתוכנן במיוחד ל-Compute Engine. הוא מחליף את virtIO ומהווה את הדור הבא של vNIC.

  • VirtIO-Net

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

בעיה אחת בהרצת DPDK בסביבה וירטואלית, במקום בחומרה פיזית, היא שבסביבות וירטואליות אין תמיכה ב-SR-IOV וב-I/O Memory Management Unit (IOMMU) לאפליקציות עם ביצועים גבוהים. כדי לעקוף את המגבלה הזו, צריך להריץ את DPDK על כתובות פיזיות של אורחים ולא על כתובות וירטואליות של מארחים, באמצעות אחד מהדרייברים הבאים:

לפני שמתחילים

  • אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות. אימות הוא תהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Google Cloud . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים הבאות:

    צריך לבחור את הכרטיסייה הרלוונטית לאופן שבו תכננתם להשתמש בדוגמאות בדף הזה:

    המסוף

    כשמשתמשים במסוף Google Cloud כדי לגשת לשירותים ולממשקי ה-API של Google Cloud , לא צריך להגדיר אימות.

    gcloud

    1. התקינו את ה-CLI של Google Cloud. אחר כך, מאתחלים את ה-CLI של Google Cloud באמצעות הפקודה הבאה:

      gcloud init

      אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  • הגדרת אזור ותחום כברירת מחדל
  • REST

    כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של API בארכיטקטורת REST שבדף הזה, צריך להשתמש בפרטי הכניסה שאתם נותנים ל-CLI של gcloud.

      התקינו את ה-CLI של Google Cloud.

      אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Google Cloud .

דרישות

כשיוצרים מכונה וירטואלית להרצת DPDK, חשוב לוודא את הדברים הבאים:

  • כדי להימנע ממצב שבו אין קישוריות לרשת כשמריצים את האפליקציות, כדאי להשתמש בשתי רשתות בענן וירטואלי פרטי (VPC):

    • רשת VPC למישור הבקרה

    • רשת VPC למישור הנתונים

  • בשתי רשתות ה-VPC צריך לציין את הפרטים הבאים:

    • רשת משנה עם טווח ייחודי של כתובות IP

    • אותו אזור עבור רשתות המשנה שלהם

    • אותו סוג של VNIC – ‏gVNIC או VirtIO-Net

  • כשיוצרים את המכונה הווירטואלית:

    • צריך לציין את אותו אזור כמו של רשתות המשנה של שתי רשתות ה-VPC.

    • צריך לציין את סוג ה-vNIC שמתכננים להשתמש בו עם DPDK.

    • צריך לציין סדרת מכונות נתמכת עבור gVNIC או VirtIO-Net.

הגבלות

יש הגבלות על הפעלת DPDK במכונה וירטואלית:

סקירה כללית של התכונות והגרסאות של DPDK

‫Google ממליצה להשתמש בגרסה העדכנית ביותר של מנהל ההתקן DPDK כדי ליהנות מהתכונות הכי חדשות ומתיקוני באגים. ברשימה הבאה מופיעה סקירה כללית של האפשרויות שזמינות בכל גרסה של מנהל ההתקן DPDK:

26.07
תמיכה בהוספת חותמות זמן של RX (DQ בלבד)
26.03
  • תמיכה באיפוס פסיבי של DPDK
  • תמיכה בהפניית תנועה ב-DPDK (רק ב-DQ)
25.11
השלמות לא רציפות בפורמט DQ
25.07
  • תמיכה ב-FreeBSD
  • תמיכה בגדלים של דפי אורחים שאינם 4K
24.07
24.03
תמיכה ב-RSS (לכל סוגי המכונות הנתמכים).
23.11
  • תמיכה בגודל של שטח אחסון זמני של RX (לכל סוגי המכונות הנתמכים).
  • תמיכה במסגרת ג'מבו (9K) לסוגי מכונות מהדור השלישי ואילך.
23.07
  • הוספנו תמיכה בסוגי מכונות מדור שלישי ומעלה.
  • תמיכה בפריים ג'מבו (9K) בסוגי מכונות מהדור הראשון והשני.
23.03

תמיכה בדיווח על נתונים סטטיסטיים:

  • נתונים סטטיסטיים של תוכנות לכל סוגי המכונות הנתמכים.
  • נתונים סטטיסטיים של חומרה לסוגי מכונות מהדור הראשון והשני.
22.11
גרסת הדרייבר הראשונית עם תמיכה בסוגי מכונות מהדור הראשון והשני.

הגדרת מכונה וירטואלית להרצת DPDK

בקטע הזה מוסבר איך ליצור מכונה וירטואלית להרצת DPDK.

יצירת רשתות ה-VPC

יוצרים שתי רשתות VPC, למישור הנתונים ולמישור הבקרה, באמצעות מסוף Google Cloud , Google Cloud CLI או Compute Engine API. אפשר לציין את הרשתות האלה בהמשך כשיוצרים את ה-VM.

המסוף

  1. יוצרים רשת VPC למישור הנתונים:

    1. במסוף Google Cloud , נכנסים לדף רשתות VPC.

      כניסה לרשתות VPC

      ייפתח הדף רשתות VPC.

    2. לוחצים על Create VPC network (יצירת רשת VPC).

      ייפתח הדף יצירת רשת VPC.

    3. בשדה שם, מזינים שם לרשת.

    4. בקטע New subnet (רשת משנה חדשה), מבצעים את הפעולות הבאות:

      1. בשדה שם, מזינים שם לרשת המשנה.

      2. בתפריט Region, בוחרים אזור לרשת המשנה.

      3. בוחרים באפשרות IPv4 (single-stack)‎ (ברירת המחדל).

      4. בקטע טווח IPv4, מזינים כתובת טווח IPv4 תקינה בסימון CIDR.

      5. לוחצים על סיום.

    5. לוחצים על יצירה.

      הדף רשתות VPC נפתח. יצירת רשת ה-VPC עשויה להימשך עד דקה.

  2. יוצרים רשת VPC למישור הבקרה עם כלל של חומת אש שמאפשר חיבורי SSH למכונה הווירטואלית:

    1. לוחצים שוב על Create VPC network.

      ייפתח הדף יצירת רשת VPC.

    2. בשדה שם, מזינים שם לרשת.

    3. בקטע New subnet (רשת משנה חדשה), מבצעים את הפעולות הבאות:

      1. בשדה Name, נותנים שם לרשת המשנה.

      2. בתפריט Region, בוחרים את אותו אזור שציינתם לרשת המשנה של רשת מישור הנתונים.

      3. בוחרים באפשרות IPv4 (single-stack) (ברירת מחדל).

      4. בקטע טווח IPv4, מזינים כתובת טווח IPv4 תקינה בסימון CIDR.

      5. לוחצים על סיום.

    4. בכרטיסייה IPv4 firewall rules, מסמנים את התיבה NETWORK_NAME-allow-ssh.

      כאשר NETWORK_NAME הוא שם הרשת שציינתם בשלבים הקודמים.

    5. לוחצים על יצירה.

      ייפתח הדף רשתות VPC. יכול להיות שיחלפו עד דקה לפני שהיצירה של רשת ה-VPC תושלם.

gcloud

  1. כדי ליצור רשת VPC למישור הנתונים:

    1. כדי ליצור רשת VPC עם רשת משנה שנוצרה באופן ידני, משתמשים בפקודה gcloud compute networks create עם הדגל --subnet-mode שמוגדר לערך custom.

      gcloud compute networks create DATA_PLANE_NETWORK_NAME \
          --bgp-routing-mode=regional \
          --mtu=MTU \
          --subnet-mode=custom
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫DATA_PLANE_NETWORK_NAME: השם של רשת ה-VPC למישור הנתונים.

      • ‫MTU: יחידת השידור המקסימלית (MTU), שהיא גודל החבילה הגדול ביותר ברשת. הערך צריך להיות בין 1300 ל-8896. ערך ברירת המחדל הוא 1460. לפני שמגדירים את ה-MTU לערך גבוה מ-1460, כדאי לעיין במאמר בנושא יחידת שידור מקסימלית.

    2. כדי ליצור רשת משנה לרשת מישור הנתונים של ה-VPC שיצרתם זה עתה, משתמשים בפקודה gcloud compute networks subnets create.

      gcloud compute networks subnets create DATA_PLANE_SUBNET_NAME \
          --network=DATA_PLANE_NETWORK_NAME \
          --range=DATA_PRIMARY_RANGE \
          --region=REGION
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫DATA_PLANE_SUBNET_NAME: השם של רשת המשנה של רשת מישור הנתונים.

      • ‫DATA_PLANE_NETWORK_NAME: השם של רשת מישור הנתונים שציינתם בשלבים הקודמים.

      • ‫DATA_PRIMARY_RANGE: a valid IPv4 range for the subnet in CIDR notation.

      • ‫REGION: האזור שבו רוצים ליצור את רשת המשנה.

  2. כדי ליצור רשת VPC למישור הבקרה עם כלל של חומת אש שמאפשר חיבורי SSH למכונה הווירטואלית, פועלים לפי השלבים הבאים:

    1. כדי ליצור רשת VPC עם רשת משנה שנוצרה באופן ידני, משתמשים בפקודה gcloud compute networks create עם הדגל --subnet-mode שמוגדר לערך custom.

      gcloud compute networks create CONTROL_PLANE_NETWORK_NAME \
          --bgp-routing-mode=regional \
          --mtu=MTU \
          --subnet-mode=custom
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫CONTROL_PLANE_NETWORK_NAME: השם של רשת ה-VPC למישור הבקרה.

      • ‫MTU: ה-MTU, שהוא גודל החבילה הגדול ביותר ברשת. הערך צריך להיות בין 1300 ל-8896. ערך ברירת המחדל הוא 1460. לפני שמגדירים את ה-MTU לערך גבוה מ-1460, קראו את המאמר יחידת העברה מקסימלית.

    2. יוצרים רשת משנה לרשת מישור הבקרה של ה-VPC שיצרתם באמצעות הפקודה gcloud compute networks subnets create.

      gcloud compute networks subnets create CONTROL_PLANE_SUBNET_NAME \
          --network=CONTROL_PLANE_NETWORK_NAME \
          --range=CONTROL_PRIMARY_RANGE \
          --region=REGION
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫CONTROL_PLANE_SUBNET_NAME: השם של רשת המשנה של מישור הבקרה.

      • ‫CONTROL_PLANE_NETWORK_NAME: השם של רשת מישור הבקרה שציינתם בשלבים הקודמים.

      • ‫CONTROL_PRIMARY_RANGE: a valid IPv4 range for the subnet in CIDR notation.

      • ‫REGION: האזור שבו יוצרים את רשת המשנה, שצריך להתאים לאזור שציינתם ברשת המשנה של רשת מישור הנתונים.

    3. יוצרים כלל של חומת אש ב-VPC שמאפשר חיבורי SSH לרשת של מישור הבקרה, באמצעות הפקודה gcloud compute firewall-rules create עם הדגל --allow שמוגדר לערך tcp:22.

      gcloud compute firewall-rules create FIREWALL_RULE_NAME \
          --action=allow \
          --network=CONTROL_PLANE_NETWORK_NAME \
          --rules=tcp:22
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫FIREWALL_RULE_NAME: השם של כלל חומת האש.

      • ‫CONTROL_PLANE_NETWORK_NAME: השם של רשת מישור הבקרה שיצרתם בשלבים הקודמים.

API

  1. כדי ליצור רשת VPC למישור הנתונים:

    1. כדי ליצור רשת VPC עם תת-רשת שנוצרה באופן ידני, שולחים בקשת POST אל ה-method‏ networks.insert, כשהשדה autoCreateSubnetworks מוגדר לערך false.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
      
      {
        "autoCreateSubnetworks": false,
        "name": "DATA_PLANE_NETWORK_NAME",
        "mtu": MTU
      }
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫PROJECT_ID: מזהה הפרויקט הנוכחי.

      • ‫DATA_PLANE_NETWORK_NAME: השם של הרשת של מישור הנתונים.

      • ‫MTU: יחידת השידור המקסימלית (MTU), שהיא גודל החבילה הגדול ביותר ברשת. הערך צריך להיות בין 1300 ל-8896. ערך ברירת המחדל הוא 1460. לפני שמגדירים את ה-MTU לערך שגבוה מ-1460, קראו את המאמר יחידת העברה מקסימלית.

    2. יוצרים תת-רשת לרשת מישור הנתונים של ה-VPC על ידי שליחת בקשת POST לשיטה subnetworks.insert.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks
      
      {
        "ipCidrRange": "DATA_PRIMARY_RANGE",
        "name": "DATA_PLANE_SUBNET_NAME",
        "network": "projects/PROJECT_ID/global/networks/DATA_PLANE_NETWORK_NAME"
      }
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫PROJECT_ID: מזהה הפרויקט שבו נמצאת רשת מישור הנתונים.

      • ‫REGION: האזור שבו רוצים ליצור את רשת המשנה.

      • ‫DATA_PRIMARY_RANGE: טווח IPv4 הראשי של תת-הרשת החדשה בסימון CIDR.

      • ‫DATA_PLANE_SUBNET_NAME: השם של תת-הרשת של רשת מישור הנתונים שיצרתם בשלב הקודם.

      • ‫DATA_PLANE_NETWORK_NAME: השם של רשת מישור הנתונים שיצרתם בשלב הקודם.

  2. כדי ליצור רשת VPC למישור הבקרה עם כלל של חומת אש שמאפשר חיבורי SSH למכונה הווירטואלית, פועלים לפי השלבים הבאים:

    1. כדי ליצור רשת VPC עם תת-רשת שנוצרה באופן ידני, שולחים בקשת POST אל ה-method‏ networks.insert עם השדה autoCreateSubnetworks שמוגדר לערך false.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
      
      {
        "autoCreateSubnetworks": false,
        "name": "CONTROL_PLANE_NETWORK_NAME",
        "mtu": MTU
      }
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫PROJECT_ID: מזהה הפרויקט הנוכחי.

      • ‫CONTROL_PLANE_NETWORK_NAME: השם של הרשת עבור מישור הבקרה.

      • ‫MTU: ה-MTU, שהוא הגודל המקסימלי של חבילת נתונים ברשת. הערך צריך להיות בין 1300 ל-8896. ערך ברירת המחדל הוא 1460. לפני שמגדירים את ה-MTU לערך גבוה מ-1460, כדאי לעיין במאמר בנושא יחידת שידור מקסימלית.

    2. יוצרים תת-רשת לרשת של בקרת הנתונים ב-VPC באמצעות שליחת בקשת POST ל-method subnetworks.insert.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks
      
      {
        "ipCidrRange": "CONTROL_PRIMARY_RANGE",
        "name": "CONTROL_PLANE_SUBNET_NAME",
        "network": "projects/PROJECT_ID/global/networks/CONTROL_PLANE_NETWORK_NAME"
      }
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫PROJECT_ID: מזהה הפרויקט שבו נמצאת רשת מישור הבקרה.

      • ‫REGION: האזור שבו רוצים ליצור את רשת המשנה.

      • ‫CONTROL_PRIMARY_RANGE: טווח ה-IPv4 הראשי של תת-הרשת החדשה בסימון CIDR.

      • ‫CONTROL_PLANE_SUBNET_NAME: השם של רשת המשנה של רשת מישור הבקרה שיצרתם בשלב הקודם.

      • ‫CONTROL_PLANE_NETWORK_NAME: השם של רשת מישור הבקרה שיצרתם בשלב הקודם.

    3. יוצרים כלל של חומת אש ב-VPC שמאפשר חיבורי SSH לרשת של מישור הבקרה על ידי שליחת בקשת POST לשיטת firewalls.insert. בבקשה, מגדירים את השדה IPProtocol לערך tcp ואת השדה ports לערך 22.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
      
      {
        "allowed": [
          {
            "IPProtocol": "tcp",
            "ports": [ "22" ]
          }
        ],
        "network": "projects/PROJECT_ID/global/networks/CONTROL_PLANE_NETWORK_NAME"
      }
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫PROJECT_ID: מזהה הפרויקט שבו נמצאת רשת מישור הבקרה.

      • ‫CONTROL_PLANE_NETWORK_NAME: השם של רשת מישור הבקרה שיצרתם בשלבים הקודמים.

אפשרויות הגדרה נוספות ליצירת רשת VPC מפורטות במאמר יצירה וניהול של רשתות VPC.

יצירת מכונה וירטואלית שמשתמשת ברשתות VPC ל-DPDK

יוצרים מכונה וירטואלית שמפעילה gVNIC או virtIO-Net בשתי רשתות ה-VPC שיצרתם קודם באמצעות Google Cloud המסוף, ה-CLI של gcloud ו-Compute Engine API.

מומלץ: לציין את Ubuntu LTS או את Ubuntu Pro בתור קובץ האימג' של מערכת ההפעלה, כי מנהל החבילות שלהם תומך במנהלי ההתקנים של UIO ו-VFIO ללא IOMMU. אם לא רוצים לציין אף אחת ממערכות ההפעלה האלה, מומלץ לציין Debian 11 ואילך כדי לעבד את החבילות מהר יותר.

המסוף

כדי ליצור מכונה וירטואלית שמשתמשת בשתי רשתות המשנה של רשת ה-VPC שיצרתם בשלבים הקודמים:

  1. נכנסים לדף VM instances במסוף Google Cloud .

    כניסה לדף VM instances

    ייפתח הדף VM instances.

  2. לוחצים על Create instance.

    ייפתח הדף Create an instance.

  3. בשדה שם, מזינים שם למכונה הווירטואלית.

  4. בתפריט אזור, בוחרים את אותו אזור שבו יצרתם את הרשתות בשלבים הקודמים.

  5. בתפריט Zone, בוחרים תחום למכונה הווירטואלית.

  6. בקטע Machine configuration מבצעים את הפעולות הבאות:

    1. בוחרים באחת מהאפשרויות הבאות:

      • לעומסי עבודה נפוצים, בוחרים בכרטיסייה General purpose (ברירת המחדל).

      • לעומסי עבודה שדורשים ביצועים גבוהים, בוחרים בכרטיסייה Compute optimized.

      • לעומסי עבודה עם יחסים גבוהים בין זיכרון ל-vCPU, בוחרים בכרטיסייה Memory optimized (אופטימיזציה לזיכרון).

      • לעומסי עבודה שמשתמשים ביחידות עיבוד גרפי (GPU), בוחרים בכרטיסייה GPUs.

    2. זה שינוי אופציונלי. אם ציינתם GPUs בשלב הקודם ואתם רוצים לשנות את ה-GPU שמצורף ל-VM, בצעו אחת או יותר מהפעולות הבאות:

      1. בתפריט סוג ה-GPU, בוחרים סוג של GPU.

      2. בתפריט Number of GPUs, בוחרים את מספר ה-GPU.

    3. בתפריט סדרה, בוחרים סדרת מכונות.

    4. בתפריט Machine type, בוחרים סוג מכונה.

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

  7. אופציונלי: בקטע דיסק אתחול לוחצים על Change ופועלים לפי ההנחיות כדי לשנות את קובץ האימג'.

  8. מרחיבים את הקטע אפשרויות מתקדמות.

  9. מרחיבים את הקטע Networking.

  10. בקטע Network performance configuration (הגדרת ביצועי הרשת), מבצעים את הפעולות הבאות:

    1. בתפריט כרטיס רשת, בוחרים באחת מהאפשרויות הבאות:

      • כדי להשתמש ב-gVNIC, בוחרים באפשרות gVNIC.

      • כדי להשתמש ב-VirtIO-Net, בוחרים באפשרות VirtIO.

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

  11. בקטע Network interfaces:

    1. בשורה default, לוחצים על הסמל מחיקת הפריט default.

    2. לוחצים על הוספת ממשק רשת.

      מופיע הקטע New network interface.

    3. בתפריט Network, בוחרים את הרשת של מישור הבקרה שיצרתם בשלבים הקודמים.

    4. לוחצים על סיום.

    5. לוחצים שוב על הוספת ממשק רשת.

      מופיע הקטע New network interface.

    6. בתפריט Network (רשת), בוחרים את רשת מישור הנתונים שיצרתם בשלבים הקודמים.

    7. לוחצים על סיום.

  12. לוחצים על יצירה.

    ייפתח הדף VM instances. יכול להיות שיעבור עד דקה עד שהיצירה של המכונה הווירטואלית תושלם.

gcloud

יוצרים מכונה וירטואלית שמשתמשת בשתי רשתות המשנה של רשת ה-VPC שיצרתם בשלבים הקודמים, באמצעות הפקודה gcloud compute instances create עם הדגלים הבאים:

gcloud compute instances create VM_NAME \
    --image-family=IMAGE_FAMILY \
    --image-project=IMAGE_PROJECT \
    --machine-type=MACHINE_TYPE  \
    --network-interface=network=CONTROL_PLANE_NETWORK_NAME,subnet=CONTROL_PLANE_SUBNET_NAME,nic-type=VNIC_TYPE \
    --network-interface=network=DATA_PLANE_NETWORK_NAME,subnet=DATA_PLANE_SUBNET_NAME,nic-type=VNIC_TYPE \
    --zone=ZONE

מחליפים את מה שכתוב בשדות הבאים:

  • ‫VM_NAME: שם ה-VM.

  • ‫IMAGE_FAMILY: שם משפחת התמונות של מערכת ההפעלה שדיסק האתחול יאותחל איתה. לחלופין, אפשר לציין את הדגל --image=IMAGE ולהחליף את IMAGE בגרסה ספציפית של תמונה. איך מציגים רשימה של קובצי אימג' שזמינים בפרויקט קובצי האימג' של Compute Engine

  • ‫IMAGE_PROJECT: השם של פרויקט התמונות שמכיל את קובץ אימג'.

  • ‫MACHINE_TYPE: סוג מכונה, מוגדר מראש או מותאם אישית, למכונה הווירטואלית.

  • ‫VNIC_TYPE: סוג ה-vNIC לשימוש ברשתות של מישור הבקרה ומישור הנתונים. הערך חייב להיות אחד מהבאים:

    • כדי להשתמש ב-gVNIC, מציינים GVNIC.

    • כדי להשתמש ב-VirtIO-Net, מציינים VIRTIO_NET.

  • ‫CONTROL_PLANE_NETWORK_NAME: השם של רשת מישור הבקרה שיצרתם בשלבים הקודמים.

  • ‫CONTROL_PLANE_SUBNET_NAME: השם של תת-הרשת של רשת מישור הבקרה שיצרתם בשלבים הקודמים.

  • ‫DATA_PLANE_NETWORK_NAME: השם של רשת מישור הנתונים שיצרתם בשלבים הקודמים.

  • ‫DATA_PLANE_SUBNET_NAME: השם של תת-הרשת של רשת מישור הבקרה שיצרתם אוטומטית בשלבים הקודמים.

  • ‫ZONE: האזור שבו רוצים ליצור את המכונה הווירטואלית. מציינים אזור באותו אזור של רשת המשנה שיצרתם בשלבים הקודמים.

לדוגמה, כדי ליצור מכונה וירטואלית בשם dpdk-vm בתחום (zone) us-central1-a שמציינת נפח של 512 GB של דיסק מתמיד שמבוסס על SSD, סוג מכונה מוגדר מראש C2 עם 60 vCPU, רישות Tier_1 ורשת של מישור נתונים ומישור הבקרה ששתיהן משתמשות ב-gVNIC, מריצים את הפקודה הבאה:

gcloud compute instances create dpdk-vm \
    --boot-disk-size=512GB \
    --boot-disk-type=pd-ssd \
    --image-project=ubuntu-os-cloud \
    --image-family=ubuntu-2004-lts \
    --machine-type=c2-standard-60 \
    --network-performance-configs=total-egress-bandwidth-tier=TIER_1 \
    --network-interface=network=control,subnet=control,nic-type=GVNIC \
    --network-interface=network=data,subnet=data,nic-type=GVNIC \
    --zone=us-central1-a

API

יוצרים מכונה וירטואלית שמשתמשת בשתי רשתות המשנה של רשת VPC שיצרתם בשלבים הקודמים, על ידי שליחת בקשת POST לשיטה instances.insert עם השדות הבאים:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "VM_NAME",
  "machineType": "MACHINE_TYPE",
  "disks": [
    {
      "initializeParams": {
        "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE_FAMILY"
      }
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/CONTROL_PLANE_NETWORK_NAME",
      "subnetwork": "regions/REGION/subnetworks/CONTROL_PLANE_SUBNET_NAME",
      "nicType": "VNIC_TYPE"
    },
    {
      "network": "global/networks/DATA_PLANE_NETWORK_NAME",
      "subnetwork": "regions/REGION/subnetworks/DATA_PLANE_SUBNET_NAME",
      "nicType": "VNIC_TYPE"
    }
  ]
}

מחליפים את מה שכתוב בשדות הבאים:

  • ‫PROJECT_ID: מזהה הפרויקט שבו נמצאות רשת ה-VPC של מישור הבקרה ורשת ה-VPC של מישור הנתונים.

  • ‫ZONE: האזור שבו רוצים ליצור את המכונה הווירטואלית.

  • ‫VM_NAME: שם המכונה הווירטואלית.

  • ‫MACHINE_TYPE: סוג מכונה, מוגדר מראש או מותאם אישית, למכונה הווירטואלית.

    יצירת ה-VM תיכשל.
  • ‫IMAGE_PROJECT: השם של פרויקט התמונות שמכיל את קובץ אימג'.

  • ‫IMAGE_FAMILY: שם המשפחה של התמונה של מערכת ההפעלה שדיסק האתחול יאותחל איתה. אפשר גם לציין גרסה ספציפית של תמונה. איך מציגים רשימה של קובצי אימג' בפרויקט קובצי האימג' של Compute Engine.

  • ‫CONTROL_PLANE_NETWORK_NAME: השם של רשת מישור הבקרה שיצרתם בשלבים הקודמים.

  • ‫REGION: האזור שבו נמצאות רשתות המשנה של מישור הבקרה ומישור הנתונים.

  • ‫CONTROL_PLANE_SUBNET_NAME: השם של תת-הרשת של רשת מישור הבקרה שיצרתם בשלבים הקודמים.

  • ‫VNIC_TYPE: סוג ה-vNIC שבו משתמשים ברשתות של מישור הבקרה ומישור הנתונים. הערך חייב להיות אחד מהערכים הבאים:

    • כדי להשתמש ב-gVNIC, מציינים GVNIC.

    • כדי להשתמש ב-VirtIO-Net, מציינים VIRTIO_NET.

  • ‫DATA_PLANE_NETWORK_NAME: השם של רשת מישור הנתונים שיצרתם בשלבים הקודמים.

  • ‫DATA_PLANE_SUBNET_NAME: השם של תת-הרשת של רשת מישור הבקרה שיצרתם בשלבים הקודמים.

לדוגמה, כדי ליצור מכונה וירטואלית בשם dpdk-vm בתחום (zone) us-central1-a שמציינת נפח של 512 GB של דיסק מתמיד שמבוסס על SSD, סוג מכונה מוגדר מראש C2 עם 60 מעבדי vCPU, רישות Tier_1 ורשת של מישור נתונים ומישור הבקרה ששתיהן משתמשות ב-gVNIC, שולחים את בקשת POST הבאה:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances

{
  "name": "dpdk-vm",
  "machineType": "c2-standard-60",
  "disks": [
    {
      "initializeParams": {
        "diskSizeGb": 512,
        "diskType": "pd-ssd",
        "sourceImage": "projects/ubuntu-os-cloud/global/images/family/ubuntu-2404-lts-amd64"
      },
      "boot": true
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/control",
      "subnetwork": "regions/us-central1/subnetworks/control",
      "nicType": "GVNIC"
    },
    {
      "network": "global/networks/data",
      "subnetwork": "regions/us-central1/subnetworks/data",
      "nicType": "GVNIC"
    }
  ],
  "networkPerformanceConfig": {
    "totalEgressBandwidthTier": "TIER_1"
  }
}

אפשרויות נוספות להגדרת מכונה וירטואלית זמינות במאמר יצירה והפעלה של מכונה וירטואלית.

התקנת DPDK במכונה הווירטואלית

כדי להתקין את DPDK במכונה הווירטואלית, פועלים לפי השלבים הבאים:

  1. מתחברים למכונה הווירטואלית שיצרתם בקטע הקודם באמצעות SSH.

  2. מגדירים את יחסי התלות להתקנת DPDK:

    sudo apt-get update && sudo apt-get upgrade -yq
    sudo apt-get install -yq build-essential ninja-build python3-pip \
        linux-headers-$(uname -r) pkg-config libnuma-dev
    sudo pip install pyelftools meson
    
  3. מתקינים את DPDK:

    wget https://fast.dpdk.org/rel/dpdk-23.07.tar.xz
    tar xvf dpdk-23.07.tar.xz
    cd dpdk-23.07
    
  4. כדי ליצור DPDK עם הדוגמאות:

    meson setup -Dexamples=all build
    sudo ninja -C build install; sudo ldconfig
    

התקנת מנהל התקן

כדי להכין את DPDK להפעלה במנהל התקן, מתקינים את מנהל ההתקן באחת מהשיטות הבאות:

התקנת VFIO ללא IOMMU

כדי להתקין את מנהל ההתקן VFIO ללא IOMMU, פועלים לפי השלבים הבאים:

  1. בודקים אם VFIO מופעל:

    cat /boot/config-$(uname -r) | grep NOIOMMU
    

    אם VFIO לא מופעל, צריך לפעול לפי השלבים במאמר בנושא התקנת UIO.

  2. מפעילים את מצב No-IOMMU ב-VFIO:

    sudo bash -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode'
    

התקנת UIO

כדי להתקין את מנהל ההתקן UIO ב-DPDK, בוחרים אחת מהשיטות הבאות:

התקנת UIO באמצעות git

כדי להתקין את מנהל ההתקן של UIO ב-DPDK באמצעות git:

  1. משכפלים את מאגר ה-Git‏ igb_uio לדיסק במכונה הווירטואלית:

    git clone https://dpdk.org/git/dpdk-kmods
    
  2. מהספריית אם של מאגר ה-git המשוכפל, בונים את המודול ומתקינים את מנהל ההתקן UIO ב-DPDK:

    pushd dpdk-kmods/linux/igb_uio
    sudo make
    sudo depmod && sudo insmod igb_uio.ko
    popd
    

התקנת UIO באמצעות חבילות Linux

כדי להתקין את מנהל ההתקן UIO ב-DPDK באמצעות חבילות Linux, פועלים לפי השלבים הבאים:

  1. מתקינים את החבילה dpdk-igb-uio-dkms:

    sudo apt-get install -y dpdk-igb-uio-dkms
    
  2. מתקינים את מנהל ההתקן של UIO ב-DPDK:

    sudo modprobe igb_uio
    

הכפפה של DPDK לדרייבר ובדיקה שלו

כדי לקשר את DPDK למנהל ההתקן שהתקנתם בקטע הקודם, מבצעים את הפעולות הבאות:

  1. כדי לקבל את מספר חריץ ה-Peripheral Component Interconnect‏ (PCI) של ממשק הרשת הנוכחי:

    sudo lspci | grep -e "gVNIC" -e "Virtio network device"
    

    לדוגמה, אם המכונה הווירטואלית משתמשת ב-ens4 כממשק הרשת, מספר חריץ ה-PCI הוא 00:04.0.

  2. מפסיקים את ממשק הרשת שמחובר למתאם הרשת:

    sudo ip link set NETWORK_INTERFACE_NAME down
    

    מחליפים את NETWORK_INTERFACE_NAME בשם של ממשק הרשת שצוין ברשתות ה-VPC. כדי לראות באיזה ממשק רשת ה-VM משתמש, צריך להציג את ההגדרה של ממשק הרשת:

    sudo ifconfig
    
  3. מבצעים קישור של DPDK לדרייבר:

    sudo dpdk-devbind.py --bind=DRIVER PCI_SLOT_NUMBER
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫DRIVER: הדרייבר שאליו צריך לקשור את DPDK. מציינים אחד מהערכים הבאים:

      • מנהל התקן UIO: ‏ igb_uio

      • דרייבר VFIO ללא IOMMU: ‏ vfio-pci

    • ‫PCI_SLOT_NUMBER: מספר חריץ ה-PCI של ממשק הרשת הנוכחי בפורמט 00:0NUMBER.0.

  4. יוצרים את הספרייה /mnt/huge, ואז יוצרים כמה דפי ענק כדי ש-DPDK יוכל להשתמש בהם עבור מאגרי נתונים זמניים:

    sudo mkdir /mnt/huge
    sudo mount -t hugetlbfs -o pagesize=1G none /mnt/huge
    sudo bash -c 'echo 4 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages'
    sudo bash -c 'echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages'
    
  5. כדי לבדוק ש-DPDK יכול להשתמש בממשק הרשת שיצרתם בשלבים הקודמים, מריצים את אפליקציית הדוגמה testpmd שכלולה בספריות DPDK:

    sudo ./build/app/dpdk-testpmd
    

    מידע נוסף על בדיקת DPDK זמין במאמר אפשרויות של שורת הפקודה Testpmd.

ביטול הקישור של DPDK

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

  1. מבטלים את הקישור של DPDK למנהל ההתקן:

    sudo dpdk-devbind.py -u PCI_SLOT_NUMBER
    

    מחליפים את PCI_SLOT_NUMBER במספר חריץ ה-PCI שציינתם בשלבים הקודמים. אם רוצים לאמת את מספר חריץ ה-PCI של ממשק הרשת הנוכחי:

    sudo lspci | grep -e "gVNIC" -e "Virtio network device"
    

    לדוגמה, אם המכונה הווירטואלית משתמשת ב-ens4 כממשק הרשת, מספר חריץ ה-PCI הוא 00:04.0.

  2. טוענים מחדש את מנהל ההתקן של הרשת ב-Compute Engine:

    sudo bash -c 'echo PCI_SLOT_NUMBER > /sys/bus/pci/drivers/VNIC_DIRECTORY/bind'
    sudo ip link set NETWORK_INTERFACE_NAME up
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫PCI_SLOT_NUMBER: מספר חריץ ה-PCI שציינתם בשלבים הקודמים.

    • ‫VNIC_DIRECTORY: הספרייה של כרטיס ה-NIC הווירטואלי. בהתאם לסוג ה-vNIC שבו אתם משתמשים, מציינים אחד מהערכים הבאים:

      • gVNIC: gvnic

      • ‫VirtIO-Net: virtio-pci

    • ‫NETWORK_INTERFACE_NAME: השם של ממשק הרשת שציינתם בקטע הקודם.

המאמרים הבאים