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

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

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

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

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

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

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

מגבלות

תמחור

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

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

כדי לשנות את מספר ה-threads לכל ליבה במהלך יצירת מכונה וירטואלית, משתמשים במסוף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 (יחס בין ליבות וירטואליות לליבות פיזיות), בוחרים את מספר ה-threads לכל ליבה.

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

gcloud

כדי לשנות את מספר ה-threads לכל ליבה במהלך יצירת מכונה וירטואלית, משתמשים בפקודה 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

כדי לשנות את מספר השרשורים לכל ליבה במהלך יצירת מכונה וירטואלית, משתמשים בשיטה 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-11"
      }
    }
  ],
  "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"
}

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

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

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

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

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

המסוף

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

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

    כניסה לדף VM instances

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

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

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

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

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

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

gcloud

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

  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: האזור שמכיל את המכונה הווירטואלית שרוצים לעדכן

REST

כדי לשנות את מספר ה-threads לכל ליבה במכונה וירטואלית קיימת, משתמשים ב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: מספר השרשורים לכל ליבה

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

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

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, הערך של מספר השרשורים לכל ליבה הוא 1, כפי שמוצג בעמודה Thread(s) per core.

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

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