הגדרת מספר השרשורים לכל ליבה

ריבוי משימות סימולטני (SMT), שנקרא במעבדי Intel בשם Hyper-Threading Technology (‏HTT), מאפשר לליבת מעבד לפעול כשני תהליכי ריבוי משימות בחומרה. ב-Compute Engine, כל מעבד וירטואלי (vCPU) מוטמע כריבוי הליכי משנה (multithread) בחומרה אחת, ושני מעבדים וירטואליים חולקים כל ליבת מעבד פיזי כברירת מחדל.

ב-Compute Engine אפשר להגדיר באופן ידני את הערך של מספר ה-threads לכל ליבה. לדוגמה, עומסי עבודה עם הבעיות הבאות יכולים להרוויח מהשבתת SMT (הגדרת מספר השרשורים לכל ליבה ל-1):

  • ביצועים: הפחתת מספר השרשורים שיכולים לפעול בכל ליבת CPU פיזית יכולה לעזור לשפר את הביצועים של עומסי עבודה שמוגבלים על ידי יכולות החישוב. האפשרות הזו מועילה לאפליקציות ולעומסי עבודה של מחשוב עתיר ביצועים (HPC) שמבצעים הרבה חישובים של נקודה צפה.

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

  • רישוי: בחלק מהסכמי הרישוי יש דרישות שקשורות למספר המעבדים הווירטואליים שבהם אתם משתמשים. הפחתת מספר השרשורים לכל ליבה מ-2 ל-1 עשויה להוזיל את עלויות הרישוי. מידע נוסף מופיע בהסכם הרישיון.

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

מגבלות

בעיות מוכרות

במסוף Google Cloud , כשמספר השרשורים לכל ליבה מוגדר כ-1, מדד ניצול המעבד גדל עד למקסימום של 50%. זו שגיאת ויזואליזציה מוכרת. הניצול בפועל של המעבד (CPU) הוא כפול ממה שמוצג.

תמחור

החיוב הוא על מספר המעבדים הווירטואליים שמוגדרים לפי סוג המכונה הווירטואלית, ולא על מספר הליכי המשנה שפועלים בכל ליבה. לדוגמה, n2-standard-8 סוג המכונה יכול להריץ עד 8 יחידות vCPU, כלומר 2 יחידות vCPU לכל אחת מ-4 ליבות ה-CPU הפיזיות. אם מחליטים להריץ רק 1 thread לכל ליבה במכונה מסוג n2-standard-8 – כלומר 4 vCPU – עדיין תחויבו על 8 vCPU. למידע נוסף על החיוב של מכונות וירטואליות, קראו את המאמר תמחור של מכונות וירטואליות.

שינוי מספר ה-threads לכל ליבה במהלך יצירת מכונה וירטואלית

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

ההרשאות שנדרשות למשימה הזו

כדי לבצע את המשימה הזו, אתם צריכים את ההרשאות הבאות:

המסוף

כדי לשנות את מספר ה-threads לכל ליבה במהלך יצירת מכונה וירטואלית, משתמשים בהליך הבא במסוףGoogle Cloud :

  1. נכנסים לדף Create an instance במסוף Google Cloud .

    כניסה לדף Create an instance

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

  3. בוחרים Region ו-Zone למכונה הווירטואלית.

  4. בוחרים משפחת מכונות ו-סוג מכונה נתמך.

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

  6. בשדה vCPUs to core ratio, בוחרים את מספר הליכי המשנה לכל ליבה.

  7. מסיימים להגדיר את שאר ההגדרות של המכונה הווירטואלית ולוחצים על יצירה.

gcloud

כדי לשנות את מספר הליכי המשנה לכל ליבה במהלך יצירת ה-VM, משתמשים בפקודה gcloud compute instances create.

לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:

  • ‫VM_NAME: השם של המכונה הווירטואלית החדשה.
  • ‫ZONE: האזור של המכונה הווירטואלית החדשה.
  • ‫MACHINE_TYPE: סוג המכונה של המכונה הווירטואלית החדשה. חייב להיות סוג מכונה עם 2 או יותר מעבדים וירטואליים.
  • ‫THREADS_PER_CORE: מספר השרשורים לכל ליבה פיזית. מגדירים את הערך 2 או 1.

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --threads-per-core=THREADS_PER_CORE

‏Windows (PowerShell)

gcloud compute instances create VM_NAME `
    --zone=ZONE `
    --machine-type=MACHINE_TYPE `
    --threads-per-core=THREADS_PER_CORE

Windows‏ (cmd.exe)

gcloud compute instances create VM_NAME ^
    --zone=ZONE ^
    --machine-type=MACHINE_TYPE ^
    --threads-per-core=THREADS_PER_CORE

אמורים לקבל תגובה שדומה לזו:

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME].
NAME: VM_NAME
ZONE: ZONE
MACHINE_TYPE: MACHINE_TYPE
PREEMPTIBLE:
INTERNAL_IP: EXTERNAL_IP
EXTERNAL_IP: INTERNAL_IP
STATUS: RUNNING

REST

כדי לשנות את מספר ה-threads לכל ליבה במהלך יצירת מכונה וירטואלית, משתמשים בשיטת instances.insert עם השדה threadsPerCore.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • ‫PROJECT_ID: מזהה הפרויקט.
  • ‫ZONE: האזור של המכונה הווירטואלית החדשה.
  • ‫MACHINE_TYPE: סוג המכונה של המכונה הווירטואלית החדשה. חייב להיות סוג מכונה עם 2 או יותר מעבדים וירטואליים.
  • ‫VM_NAME: השם של המכונה הווירטואלית החדשה.
  • ‫THREADS_PER_CORE: מספר השרשורים לכל ליבה פיזית. מגדירים את הערך 2 או 1.

ה-method של ה-HTTP וכתובת ה-URL:

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

תוכן בקשת JSON:

{
  "machineType": "projects/PROJECT_ID/zones/ZONE/machineTypes/MACHINE_TYPE",
  "name": "VM_NAME",
  "advancedMachineFeatures": {
    "threadsPerCore": THREADS_PER_CORE
  },
  "disks": [
    {
      "type": "PERSISTENT",
      "boot": true,
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/family/debian-13"
      }
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/default"
    }
  ]
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "kind": "compute#operation",
  "id": "7334609091572405391",
  "name": "operation-1663806045894-5e939085735d8-7499db32-c12fcc03",
  "zone": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE",
  "operationType": "insert",
  "targetLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME",
  "targetId": "1226375378512516273",
  "status": "RUNNING",
  "user": "EMAIL_ADDRESS",
  "progress": 0,
  "insertTime": "2022-09-21T17:20:48.751-07:00",
  "startTime": "2022-09-21T17:20:48.751-07:00",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations/operation-1663806045894-5e939085735d8-7499db32-c12fcc03"
}

שינוי מספר השרשורים לכל ליבה במכונה וירטואלית

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

ההרשאות שנדרשות למשימה הזו

כדי לבצע את המשימה הזו, אתם צריכים את ההרשאות הבאות:

  • ‫compute.instances.get בפרויקט
  • ‫compute.instances.update בפרויקט

המסוף

כדי לשנות את מספר השרשורים לכל ליבה במכונה וירטואלית קיימת, משתמשים בהליך הבא במסוף Google Cloud :

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

    כניסה לדף VM instances

  2. לוחצים על Name של המכונה הווירטואלית.

  3. לוחצים על Stop כדי לעצור את המכונה הווירטואלית. אם לא מופיעה האפשרות עצירה, לוחצים על פעולות נוספות > עצירה.

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

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

  6. בתפריט הנפתח היחס בין vCPU לליבה, בוחרים את מספר ה-threads לכל ליבה.

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

gcloud

כדי לשנות את מספר הליכי המשנה לכל ליבה ב-VM קיים:

  1. מייצאים את המאפיינים של מכונת ה-VM באמצעות הפקודה gcloud compute instances export הבאה:

    gcloud compute instances export VM_NAME \
        --destination=YAML_FILE_PATH \
        --zone=ZONE
    

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

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

    • ‫YAML_FILE_PATH: הנתיב ושם הקובץ של קובץ YAML שבו יישמרו נתוני התצורה המיוצאים

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

  2. בקובץ התצורה של ה-VM שנשמר ב-FILE_PATH, מעדכנים את הערך של threadsPerCore. אם הערך לא נמצא בקובץ, מוסיפים את השורה הבאה:

    advancedMachineFeatures:
      threadsPerCore: THREADS_PER_CORE
    
  3. מעדכנים את ה-VM במספר החדש של הליכי המשנה לכל ליבה באמצעות הפקודה הבאה של gcloud compute instances update-from-file:

    gcloud compute instances update-from-file VM_NAME \
        --source=FILE_PATH \
        --most-disruptive-allowed-action=RESTART \
        --zone=ZONE
    

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

    • ‫VM_NAME: השם של המכונה הווירטואלית שרוצים לעדכן

    • ‫FILE_PATH: הנתיב לקובץ התצורה המעודכן של המכונה הווירטואלית

    • ‫ZONE: האזור שבו נמצאת ה-VM שרוצים לעדכן

REST

כדי לשנות את מספר השרשורים לכל ליבה במכונה וירטואלית קיימת, משתמשים בשיטה instances.update הבאה:

PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME?most_disruptive_allowed_action=RESTART

{
  ...
  "advanced_machine_features": {
    ...
    "threadsPerCore": "THREADS_PER_CORE"
  },
  ...
}

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

  • ‫PROJECT_ID: מזהה הפרויקט

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

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

  • ‫THREADS_PER_CORE: מספר ה-threads לכל ליבה

צפייה במספר השרשורים לכל ליבה

כדי לראות את מספר השרשורים לכל ליבה, משתמשים בהליך שמתאים למערכת ההפעלה שפועלת במכונה הווירטואלית.

Linux

כדי לראות את מספר השרשורים לכל ליבה במכונות וירטואליות מבוססות Linux, משתמשים בהליך הבא:

  1. מתחברים ל-VM של Linux.

  2. מריצים את הפקודה lscpu.

    lscpu
    
  3. בודקים את הפלט כדי לראות את מספר השרשורים לכל ליבה.

    בדוגמה הבאה של פלט ממכונת n2-standard-16, הערך של מספר השרשורים לכל ליבה הוא 1, כפי שמוצג בשורה Thread(s) per core.

    ...
    CPU(s):                          8
    On-line CPU(s) list:             0-7
    Thread(s) per core:              1
    Core(s) per socket:              8
    Socket(s):                       1
    NUMA node(s):                    1
    Vendor ID:                       GenuineIntel
    CPU family:                      6
    Model:                           85
    Model name:                      Intel(R) Xeon(R) CPU @ 2.80GHz
    ...
    

Windows

כדי לראות את מספר השרשורים לכל ליבה במכונות וירטואליות מבוססות Windows, משתמשים בהליך הבא:

  1. מתחברים ל-VM של Windows.

  2. מפעילים את Powershell.

  3. מריצים את הפקודה הבאה.

    Get-WmiObject -Class Win32_processor | Select-Object NumberOfCores, @{Name="Thread(s) per core";Expression={$_.NumberOfLogicalProcessors/$_.NumberOfCores}}
    
  4. בודקים את הפלט כדי לראות את מספר השרשורים לכל ליבה.

    בדוגמה הבאה של פלט ממכונת n2-standard-16, הערך של מספר ה-threads לכל ליבה הוא 1, כפי שמוצג בעמודה Thread(s) per core.

    NumberOfCores Thread(s) per core
    ------------- ------------------
                8                  1
    

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