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

במאמר הזה מוסבר איך ליצור משימות שפועלות על משאבים מוזמנים ואיך לחסום משימות משימוש בהזמנות.

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

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

מידע נוסף על הזמנות זמין במסמכי התיעוד של Compute Engine בנושא הזמנות.

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

  1. אם עוד לא השתמשתם ב-Batch, כדאי לעיין במאמר תחילת העבודה עם Batch ולהפעיל את Batch על ידי השלמת הדרישות המוקדמות לפרויקטים ולמשתמשים.
  2. מוודאים שיש לכם הרשאות ליצירת הזמנה או לצפייה בהזמנה קיימת שאתם רוצים שמכונות וירטואליות של משימה ישתמשו בה לפי הצורך.
  3. כדי לקבל את ההרשאות שדרושות ליצירת משימה, אתם צריכים לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:

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

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

הגבלות

בנוסף להגבלות הכלליות על הזמנות, יש גם את ההגבלות הבאות על Batch:

  • המכונות הווירטואליות של משימה לא יכולות להשתמש בהזמנות אם אחת מהן מציינת מדיניות מיקום קומפקטית.
  • אם יוצרים עבודה באמצעות Google Cloud המסוף, המכונות הווירטואליות שלה משתמשות אוטומטית בהזמנות שתואמות להן. כדי לצרוך מקום שמור ספציפי או בלוק, או למנוע ממכונות וירטואליות לצרוך מקומות שמורים, צריך להגדיר את השדה reservation כשיוצרים משימה באמצעות ה-CLI של gcloud או Batch API.

דרישות

בקטע הזה מופיע סיכום של הדרישות לשימוש בהזמנה ב-VM של משימה. מידע נוסף על כל הדרישות זמין בדרישות הכלליות להזמנות במאמרי העזרה של Compute Engine ובתהליך לתכנון ההגדרה בהמשך המאמר הזה.

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

    • במשימת הגיבוי ובהזמנה צריך לציין מאפייני מכונה וירטואלית זהים.

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

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

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

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

יצירה והפעלה של משימה שיכולה לצרוך מכונות וירטואליות שהוזמנו מראש

  1. תכנון ההגדרה כדי לוודא שהעבודה וההזמנה תואמות, צריך לבצע את השלבים הבאים.

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

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

      • סוג הצריכה*
      • מספר המכונות הווירטואליות

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

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

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

      • פרויקט
      • אזור*
      • סוג המכונה
      • פלטפורמת מעבד מינימלית (אם יש)
      • סוג ה-GPU ומספר ה-GPU (אם יש)
      • סוג וספירה של SSD מקומי (אם יש)
      • תחום עניין משותף להזמנה#

      *המכונות הווירטואליות של העבודה צריכות להיות באותו אזור כמו המכונות הווירטואליות שהוזמנו. חובה לכלול את האזור הזה בשדה allowedLocations[] של המשרה, או שאם משמיטים את השדה allowedLocations[], צריך להגדיר את מיקום המשרה לאזור שמכיל את האזור הזה.

      חובה להגדיר את כל המאפיינים האלה בעבודת הגיבוי באמצעות שדות המשנה policy או תבנית של הגדרות מכונה. אי אפשר לציין בשדה job שילוב של שדות משנה policy ותבנית.

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

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

  2. מכינים את ההזמנה. אם עדיין לא עשיתם זאת, צרו את ההזמנה שבה מכונות ה-VM של העבודה ישתמשו. מוודאים שהמאפיינים שתיכננתם מוגדרים בהזמנה.

  3. יוצרים ומריצים את המשימה. אתם יכולים ליצור ולהריץ משימה שצורכת מכונות וירטואליות מההזמנה שהוכנה באמצעות ה-CLI של gcloud או Batch API:

    gcloud

    1. יוצרים קובץ JSON שמציין את פרטי ההגדרה של העבודה, ומגדיר את שדות המשנה של משאב מופע מכונה וירטואלית (instances[]) כך שיתאימו בדיוק למאפייני המכונה הווירטואלית של הזמנה.

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

      {
        "taskGroups": [
          {
            "taskSpec": {
              "runnables": [
                {
                  "script": {
                    "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                  }
                }
              ]
            },
            "taskCount": 3
          }
        ],
        "allocationPolicy": {
          "instances": [
            {
              VM_RESOURCES
            }
          ],
        },
        "logsPolicy": {
          "destination": "CLOUD_LOGGING"
        }
      }
      

      מחליפים את VM_RESOURCES במשאבי המכונה הווירטואלית שתואמים להזמנה שרוצים שהעבודה תשתמש בה, על ידי ציון שדות המשנה instances[] שתכננתם בשלבים הקודמים.

      לדוגמה, מתחילים מהערך הבא של VM_RESOURCES:

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "provisioningModel": "PROVISIONING_MODEL",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_URL"
      }
      

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

      1. האם רוצים להשתמש בתבנית של הגדרות מכונה?

      2. האם ההזמנה כוללת פלטפורמת CPU מינימלית?

        • כן: מחליפים את MIN_CPU_PLATFORM באותה פלטפורמת CPU מינימלית.

        • לא: מסירים את השדה minCpuPlatform.

      3. האם השריון כולל מעבדי GPU?

        • כן: מבצעים את השלבים הבאים.

          1. מחליפים את INSTALL_GPU_DRIVERS ומציינים שדות נוספים שנדרשים להתקנת מנהלי התקנים של GPU עבור המשימה הזו. הוראות מפורטות מופיעות במאמר התקנת דרייברים של GPU.
          2. מחליפים את PROVISIONING_MODEL בהתאם לאפשרות הצריכה: או STANDARD (ברירת מחדל) להזמנות או RESERVATION_BOUND להזמנות במצב יומן.
          3. מעדכנים את השדה accelerators[] בהתאם לסוג מכונת ה-GPU:

            • אם אתם משתמשים בסוג מכונה שעבר אופטימיזציה לשימוש במאיץ, צריך להסיר את השדה accelerators[].
            • אחרת, אם אתם משתמשים בסוג מכונה מסוג N1 שעבר אופטימיזציה להאצה, צריך להחליף את GPU_TYPE ואת GPU_COUNT כך שיתאימו להזמנה.
        • לא: מסירים את השדה installGpuDrivers, את השדה provisioningModel ואת השדה accelerators[].

      4. האם ההזמנה כוללת כונני SSD מקומיים?

        • Yes: מחליפים את LOCAL_SSD_SIZE ואת LOCAL_SSD_NAME כך שיתאימו להזמנה, ומפעילים את כונני ה-SSD המקומיים על ידי הוספת השדה volumes[] למשימה. לדוגמה, אפשר לעיין בדוגמת הקוד בנושא שימוש בכונני SSD מקומיים.

        • לא: מסירים את השדה disks[].

      5. האם ההזמנה משתמשת בסוג הצריכה הספציפי שמטרגטים?

        • כן: מחליפים את SPECIFIC_RESERVATION_URL בערך הבא:

          projects/RESERVATION_OWNER_PROJECT_ID/reservations/RESERVATION_NAME
          

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

          • RESERVATION_OWNER_PROJECT_ID עם מזהה הפרויקט שבו קיימת ההזמנה.

          • RESERVATION_NAME בשם ההזמנה.

        • לא: מסירים את השדה reservation.

      לדוגמה, נניח שאתם משתמשים בהזמנה עם ניצול אוטומטי של n2-standard-32 מכונות וירטואליות שלא צוינו בהן פלטפורמת CPU מינימלית, מעבדי GPU או כונני SSD מקומיים. בנוסף, אתם לא רוצים לציין תבנית של הגדרות מכונה. במקרה כזה, צריך להחליף את VM_RESOURCES בערך הבא:

      "policy": {
        "machineType": "n2-standard-32"
      }
      
    2. כדי ליצור ולהריץ את העבודה, משתמשים בפקודה gcloud batch jobs submit.

      gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
      

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

      • JOB_NAME: שם המשימה.

      • LOCATION: המיקום של המשרה. אלא אם צוין בשדה allowedLocations[] של המשרה, זה חייב להיות האזור שמכיל את האזור של ההזמנה.

      • JSON_CONFIGURATION_FILE: הנתיב לקובץ JSON עם פרטי ההגדרות של העבודה.

    API

    שולחים בקשת POST אל השיטה jobs.create שמגדירה את שדות המשנה של משאב המכונה הווירטואלית (instances[]) כך שיתאימו בדיוק למאפייני המכונה הווירטואלית של הזמנה.

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

    POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            VM_RESOURCES
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

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

    • PROJECT_ID: מזהה הפרויקט שלכם.

    • LOCATION: המיקום של המשרה. אלא אם צוין בשדה allowedLocations[] של המשרה, זה חייב להיות האזור שמכיל את האזור של ההזמנה.

    • JOB_NAME: שם המשימה.

    • VM_RESOURCES: משאבי המכונות הווירטואליות שתואמים להזמנה שרוצים שהעבודה תשתמש בה. כדי לעשות את זה, מציינים את שדות המשנה instances[] שתכננתם בשלבים הקודמים.

      לדוגמה, מתחילים מהערך הבא של VM_RESOURCES:

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "provisioningModel": "PROVISIONING_MODEL",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_URL"
      }

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

      1. האם רוצים להשתמש בתבנית של הגדרות מכונה?

      2. האם ההזמנה כוללת פלטפורמת CPU מינימלית?

        • כן: מחליפים את MIN_CPU_PLATFORM באותה פלטפורמת CPU מינימלית.

        • לא: מסירים את השדה minCpuPlatform.

      3. האם השריון כולל מעבדי GPU?

        • כן: מבצעים את השלבים הבאים.

          1. מחליפים את INSTALL_GPU_DRIVERS ומציינים שדות נוספים שנדרשים להתקנת מנהלי התקנים של GPU עבור המשימה הזו. הוראות מפורטות מופיעות במאמר התקנת דרייברים של GPU.
          2. מחליפים את PROVISIONING_MODEL בהתאם לאפשרות הצריכה: או STANDARD (ברירת מחדל) להזמנות או RESERVATION_BOUND להזמנות במצב יומן.
          3. מעדכנים את השדה accelerators[] בהתאם לסוג מכונת ה-GPU:

            • אם אתם משתמשים בסוג מכונה שעבר אופטימיזציה לשימוש במאיץ, צריך להסיר את השדה accelerators[].
            • אחרת, אם אתם משתמשים בסוג מכונה מסוג N1 שעבר אופטימיזציה להאצה, צריך להחליף את GPU_TYPE ואת GPU_COUNT כך שיתאימו להזמנה.
        • לא: מסירים את השדה installGpuDrivers, את השדה provisioningModel ואת השדה accelerators[].

      4. האם ההזמנה כוללת כונני SSD מקומיים?

        • Yes: מחליפים את LOCAL_SSD_SIZE ואת LOCAL_SSD_NAME כך שיתאימו להזמנה, ומפעילים את כונני ה-SSD המקומיים על ידי הוספת השדה volumes[] למשימה. לדוגמה, אפשר לעיין בדוגמת הקוד בנושא שימוש בכונני SSD מקומיים.

        • לא: מסירים את השדה disks[].

      5. האם ההזמנה משתמשת בסוג הצריכה הספציפי שמטרגטים?

        • כן: מחליפים את SPECIFIC_RESERVATION_URL בערך הבא:

          projects/RESERVATION_OWNER_PROJECT_ID/reservations/RESERVATION_NAME
          

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

          • RESERVATION_OWNER_PROJECT_ID עם מזהה הפרויקט שבו קיימת ההזמנה.

          • RESERVATION_NAME בשם ההזמנה.

        • לא: מסירים את השדה reservation.

      לדוגמה, נניח שאתם משתמשים בהזמנה עם ניצול אוטומטי של n2-standard-32 מכונות וירטואליות שלא צוינו בהן פלטפורמת CPU מינימלית, מעבדי GPU או כונני SSD מקומיים. בנוסף, אתם לא רוצים לציין תבנית של הגדרות מכונה. במקרה כזה, צריך להחליף את VM_RESOURCES בערך הבא:

      "policy": {
        "machineType": "n2-standard-32"
      }

יצירה והפעלה של משימה שלא יכולה לצרוך מכונות וירטואליות שמורות

כדי לחסום את האפשרות שמשימה תשתמש בהזמנות, מגדירים את השדה reservation לערך NO_RESERVATION. למידע נוסף על מניעת שימוש בשמירת מקום, אפשר לעיין במאמר בנושא מניעת שימוש בשמירת מקום על ידי מופעי מחשוב במאמרי העזרה של Compute Engine.

אפשר ליצור ולהריץ עבודה שלא יכולה לצרוך מכונות וירטואליות שמורות באמצעות ה-CLI של gcloud או Batch API.

gcloud

  1. יוצרים קובץ JSON שבו מציינים את פרטי ההגדרה של המשימה ומגדירים את השדה reservation לערך NO_RESERVATION.

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

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            "policy": {
              "reservation": "NO_RESERVATION"
            }
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    
  2. כדי ליצור ולהריץ את העבודה, משתמשים בפקודה gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

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

    • JOB_NAME: שם המשימה.

    • LOCATION: המיקום של המשרה.

    • JSON_CONFIGURATION_FILE: הנתיב לקובץ JSON עם פרטי ההגדרות של העבודה.

API

שולחים בקשת POST אל ה-method‏ jobs.create כדי להגדיר את השדה reservation לערך NO_RESERVATION.

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

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
            }
          }
        ]
      },
      "taskCount": 3
    }
  ],
  "allocationPolicy": {
    "instances": [
      {
        "policy": {
          "reservation": "NO_RESERVATION"
        }
      }
    ],
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

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

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