إنشاء صيغة لتوسيع نطاق عقد الحوسبة تلقائيا في تجمع Batch

يمكن لـ Azure Batch تغيير حجم التجمعات تلقائياً استناداً إلى المعلمات التي تحددها، ما يوفر لك الوقت والمال. باستخدام القياس التلقائي، يضيف Batch عقداً ديناميكياً إلى مجموعة مع زيادة متطلبات المهام، ويزيل عقد الحوسبة مع انخفاض متطلبات المهام.

لتمكين القياس التلقائي على مجموعة من عُقد الحوسبة، فإنك تربط المجموعة بصيغة مقياس تلقائي تحددها أنت. تستخدم خدمة Batch معادلة القياس التلقائي لتحديد عدد العقد اللازمة لتنفيذ عبء العمل الخاص بك. يمكن أن تكون هذه العقد عقدا مخصصة أو عقد Azure Spot. تقوم Batch بمراجعة بيانات مقاييس الخدمة بشكل دوري واستخدامها لضبط عدد العقد في التجمع استنادا إلى الصيغة وفي فاصل زمني تحدده.

يمكنك تمكين القياس التلقائي عند إنشاء تجمع، أو تطبيقه على تجمع موجود. يتيح لك Batch تقييم الصيغ قبل تعيينها إلى تجمعات ومراقبة حالة عمليات تشغيل التحجيم التلقائي. بمجرد تكوين تجمع مع التحجيم التلقائي، يمكنك إجراء تغييرات على الصيغة لاحقاً.

هام

عند إنشاء حساب Batch، يمكنك تحديد وضع تخصيص التجمع، والذي يحدد ما إذا كانت المستودعات مخصصة في اشتراك الخدمة المجمعة (الافتراضي) أو في اشتراك المستخدم الخاص بك. إذا قمت بإنشاء حساب Batch الخاص بك باستخدام التكوين الافتراضي لخدمة Batch، فسيكون حسابك مقيداً بأقصى عدد من المراكز التي يمكن استخدامها للمعالجة. تعمل خدمة Batch على قياس عقد الحساب حتى هذا الحد الأساسي فقط. لهذا السبب، قد لا تصل خدمة Batch إلى العدد المستهدف لعقد الحوسبة المحددة بواسطة صيغة مقياس تلقائي. لمعرفة كيفية عرض الحصص النسبية لحسابك وزيادةها، راجع الحصص النسبية والحدود لخدمة Azure Batch.

إذا قمت بإنشاء حسابك باستخدام وضع اشتراك المستخدم، فسيشارك حسابك في الحصة الأساسية للاشتراك. لمزيد من المعلومات، راجع حدود الأجهزة الظاهرية في اشتراك Azure وحدود الخدمة والحصص والقيود.

صيغ تحجيم تلقائي

صيغة تحجيم تلقائي هي قيمة سلسلة تحددها وتحتوي على جملة واحدة أو أكثر. يتم تعيين صيغة التحجيم تلقائي لعنصر autoScaleFormula (Batch REST) ​​أو خاصية CloudPool.AutoScaleFormula (Batch .NET). تستخدم خدمة Batch الصيغة الخاصة بك لتحديد العدد المستهدف لعقد الحوسبة في التجمع للفاصل الزمني التالي من المعالجة. لا يمكن أن تتجاوز سلسلة الصيغة 8 كيلوبايت، ويمكن أن تتضمن ما يصل إلى 100 عبارة مفصولة بفواصل منقوطة، ويمكن أن تتضمن فواصل أسطر وتعليقات.

يمكنك التفكير في صيغ التحجيم التلقائي ك "لغة" للتحجيم التلقائي للدفعة. عبارات الصيغ هي تعبيرات حرة يمكن أن تتضمن كلا من المتغيرات المعرفة من قبل الخدمة، والتي يتم تعريفها بواسطة خدمة Batch، والمتغيرات المعرفة من قبل المستخدم. يمكن للصيغ إجراء عمليات مختلفة على هذه القيم باستخدام الأنواع والمشغلات والوظائف المضمنة. على سبيل المثال، قد يتخذ البيان الشكل التالي:

$myNewVariable = function($ServiceDefinedVariable, $myCustomVariable);

تحتوي الصيغ بشكل عام على عبارات متعددة تؤدي عمليات على القيم التي تم الحصول عليها في البيانات السابقة. على سبيل المثال، أولا تحصل على قيمة ل variable1، ثم مررها إلى دالة لملء variable2:

$variable1 = function1($ServiceDefinedVariable);
$variable2 = function2($OtherServiceDefinedVariable, $variable1);

قم بتضمين هذه العبارات في صيغة القياس التلقائي للوصول إلى العدد المستهدف لعقد الحساب. لكل من العقد المخصصة وعقد Spot إعدادات الهدف الخاصة بها. يُمكن أن تتضمن صيغة القياس التلقائي قيمة مستهدفة للعقد المخصصة، أو قيمة مستهدفة لعقد Spot، أو كليهما.

قد يكون العدد المستهدف للعقد أعلى أو أقل أو نفس العدد الحالي من العقد من هذا النوع في التجمع. تقوم Batch بتقييم صيغة التحجيم التلقائي للتجمع في فواصل زمنية محددة للتحجيم التلقائي. تضبط Batch الرقم المستهدف لكل نوع من أنواع العقدة في التجمع إلى الرقم الذي تحدده صيغة القياس التلقائي في وقت التقييم.

عينة من الصيغ ذات المقياس التلقائي

تظهر الأمثلة التالية صيغتين للتحجيم التلقائي، يمكن ضبطهما للعمل مع معظم السيناريوهات. يمكن تعديل المتغيرين startingNumberOfVMs وmaxNumberofVMs في أمثلة الصيغ وفقاً لاحتياجاتك.

المهام العالقة

باستخدام صيغة القياس التلقائي هذه، يتم إنشاء التجمع مبدئياً باستخدام جهاز افتراضي واحد. يحدد المقياس $PendingTasks عدد المهام قيد التشغيل أو في قائمة الانتظار. تعثر الصيغة على متوسط ​​عدد المهام المعلقة في آخر 180 ثانية وتعين المتغير $TargetDedicatedNodes وفقاً لذلك. تضمن الصيغة عدم تجاوز العدد المستهدف للعقد المخصصة 25 VM أبداً. كلما تم إرسال المهام الجديدة، نما التجمع تلقائياً. عند اكتمال المهام، تصبح الأجهزة الافتراضية مجانية وتقلص صيغة القياس التلقائي المجموعة.

تعمل هذه الصيغة على قياس العقد المخصصة، ولكن يمكن تعديلها لتطبيق مقياس عقد Spot أيضًا.

startingNumberOfVMs = 1;
maxNumberofVMs = 25;
pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);
pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));
$TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);
$NodeDeallocationOption = taskcompletion;

هام

حاليا، تحتوي خدمة الدفعات على قيود مع دقة المهام المعلقة. عند إضافة مهمة إلى المهمة، تتم إضافتها أيضا إلى قائمة انتظار داخلية تستخدمها خدمة Batch للجدولة. إذا تم حذف المهمة قبل جدولتها، فقد تستمر المهمة داخل قائمة الانتظار، مما يؤدي إلى استمرار حسابها في $PendingTasks. سيتم مسح هذه المهمة المحذوفة في النهاية من قائمة الانتظار عندما تصادف Batch فرصة سحب المهام من قائمة الانتظار لجدولة العقد الخاملة في تجمع Batch.

العقد المستبعدة

ينشئ هذا المثال تجمعًا يبدأ بـ 25 عقدة Spot. في كل مرة يتم فيها استباق عقدة Spot، يتم استبدالها بعقدة مخصصة. كما في المثال الأول، يمنع المتغير maxNumberofVMs التجمع من تجاوز 25 VMs. هذا المثال مفيد للاستفادة من Spot VMs مع ضمان حدوث عدد ثابت فقط من الاستباقات طوال مدة بقاء التجمع.

maxNumberofVMs = 25;
$TargetDedicatedNodes = min(maxNumberofVMs, $PreemptedNodeCount.GetSample(180 * TimeInterval_Second));
$TargetLowPriorityNodes = min(maxNumberofVMs , maxNumberofVMs - $TargetDedicatedNodes);
$NodeDeallocationOption = taskcompletion;

ستتعرف على المزيد حول كيفية إنشاء صيغ التحجيم التلقائي والاطلاع على المزيد من أمثلة صيغ التحجيم التلقائي لاحقا في هذه المقالة.

المتغيرات

يمكنك استخدام كل من المتغيرات المعرفة من قبل الخدمة والمتغيرات المحددة من قبل المستخدم في صيغ القياس التلقائي.

المتغيرات المعرفة بالخدمة مضمنة في خدمة Batch. بعض المتغيرات المعرفة بواسطة الخدمة هي للقراءة والكتابة وبعضها للقراءة فقط.

المتغيرات المعرفة من قبل المستخدم هي المتغيرات التي تحددها. في المثال السابق، $TargetDedicatedNodes و $PendingTasks هي متغيرات معرفة من قبل الخدمة، بينما startingNumberOfVMs maxNumberofVMs و هي متغيرات معرفة من قبل المستخدم.

إشعار

دائماً ما تسبق المتغيرات المعرفة بواسطة الخدمة علامة الدولار ($). بالنسبة للمتغيرات المعرفة من قبل المستخدم، فإن علامة الدولار اختيارية.

تظهر الجداول التالية متغيرات القراءة والكتابة والقراءة فقط المعرفة بواسطة خدمة Batch.

قراءة وكتابة المتغيرات المعرفة من قبل الخدمة

يمكنك الحصول على قيم هذه المتغيرات المعرفة بواسطة الخدمة وتعيينها لإدارة عدد عقد الحساب في مجموعة.

المتغير ‏‏الوصف
$TargetDedicatedNodes العدد المستهدف لعقد الحوسبة المخصصة للمجمع. محدد كهدف لأن التجمع قد لا يحقق دائما العدد المطلوب من العقد. على سبيل المثال، إذا تم تعديل العدد المستهدف للعقد المخصصة من خلال تقييم مقياس تلقائي قبل أن يصل التجمع إلى الهدف الأولي، فقد لا يصل التجمع إلى الهدف.

قد لا يحقق التجمع في حساب تم إنشاؤه في وضع خدمة Batch هدفه إذا تجاوز الهدف عقدة حساب Batch أو الحصة النسبية الأساسية. قد لا يحقق التجمع في حساب تم إنشاؤه في وضع اشتراك المستخدم هدفه إذا تجاوز الهدف الحصة الأساسية المشتركة للاشتراك.
$TargetLowPriorityNodes العدد المستهدف لعقد حساب Spot للتجمع. محدد كهدف لأن التجمع قد لا يحقق دائما العدد المطلوب من العقد. على سبيل المثال، إذا تم تعديل العدد المستهدف من العقد Spot من خلال تقييم مقياس تلقائي قبل أن يصل التجمع إلى الهدف الأولي، فقد لا يصل التجمع إلى الهدف. قد لا يحقق التجمع أيضا هدفه إذا تجاوز الهدف عقدة حساب Batch أو الحصة النسبية الأساسية.

لمزيد من المعلومات حول عقد حساب Spot، راجع استخدام Spot VMs مع Batch.
NodeDeallocationOption دولار الإجراء الذي يحدث عند إزالة عقد الحساب من مخزن. القيم المحتملة هي:
- Requeue: القيمة الافتراضية. إنهاء المهام على الفور وإعادة وضعها في قائمة انتظار المهمة بحيث تتم إعادة جدولتها. يضمن هذا الإجراء الوصول إلى العدد المستهدف من العقد في أسرع وقت ممكن. ومع ذلك، قد يكون أقل كفاءة، لأن أي مهام قيد التشغيل تتم مقاطعتها ثم يجب إعادة تشغيلها.
- terminate: إنهاء المهام فوراً وإزالتها من قائمة انتظار المهام.
- taskcompletion: انتظار انتهاء المهام قيد التشغيل حالياً ثم إزالة العقدة من التجمع. استخدم هذا الخيار لتجنب مقاطعة المهام واستعادتها، ما يؤدي إلى إضاعة أي عمل قامت به المهمة.
- retaineddata: انتظار تنظيف كافة البيانات المحلية التي تحتفظ بها المهمة على العقدة قبل إزالة العقدة من التجمع.

إشعار

يمكن أيضاً تحديد المتغير $TargetDedicatedNodes باستخدام الاسم المستعار $TargetDedicated. وبالمثل، يمكن تحديد المتغير $TargetLowPriorityNodes باستخدام الاسم المستعار $TargetLowPriority. إذا تم تعيين كل من المتغير المسمى بالكامل واسمه المستعار بواسطة الصيغة، فإن القيمة المعينة للمتغير المسمى بالكامل لها الأسبقية.

متغيرات خدمة محددة للقراءة فقط

يمكنك الحصول على قيمة هذه المتغيرات المعرفة بواسطة الخدمة لإجراء تعديلات تستند إلى مقاييس من خدمة Batch.

هام

لا يتم تضمين مهام إصدار الوظيفة حاليا في المتغيرات التي توفر عدد المهام، مثل $ActiveTasks و $PendingTasks. اعتماداً على صيغة القياس التلقائي، يمكن أن يؤدي ذلك إلى إزالة العقد مع عدم توفر عقد لتشغيل مهام إصدار المهام.

تلميح

هذه المتغيرات المعرفة من قبل الخدمة للقراءة فقط هي كائنات توفر طرقاً مختلفة للوصول إلى البيانات المرتبطة بكل منها. لمزيد من المعلومات، راجع الحصول على بيانات نموذجية لاحقاً في هذه المقالة.

المتغير ‏‏الوصف
$CPUPercent متوسط ​​نسبة استخدام وحدة المعالجة المركزية.
$ActiveTasks عدد المهام الجاهزة للتنفيذ ولكن لم يتم تنفيذها بعد. يتضمن هذا جميع المهام الموجودة في الحالة النشطة والتي تم استيفاء تبعياتها. يتم استبعاد أي مهام في الحالة النشطة ولكن لم يتم استيفاء تبعياتها من $ActiveTasks العدد. بالنسبة لمهمة متعددة المثيلات، $ActiveTasks تتضمن عدد المثيلات المعينة على المهمة.
$RunningTasks عدد المهام في حالة التشغيل.
$PendingTasks مجموع $ActiveTasks و $RunningTasks.
$SucceededTasks عدد المهام التي انتهت بنجاح.
$FailedTasks عدد المهام التي فشلت.
$TaskSlotsPerNode عدد فتحات المهام التي يمكن استخدامها لتشغيل المهام المتزامنة على عقدة حساب واحدة في التجمع.
$CurrentDedicatedNodes العدد الحالي لعقد الحوسبة المخصصة.
$CurrentLowPriorityNodes العدد الحالي لعقد حساب Spot، بما في ذلك أي عقد تم استباقها.
$UsableNodeCount عدد عقد الحوسبة القابلة للاستخدام.
$PreemptedNodeCount عدد العقد في التجمع الموجودة في حالة استباق.

إشعار

استخدم $RunningTasks عند القياس استناداً إلى عدد المهام قيد التشغيل في وقت معين، و$ActiveTasks عند القياس استناداً إلى عدد المهام الموجودة في قائمة الانتظار للتشغيل.

الأنواع

تدعم صيغ Autoscale الأنواع التالية:

  • مزدوج
  • doubleVec
  • doubleVecList
  • سلسلة
  • الطابع الزمني -- بنية مركبة تحتوي على الأعضاء التالين:
    • year
    • الشهر (1-12)
    • اليوم (1-31)
    • يوم من أيام الأسبوع (بتنسيق رقم، على سبيل المثال، 1 ليوم الاثنين)
    • ساعة (بتنسيق رقم 24 ساعة؛ على سبيل المثال، 13 تعني 1 مساءً)
    • دقيقة (00-59)
    • ثانية (00-59)
  • فاصل زمني
    • TimeInterval_Zero
    • TimeInterval_100ns
    • TimeInterval_Microsecond
    • TimeInterval_Millisecond
    • TimeInterval_Second
    • TimeInterval_Minute
    • TimeInterval_Hour
    • TimeInterval_Day
    • TimeInterval_Week
    • TimeInterval_Year

العمليات

يُسمح بهذه العمليات على الأنواع المذكورة في القسم السابق.

العملية العوامل المدعومة نوع النتيجة
double operator double +, -, *, / مزدوج
double operator timeinterval * الفاصل الزمني
doubleVec operator double +, -, *, / doubleVec
doubleVec operator doubleVec +, -, *, / doubleVec
timeinterval operator double *, / الفاصل الزمني
timeinterval operator timeinterval +, - الفاصل الزمني
timeinterval operator timestamp + الطابع الزمني
timestamp operator timeinterval + الطابع الزمني
timestamp operator timestamp - الفاصل الزمني
operator double -, ! مزدوج
operator timeinterval - الفاصل الزمني
double operator double <، <=، ==، >=، ، >! = مزدوج
string operator string <، <=، ==، >=، ، >! = مزدوج
timestamp operator timestamp <، <=، ==، >=، ، >! = مزدوج
timeinterval operator timeinterval <، <=، ==، >=، ، >! = مزدوج
double operator double &&, || مزدوج

يؤدي اختبار مزدوج مع عامل تشغيل ثلاثي (double ? statement1 : statement2)، إلى عدم الصفر على أنه صحيح، و صفر كخطأ.

الوظائف

يمكنك استخدام هذه الوظائف المحددة مسبقاً عند تعريف صيغة مقياس تلقائي.

الدالة نوع الإرجاع ‏‏الوصف
avg(doubleVecList) مزدوج تُرجع القيمة المتوسطة لجميع القيم في doubleVecList.
ceil(مزدوج) مزدوج إرجاع أصغر قيمة عدد صحيح لا تقل عن القيمة المزدوجة.
ceil(doubleVecList) doubleVec إرجاع المكون من ceil doubleVecList.
طابق (مزدوج) مزدوج إرجاع أكبر قيمة عدد صحيح ليست أكبر من القيمة المزدوجة.
floor(doubleVecList) doubleVec إرجاع المكون من floor doubleVecList.
len(doubleVecList) مزدوج تُرجع طول المتجه الذي تم إنشاؤه من DoubleVecList.
lg(double) مزدوج تُرجع قاعدة اللوغاريتمات المزدوجة للأساس 2.
lg(doubleVecList) doubleVec إرجاع المكون من lg doubleVecList.
ln(double) مزدوج إرجاع اللوغاريثم الطبيعي للمضاعفة.
ln(doubleVecList) doubleVec إرجاع المكون من ln doubleVecList.
سجل (مزدوج) مزدوج تُرجع قاعدة اللوغاريتمات المزدوجة للأساس 10.
log(doubleVecList) doubleVec إرجاع المكون من log doubleVecList.
max(doubleVecList) مزدوج تُرجع القيمة القصوى في doubleVecList.
min(doubleVecList) مزدوج تُرجع الحد الأدنى للقيمة في doubleVecList.
norm(doubleVecList) مزدوج إرجاع المعيار الثنائي للمتجه الذي تم إنشاؤه من DoubleVecList.
النسبة المئوية (doubleVec v، double p) مزدوج إرجاع العنصر المئوي للمتجه v.
rand() مزدوج تُرجع قيمة عشوائية بين 0.0 و1.0.
range(doubleVecList) مزدوج تُرجع الفرق بين القيم الدنيا والقيم القصوى في DoubleVecList.
round(double) مزدوج إرجاع أقرب قيمة عدد صحيح إلى القيمة المزدوجة (بتنسيق الفاصلة العائمة)، وتقريب الحالات في منتصف الطريق بعيدا عن الصفر.
round(doubleVecList) doubleVec إرجاع المكون من round doubleVecList.
std(doubleVecList) مزدوج تُرجع نموذج الانحراف المعياري للقيم الموجودة في doubleVecList.
stop() يوقف تقييم تعبير القياس التلقائي.
sum(doubleVecList) مزدوج تُرجع مجموع كل مكونات DoubleVecList.
time(string dateTime="") الطابع الزمني يُرجع الطابع الزمني للوقت الحالي إذا لم يتم تمرير أي معلمات، أو يُرجع الطابع الزمني لسلسلة التاريخ والوقت إذا تم تمريره. تنسيقات التاريخ والوقت المدعومة هي W3C-DTF وRFC 1123.
فال (دوبل فيك ضد، مزدوجة ط) مزدوج لعرض قيمة العنصر الموجود في الموقع i في المتجه v، بمؤشر بداية من الصفر.

يمكن لبعض الدوال الموضحة في الجدول السابق قبول قائمة كوسيطة. القائمة المفصولة بفواصل هي أي مجموعة من double وdoubleVec. على سبيل المثال:

doubleVecList := ( (double | doubleVec)+(, (double | doubleVec) )* )?

يتم تحويل قيمة doubleVecList إلى قيمة doubleVec واحدة قبل التقييم. على سبيل المثال، إذا كان v = [1,2,3]، فإن استدعاء avg(v) يعادل استدعاء avg(1,2,3). يعادل الاتصال بـ avg(v, 7) استدعاء avg(1,2,3,7).

المقاييس

يمكنك استخدام كل من مقاييس الموارد والمهمة عند تعريف صيغة. يمكنك ضبط العدد المستهدف للعقد المخصصة في التجمع بناءً على بيانات المقاييس التي تحصل عليها وتقيمها. لمزيد من المعلومات حول كل مقياس، راجع قسم المتغيرات .

مقياس ‏‏الوصف
مورد تعتمد مقاييس الموارد على وحدة المعالجة المركزية والنطاق الترددي واستخدام الذاكرة لعقد الحوسبة وعدد العقد.

هذه المتغيرات المعرفة بالخدمة مفيدة لإجراء تعديلات على أساس عدد العقد:
- $TargetDedicatedNodes
- $TargetLowPriorityNodes
- $CurrentDedicatedNodes
- $CurrentLowPriorityNodes
- $PreemptedNodeCount
- $UsableNodeCount

هذه المتغيرات المعرفة من قبل الخدمة مفيدة لإجراء تعديلات استنادا إلى استخدام موارد العقدة:
- $CPUPercent
مهمة تستند مقاييس المهام إلى حالة المهام، مثل نشطة ومعلقة ومكتملة. المتغيرات التالية المعرفة من قبل الخدمة مفيدة لإجراء تعديلات حجم التجمع استنادا إلى مقاييس المهام:
- $ActiveTasks
- $RunningTasks
- $PendingTasks
- $SucceededTasks
- $FailedTasks

الحصول على بيانات العينة

تتمثل العملية الأساسية لصيغة التحجيم التلقائي في الحصول على بيانات مقاييس المهام والموارد (العينات)، ثم ضبط حجم التجمع استنادا إلى تلك البيانات. على هذا النحو، من المهم أن يكون لديك فهم واضح لكيفية تفاعل صيغ القياس التلقائي مع العينات.

الأساليب

تعمل صيغ القياس التلقائي على عينات من البيانات المترية التي تقدمها خدمة Batch. تعمل الصيغة على زيادة عقد حساب التجمع أو تقليصها استنادا إلى القيم التي تحصل عليها. المتغيرات المعرفة من قبل الخدمة هي كائنات توفر أساليب للوصول إلى البيانات المقترنة بهذا الكائن. على سبيل المثال، يُظهر التعبير التالي طلباً للحصول على آخر خمس دقائق من استخدام وحدة المعالجة المركزية:

$CPUPercent.GetSample(TimeInterval_Minute * 5)

يمكن استخدام الطرق التالية للحصول على بيانات نموذجية حول المتغيرات المعرفة من قبل الخدمة.

الطريقة ‏‏الوصف
GetSample() تعرض الطريقة GetSample() متجهاً لعينات البيانات.

تبلغ قيمة العينة 30 ثانية من بيانات المقاييس. بمعنى آخر، يتم الحصول على العينات كل 30 ثانية. ولكن كما هو موضح أدناه، هناك تأخير بين وقت جمع العينة ومتى تكون متاحة للصيغة. على هذا النحو، قد لا تكون جميع العينات لفترة زمنية معينة متاحة للتقييم بواسطة صيغة.

- doubleVec GetSample(double count): يحدد عدد العينات المطلوب الحصول عليها من أحدث العينات التي تم جمعها. تقوم GetSample(1) بإرجاع آخر عينة متاحة. بالنسبة لمقاييس مثل $CPUPercent، ومع ذلك، لا ينبغي استخدام GetSample(1)، لأنه من المستحيل معرفة متى تم جمع العينة. قد يكون حديثاً، أو قد يكون أقدم بكثير بسبب مشكلات في النظام. في مثل هذه الحالات، من الأفضل استخدام الفاصل الزمني كما هو موضح أدناه.

- doubleVec GetSample((timestamp or timeinterval) startTime [, double samplePercent]): تحديد إطار زمني لتجميع عينات البيانات. اختيارياً، تحدد أيضاً النسبة المئوية للعينات التي يجب أن تكون متاحة في الإطار الزمني المطلوب. على سبيل المثال، قد يعرض $CPUPercent.GetSample(TimeInterval_Minute * 10) 20 عينة إذا كانت جميع العينات الخاصة بالدقائق العشر الأخيرة موجودة في السجل CPUPercent. إذا لم تكن اللحظة الأخيرة من التاريخ متاحة، فسيتم إرجاع 18 عينة فقط. في هذه الحالة، سيفشل $CPUPercent.GetSample(TimeInterval_Minute * 10, 95) نظراً لتوفر 90 بالمائة فقط من العينات، ولكن سينجح $CPUPercent.GetSample(TimeInterval_Minute * 10, 80).

- doubleVec GetSample((timestamp or timeinterval) startTime, (timestamp or timeinterval) endTime [, double samplePercent]): يحدد إطاراً زمنياً لجمع البيانات، بوقت البدء ووقت الانتهاء. كما ذكر أعلاه، هناك تأخير بين وقت تجميع العينة ومتى تصبح متاحة للصيغة. ضع في اعتبارك هذا التأخير عند استخدام طريقة GetSample. انظر GetSamplePercent أدناه.
GetSamplePeriod() لعرض فترة العينات التي تم أخذها في مجموعة بيانات نموذجية تاريخية.
Count() إرجاع العدد الإجمالي للعينات في محفوظات المقاييس.
HistoryBeginTime() إرجاع الطابع الزمني لأقدم عينة بيانات متوفرة للمقياس.
GetSamplePercent() إرجاع النسبة المئوية للعينات المتوفرة لفترة زمنية معينة. على سبيل المثال، doubleVec GetSamplePercent( (timestamp or timeinterval) startTime [, (timestamp or timeinterval) endTime] ) نظراً لأن الطريقة GetSample تفشل إذا كانت النسبة المئوية للعينات التي تم إرجاعها أقل من samplePercent المحدد، يمكنك استخدام الطريقة GetSamplePercent للتحقق أولاً. ثم يمكنك تنفيذ إجراء بديل في حالة وجود عينات غير كافية، دون إيقاف تقييم القياس التلقائي.

العينات

تأخذ خدمة Batch بشكل دوري عينات من مقاييس المهام والموارد وتجعلها متاحة لصيغ القياس التلقائي. يتم تسجيل هذه العينات كل 30 ثانية بواسطة خدمة Batch. ومع ذلك، عادة ما يكون هناك تأخير بين وقت تسجيل هذه العينات ومتى يتم توفيرها لصيغ التحجيم التلقائي (والقراءة حسبها). بالإضافة إلى ذلك، قد لا يتم تسجيل العينات لفترة زمنية معينة بسبب عوامل مثل مشكلات الشبكة أو البنية الأساسية الأخرى.

النسبة المئوية للعينة

عند samplePercent تمرير إلى GetSample() الأسلوب أو GetSamplePercent() استدعاء الأسلوب، تشير النسبة المئوية إلى مقارنة بين إجمالي العدد المحتمل للعينات المسجلة بواسطة خدمة Batch وعدد العينات المتوفرة لصيغة التحجيم التلقائي.

دعونا ننظر إلى فترة زمنية مدتها 10 دقائق كمثال. نظرا لتسجيل العينات كل 30 ثانية خلال تلك الفترة الزمنية البالغة 10 دقائق، فإن الحد الأقصى لإجمالي عدد العينات المسجلة بواسطة Batch سيكون 20 عينة (2 في الدقيقة). ومع ذلك، نظرا لزمن الانتقال المتأصل في آلية إعداد التقارير والمشكلات الأخرى داخل Azure، قد يكون هناك 15 عينة فقط متوفرة لصيغة التحجيم التلقائي للقراءة. لذلك، على سبيل المثال، بالنسبة لفترة ال 10 دقائق هذه، قد تتوفر الصيغة بنسبة 75 بالمائة فقط من إجمالي عدد العينات المسجلة.

GetSample() ونطاقات العينة

تنمو صيغ التحجيم التلقائي وتقليص التجمعات عن طريق إضافة العقد أو إزالتها. نظرا لأن العقد تكلفك أموالا، فتأكد من أن الصيغ تستخدم طريقة تحليل ذكية تستند إلى بيانات كافية. من المستحسن استخدام تحليل من النوع الأكثر اتجاها في الصيغ. ينمو هذا النوع ويقلص أحواض السباحة الخاصة بك بناءً على مجموعة من العينات التي تم جمعها.

للقيام بذلك، استخدم GetSample(interval look-back start, interval look-back end) لإرجاع متجه من العينات:

$runningTasksSample = $RunningTasks.GetSample(1 * TimeInterval_Minute, 6 * TimeInterval_Minute);

عندما تقوم Batch بتقييم السطر أعلاه، فإنها ترجع مجموعة من العينات كمتجه للقيم. على سبيل المثال:

$runningTasksSample=[1,1,1,1,1,1,1,1,1,1];

بعد جمع متجه العينات، يمكنك بعد ذلك استخدام دالات مثل min()و max()و avg() لاشتقاق قيم ذات معنى من النطاق الذي تم جمعه.

لتوخي المزيد من الحذر، يمكنك فرض فشل تقييم الصيغة إذا كان أقل من عينة مئوية معينة متاحة لفترة زمنية معينة. عندما تفرض فشل تقييم صيغة، فإنك ترشد Batch إلى إيقاف مزيد من التقييم للصيغة إذا لم تكن النسبة المئوية المحددة للعينات متوفرة. في هذه الحالة، لا يتم إجراء أي تغيير على حجم التجمع. لتحديد النسبة المئوية المطلوبة من العينات لنجاح التقييم، حددها كمعامل ثالث لـ GetSample(). هنا، يتم تحديد متطلبات 75 بالمائة من العينات:

$runningTasksSample = $RunningTasks.GetSample(60 * TimeInterval_Second, 120 * TimeInterval_Second, 75);

نظرا لأنه قد يكون هناك تأخير في توفر العينة، يجب عليك دائما تحديد نطاق زمني مع وقت بدء البحث عن الخلف أقدم من دقيقة واحدة. يستغرق نشر العينات عبر النظام دقيقة واحدة تقريبا، لذلك قد لا تتوفر العينات في النطاق (0 * TimeInterval_Second, 60 * TimeInterval_Second) . مرة أخرى، يمكنك استخدام معلمة النسبة المئوية GetSample() لفرض متطلب نسبة عينة معينة.

هام

نوصي بشدة بتجنب الاعتماد فقط على GetSample(1) في صيغ القياس التلقائي. وذلك لأن GetSample(1) يقول أساسا لخدمة الدفعات، "أعطني العينة الأخيرة التي كان لديك، بغض النظر عن المدة التي قمت باستردادها." نظرا لأنها عينة واحدة فقط، وقد تكون عينة قديمة، فقد لا تمثل الصورة الأكبر للمهمة الأخيرة أو حالة المورد. إذا كنت تستخدم GetSample(1)، فتأكد من أنه جزء من بيان أكبر وليس نقطة البيانات الوحيدة التي تعتمد عليها صيغتك.

اكتب صيغة مقياس تلقائي

يمكنك إنشاء صيغة مقياس تلقائي عن طريق تكوين عبارات تستخدم المكونات المذكورة أعلاه، ثم دمج هذه العبارات في صيغة كاملة. في هذا القسم، يمكنك إنشاء مثال لصيغة التحجيم التلقائي التي يمكنها تنفيذ قرارات التحجيم في العالم الحقيقي وإجراء تعديلات.

أولاً، دعنا نحدد متطلبات صيغة القياس التلقائي الجديدة الخاصة بنا. يجب أن تكون الصيغة:

  • قم بزيادة العدد المستهدف لعقد الحوسبة المخصصة في مجموعة إذا كان استخدام وحدة المعالجة المركزية مرتفعاً.
  • قم بتقليل العدد المستهدف لعقد الحوسبة المخصصة في مجموعة عندما يكون استخدام وحدة المعالجة المركزية منخفضاً.
  • قم دائماً بتقييد الحد الأقصى لعدد العقد المخصصة إلى 400.
  • عند تقليل عدد العقد، لا تقم بإزالة العقد التي تقوم بتشغيل المهام؛ إذا لزم الأمر، فانتظر حتى تنتهي المهام قبل إزالة العقد.

تزيد العبارة الأولى في الصيغة من عدد العقد أثناء الاستخدام العالي لوحدة المعالجة المركزية. يمكنك تعريف عبارة تملأ متغيرا معرفا من قبل المستخدم ($totalDedicatedNodes) بقيمة 110 بالمائة من العدد المستهدف الحالي للعقد المخصصة، ولكن فقط إذا كان الحد الأدنى لمتوسط استخدام وحدة المعالجة المركزية خلال الدقائق العشر الأخيرة أعلى من 70 بالمائة. وإلا فإنه يستخدم قيمة العدد الحالي للعقد المخصصة.

$totalDedicatedNodes =
    (min($CPUPercent.GetSample(TimeInterval_Minute * 10)) > 0.7) ?
    ($CurrentDedicatedNodes * 1.1) : $CurrentDedicatedNodes;

لتقليل عدد العقد المخصصة أثناء الاستخدام المنخفض لوحدة المعالجة المركزية، تعين العبارة التالية في الصيغة نفس $totalDedicatedNodes المتغير إلى 90 بالمائة من العدد المستهدف الحالي للعقد المخصصة، إذا كان متوسط استخدام وحدة المعالجة المركزية في الدقائق ال 60 الماضية أقل من 20 بالمائة. وإلا، فإنه يستخدم القيمة الحالية للتعبئة $totalDedicatedNodes في العبارة أعلاه.

$totalDedicatedNodes =
    (avg($CPUPercent.GetSample(TimeInterval_Minute * 60)) < 0.2) ?
    ($CurrentDedicatedNodes * 0.9) : $totalDedicatedNodes;

الآن، حدد العدد المستهدف لعقد الحوسبة المخصصة إلى 400 عقدة كحد أقصى.

$TargetDedicatedNodes = min(400, $totalDedicatedNodes);

وأخيرا، تأكد من عدم إزالة العقد حتى تنتهي مهامها.

$NodeDeallocationOption = taskcompletion;

ها هي الصيغة الكاملة:

$totalDedicatedNodes =
    (min($CPUPercent.GetSample(TimeInterval_Minute * 10)) > 0.7) ?
    ($CurrentDedicatedNodes * 1.1) : $CurrentDedicatedNodes;
$totalDedicatedNodes =
    (avg($CPUPercent.GetSample(TimeInterval_Minute * 60)) < 0.2) ?
    ($CurrentDedicatedNodes * 0.9) : $totalDedicatedNodes;
$TargetDedicatedNodes = min(400, $totalDedicatedNodes);
$NodeDeallocationOption = taskcompletion;

إشعار

إذا اخترت، يمكنك تضمين كل من التعليقات وفواصل الأسطر في سلاسل الصيغ. يجب أيضا أن تدرك أن الفواصل المنقطة المفقودة قد تؤدي إلى أخطاء في التقييم.

فاصل التحجيم التلقائي

بشكل افتراضي، تقوم خدمة Batch بضبط حجم حمام السباحة وفقاً لصيغة المقياس التلقائي كل 15 دقيقة. هذا الفاصل الزمني قابل للتكوين باستخدام خصائص التجمع التالية:

الحد الأدنى للفترة الزمنية هو خمس دقائق، والحد الأقصى هو 168 ساعة. إذا تم تحديد فاصل زمني خارج هذا النطاق، فإن خدمة Batch تُرجع خطأ طلب غير صالح (400).

إشعار

لا يُقصد بالمقياس التلقائي حالياً الاستجابة للتغييرات في أقل من دقيقة، بل يهدف إلى ضبط حجم حوض السباحة الخاص بك تدريجياً أثناء تشغيل عبء العمل.

قم بإنشاء تجمع ممكّن للمقياس التلقائي باستخدام Batch SDKs

يمكن تكوين القياس التلقائي للمجمع باستخدام أي من Batch SDKs و Batch REST API Batch PowerShell cmdlets و Batch CLI . في هذا القسم، يمكنك رؤية أمثلة لكل من .NET وPython.

.NET

لإنشاء تجمع مع تمكين القياس التلقائي في .NET، اتبع الخطوات التالية:

  1. قم بإنشاء التجمع باستخدام BatchClient.PoolOperations.CreatePool .
  2. قم بتعيين الخاصية CloudPool.AutoScaleEnabled إلى true.
  3. قم بتعيين خاصية CloudPool.AutoScaleFormula باستخدام صيغة القياس التلقائي.
  4. (اختياري) قم بتعيين الخاصية CloudPool.AutoScaleEvaluationInterval (الافتراضي 15 دقيقة).
  5. قم بتنفيذ التجمع باستخدام CloudPool.Commit أو CommitAsync.

ينشئ المثال التالي تجمعاً ممكّناً للمقياس التلقائي في .NET. تحدد صيغة المقياس التلقائي للمجمع العدد المستهدف للعقد المخصصة إلى 5 أيام الاثنين، و1 في كل يوم آخر من أيام الأسبوع. تم تعيين فاصل التحجيم التلقائي على 30 دقيقة. في هذا والقصاصات البرمجية #C الأخرى في هذه المقالة، myBatchClient هو مثيل تمت تهيئته بشكل صحيح للفئة BatchClient.

CloudPool pool = myBatchClient.PoolOperations.CreatePool(
                    poolId: "mypool",
                    virtualMachineSize: "standard_d1_v2",
                    VirtualMachineConfiguration: new VirtualMachineConfiguration(
                        imageReference: new ImageReference(
                                            publisher: "MicrosoftWindowsServer",
                                            offer: "WindowsServer",
                                            sku: "2019-datacenter-core",
                                            version: "latest"),
                        nodeAgentSkuId: "batch.node.windows amd64");
pool.AutoScaleEnabled = true;
pool.AutoScaleFormula = "$TargetDedicatedNodes = (time().weekday == 1 ? 5:1);";
pool.AutoScaleEvaluationInterval = TimeSpan.FromMinutes(30);
await pool.CommitAsync();

هام

عند إنشاء تجمع ممكن للتحجيم التلقائي، لا تحدد المعلمة targetDedicatedNodes أو المعلمة targetLowPriorityNodes في الاستدعاء إلى CreatePool. بدلا من ذلك، حدد الخاصيتين AutoScaleEnabled و AutoScaleFormula على التجمع. تحدد قيم هذه الخصائص الرقم المستهدف لكل نوع من أنواع العقدة.

لتغيير حجم تجمع ممكّن للمقياس التلقائي يدوياً (على سبيل المثال، باستخدام BatchClient.PoolOperations.ResizePoolAsync )، يجب أولاً تعطيل القياس التلقائي على التجمع، ثم تغيير حجمه.

تلميح

لمزيد من الأمثلة على استخدام .NET SDK، راجع مستودع Batch .NET Quickstart على GitHub.

Python

لإنشاء تجمع ممكن للتحجيم التلقائي باستخدام Python SDK:

  1. إنشاء تجمع وتحديد التكوين الخاص به.
  2. أضف التجمع إلى عميل الخدمة.
  3. قم بتمكين القياس التلقائي على التجمع باستخدام الصيغة التي تكتبها.

يوضح المثال التالي هذه الخطوات.

# Create a pool; specify configuration
new_pool = batch.models.PoolAddParameter(
    id="autoscale-enabled-pool",
    virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
        image_reference=batchmodels.ImageReference(
          publisher="Canonical",
          offer="UbuntuServer",
          sku="20.04-LTS",
          version="latest"
            ),
        node_agent_sku_id="batch.node.ubuntu 20.04"),
    vm_size="STANDARD_D1_v2",
    target_dedicated_nodes=0,
    target_low_priority_nodes=0
)
batch_service_client.pool.add(new_pool) # Add the pool to the service client

formula = """$curTime = time();
             $workHours = $curTime.hour >= 8 && $curTime.hour < 18;
             $isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
             $isWorkingWeekdayHour = $workHours && $isWeekday;
             $TargetDedicated = $isWorkingWeekdayHour ? 20:10;""";

# Enable autoscale; specify the formula
response = batch_service_client.pool.enable_auto_scale(pool_id, auto_scale_formula=formula,
                                            auto_scale_evaluation_interval=datetime.timedelta(minutes=10),
                                            pool_enable_auto_scale_options=None,
                                            custom_headers=None, raw=False)

تلميح

لمزيد من الأمثلة على استخدام Python SDK، راجع مستودع Batch Python Quickstart على GitHub.

تمكين القياس التلقائي على تجمع موجود

توفر كل حزمة SDK طريقة لتمكين القياس التلقائي. على سبيل المثال:

عندما تقوم بتمكين القياس التلقائي على تجمع موجود، ضع في اعتبارك:

  • إذا تم تعطيل القياس التلقائي حالياً في التجمع، فيجب عليك تحديد صيغة مقياس تلقائي صالحة عند إصدار الطلب. يمكنك تحديد فاصل قياس تلقائي اختيارياً. إذا لم تحدد فاصلاً زمنياً، فسيتم استخدام القيمة الافتراضية وهي 15 دقيقة.
  • إذا تم تمكين القياس التلقائي حالياً في التجمع، فيمكنك تحديد صيغة جديدة أو فاصل زمني جديد أو كليهما. يجب عليك تحديد واحدة على الأقل من هذه الخصائص.
    • إذا قمت بتحديد فاصل زمني تلقائي جديد للقياس، فسيتم إيقاف الجدول الحالي وبدء جدول جديد. وقت بدء الجدول الجديد هو الوقت الذي تم فيه إصدار طلب تمكين القياس التلقائي.
    • إذا حذفت صيغة التحجيم التلقائي أو الفاصل الزمني، تستمر خدمة Batch في استخدام القيمة الحالية لهذا الإعداد.

إشعار

إذا حددت قيما لمعلمات targetDedicatedNodes أو targetLowPriorityNodes للأسلوب CreatePool عند إنشاء التجمع في .NET، أو للمعلمات القابلة للمقارنة بلغة أخرى، تجاهل هذه القيم عند تقييم صيغة التحجيم التلقائي.

يستخدم مثال #C مكتبة Batch .NET لتمكين القياس التلقائي على تجمع موجود.

// Define the autoscaling formula. This formula sets the target number of nodes
// to 5 on Mondays, and 1 on every other day of the week
string myAutoScaleFormula = "$TargetDedicatedNodes = (time().weekday == 1 ? 5:1);";

// Set the autoscale formula on the existing pool
await myBatchClient.PoolOperations.EnableAutoScaleAsync(
    "myexistingpool",
    autoscaleFormula: myAutoScaleFormula);

قم بتحديث صيغة مقياس تلقائي

لتحديث الصيغة في تجمع ممكّن للمقياس التلقائي موجود، اتصل بالعملية لتمكين القياس التلقائي مرة أخرى باستخدام الصيغة الجديدة. على سبيل المثال، إذا تم تمكين القياس التلقائي بالفعل على myexistingpool عند تنفيذ كود .NET التالي، فسيتم استبدال صيغة مقياسه التلقائي بمحتويات myNewFormula.

await myBatchClient.PoolOperations.EnableAutoScaleAsync(
    "myexistingpool",
    autoscaleFormula: myNewFormula);

قم بتحديث الفاصل الزمني للمقياس التلقائي

لتحديث الفاصل الزمني للتقييم التلقائي للمجموعة الممكّنة للمقياس التلقائي، اتصل بالعملية لتمكين القياس التلقائي مرة أخرى مع الفاصل الزمني الجديد. على سبيل المثال، لتعيين الفاصل الزمني لتقييم المقياس التلقائي على 60 دقيقة لتجمع تم تمكين مقياس تلقائي له بالفعل في .NET:

await myBatchClient.PoolOperations.EnableAutoScaleAsync(
    "myexistingpool",
    autoscaleEvaluationInterval: TimeSpan.FromMinutes(60));

قيم معادلة مقياس تلقائي

يمكنك تقييم صيغة قبل تطبيقها على مخزن. يتيح لك هذا اختبار نتائج الصيغة قبل وضعها في الإنتاج.

قبل أن تتمكن من تقييم صيغة مقياس تلقائي، يجب أولاً تمكين القياس التلقائي في التجمع باستخدام صيغة صالحة، مثل صيغة سطر واحد $TargetDedicatedNodes = 0. بعد ذلك، استخدم أحد الخيارات التالية لتقييم الصيغة التي تريد اختبارها:

يقيم مثال Batch .NET التالي صيغة مقياس تلقائي. إذا لم يكن التجمع يستخدم التحجيم التلقائي بالفعل، فمكنه أولا.

// First obtain a reference to an existing pool
CloudPool pool = await batchClient.PoolOperations.GetPoolAsync("myExistingPool");

// If autoscaling isn't already enabled on the pool, enable it.
// You can't evaluate an autoscale formula on a non-autoscale-enabled pool.
if (pool.AutoScaleEnabled == false)
{
    // You need a valid autoscale formula to enable autoscaling on the
    // pool. This formula is valid, but won't resize the pool:
    await pool.EnableAutoScaleAsync(
        autoscaleFormula: "$TargetDedicatedNodes = $CurrentDedicatedNodes;",
        autoscaleEvaluationInterval: TimeSpan.FromMinutes(5));

    // Batch limits EnableAutoScaleAsync calls to once every 30 seconds.
    // Because you want to apply our new autoscale formula below if it
    // evaluates successfully, and you *just* enabled autoscaling on
    // this pool, pause here to ensure you pass that threshold.
    Thread.Sleep(TimeSpan.FromSeconds(31));

    // Refresh the properties of the pool so that we've got the
    // latest value for AutoScaleEnabled
    await pool.RefreshAsync();
}

// You must ensure that autoscaling is enabled on the pool prior to
// evaluating a formula
if (pool.AutoScaleEnabled == true)
{
    // The formula to evaluate - adjusts target number of nodes based on
    // day of week and time of day
    string myFormula = @"
        $curTime = time();
        $workHours = $curTime.hour >= 8 && $curTime.hour < 18;
        $isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
        $isWorkingWeekdayHour = $workHours && $isWeekday;
        $TargetDedicatedNodes = $isWorkingWeekdayHour ? 20:10;
    ";

    // Perform the autoscale formula evaluation. Note that this code does not
    // actually apply the formula to the pool.
    AutoScaleRun eval =
        await batchClient.PoolOperations.EvaluateAutoScaleAsync(pool.Id, myFormula);

    if (eval.Error == null)
    {
        // Evaluation success - print the results of the AutoScaleRun.
        // This will display the values of each variable as evaluated by the
        // autoscale formula.
        Console.WriteLine("AutoScaleRun.Results: " +
            eval.Results.Replace("$", "\n    $"));

        // Apply the formula to the pool since it evaluated successfully
        await batchClient.PoolOperations.EnableAutoScaleAsync(pool.Id, myFormula);
    }
    else
    {
        // Evaluation failed, output the message associated with the error
        Console.WriteLine("AutoScaleRun.Error.Message: " +
            eval.Error.Message);
    }
}

ينتج عن التقييم الناجح للصيغة الموضحة في مقتطف الشفرة هذا نتائج مشابهة لما يلي:

AutoScaleRun.Results:
    $TargetDedicatedNodes=10;
    $NodeDeallocationOption=requeue;
    $curTime=2016-10-13T19:18:47.805Z;
    $isWeekday=1;
    $isWorkingWeekdayHour=0;
    $workHours=0

احصل على معلومات حول عمليات التشغيل ذات المقياس التلقائي

يوصى بالتحقق بشكل دوري من تقييم خدمة Batch لصيغة التحجيم التلقائي. للقيام بذلك، احصل على (أو قم بتحديث) مرجع إلى التجمع، ثم افحص خصائص آخر تشغيل مقياس تلقائي له.

في Batch .NET، تحتوي الخاصية CloudPool.AutoScaleRun على العديد من الخصائص التي توفر معلومات حول آخر تشغيل للتوسيع التلقائي تم إجراؤه على التجمع:

في واجهة برمجة تطبيقات REST، تتضمن المعلومات حول التجمع أحدث معلومات تشغيل التحجيم التلقائي في خاصية autoScaleRun .

يستخدم مثال #C التالي مكتبة Batch .NET لطباعة معلومات حول آخر قياس تلقائي تم تشغيله على التجمع myPool.

await Cloud pool = myBatchClient.PoolOperations.GetPoolAsync("myPool");
Console.WriteLine("Last execution: " + pool.AutoScaleRun.Timestamp);
Console.WriteLine("Result:" + pool.AutoScaleRun.Results.Replace("$", "\n  $"));
Console.WriteLine("Error: " + pool.AutoScaleRun.Error);

نموذج الإخراج من المثال السابق:

Last execution: 10/14/2016 18:36:43
Result:
  $TargetDedicatedNodes=10;
  $NodeDeallocationOption=requeue;
  $curTime=2016-10-14T18:36:43.282Z;
  $isWeekday=1;
  $isWorkingWeekdayHour=0;
  $workHours=0
Error:

احصل على سجل تشغيل المقياس التلقائي باستخدام أحداث المقياس التلقائي للمسبح

يمكنك أيضاً التحقق من محفوظات القياس التلقائي عن طريق الاستعلام عن PoolAutoScaleEvent. تصدر الدفعة هذا الحدث لتسجيل كل تكرار لتقييم صيغة التحجيم التلقائي وتنفيذها، مما قد يكون مفيدا لاستكشاف المشكلات المحتملة وإصلاحها.

نموذج حدث لـ PoolAutoScaleEvent:

{
    "id": "poolId",
    "timestamp": "2020-09-21T23:41:36.750Z",
    "formula": "...",
    "results": "$TargetDedicatedNodes=10;$NodeDeallocationOption=requeue;$curTime=2016-10-14T18:36:43.282Z;$isWeekday=1;$isWorkingWeekdayHour=0;$workHours=0",
    "error": {
        "code": "",
        "message": "",
        "values": []
    }
}

مثال على صيغ القياس التلقائي

لنلقِ نظرة على بعض الصيغ التي تُظهر طرقاً مختلفة لضبط مقدار موارد الحوسبة في مجموعة.

مثال 1: تعديل على أساس الوقت

افترض أنك تريد ضبط حجم التجمع بناءً على يوم الأسبوع والوقت من اليوم. يوضح هذا المثال كيفية زيادة أو تقليل عدد العقد في التجمع وفقاً لذلك.

تحصل الصيغة أولاً على الوقت الحالي. إذا كان أحد أيام الأسبوع (1-5) وخلال ساعات العمل (من 8 صباحاً إلى 6 مساءً)، يتم تعيين حجم التجمع المستهدف على 20 عقدة. خلافاً لذلك، يتم تعيينه على 10 عقد.

$curTime = time();
$workHours = $curTime.hour >= 8 && $curTime.hour < 18;
$isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
$isWorkingWeekdayHour = $workHours && $isWeekday;
$TargetDedicatedNodes = $isWorkingWeekdayHour ? 20:10;
$NodeDeallocationOption = taskcompletion;

يمكن ضبط $curTime لتعكس منطقتك الزمنية المحلية عن طريق إضافة time() إلى منتج TimeZoneInterval_Hour وتعويض التوقيت العالمي المنسق (UTC). على سبيل المثال، استخدم $curTime = time() + (-6 * TimeInterval_Hour); للتوقيت الصيفي الجبلي (MDT). ضع في اعتبارك أن الإزاحة تحتاج إلى تعديل في بداية ونهاية التوقيت الصيفي، إن أمكن.

مثال 2: تعديل على أساس المهام

في مثال C # هذا، يتم ضبط حجم التجمع بناءً على عدد المهام في قائمة الانتظار. يتم تضمين كل من التعليقات وفواصل الأسطر في سلاسل الصيغة.

// Get pending tasks for the past 15 minutes.
$samples = $PendingTasks.GetSamplePercent(TimeInterval_Minute * 15);
// If you have fewer than 70 percent data points, use the last sample point,
// otherwise use the maximum of last sample point and the history average.
$tasks = $samples < 70 ? max(0,$PendingTasks.GetSample(1)) : max( $PendingTasks.GetSample(1), avg($PendingTasks.GetSample(TimeInterval_Minute * 15)));
// If number of pending tasks is not 0, set targetVM to pending tasks, otherwise
// half of current dedicated.
$targetVMs = $tasks > 0? $tasks:max(0, $TargetDedicatedNodes/2);
// The pool size is capped at 20, if target VM value is more than that, set it
// to 20. This value should be adjusted according to your use case.
$TargetDedicatedNodes = max(0, min($targetVMs, 20));
// Set node deallocation mode - let running tasks finish before removing a node
$NodeDeallocationOption = taskcompletion;

مثال 3: محاسبة المهام المتوازية

يضبط مثال C # هذا حجم التجمع بناءً على عدد المهام. تأخذ هذه الصيغة أيضا في الاعتبار قيمة TaskSlotsPerNode التي تم تعيينها للتجمع. هذا الأسلوب مفيد في المواقف التي يتم فيها تمكين تنفيذ المهام المتوازية في مجموعتك.

// Determine whether 70 percent of the samples have been recorded in the past
// 15 minutes; if not, use last sample
$samples = $ActiveTasks.GetSamplePercent(TimeInterval_Minute * 15);
$tasks = $samples < 70 ? max(0,$ActiveTasks.GetSample(1)) : max( $ActiveTasks.GetSample(1),avg($ActiveTasks.GetSample(TimeInterval_Minute * 15)));
// Set the number of nodes to add to one-fourth the number of active tasks
// (the TaskSlotsPerNode property on this pool is set to 4, adjust
// this number for your use case)
$cores = $TargetDedicatedNodes * 4;
$extraVMs = (($tasks - $cores) + 3) / 4;
$targetVMs = ($TargetDedicatedNodes + $extraVMs);
// Attempt to grow the number of compute nodes to match the number of active
// tasks, with a maximum of 3
$TargetDedicatedNodes = max(0,min($targetVMs,3));
// Keep the nodes active until the tasks finish
$NodeDeallocationOption = taskcompletion;

مثال 4: تحديد حجم التجمع الأولي

يوضح هذا المثال مثال C # مع صيغة مقياس تلقائي تحدد حجم التجمع لعدد محدد من العقد لفترة زمنية أولية. بعد ذلك، يقوم بضبط حجم التجمع بناءً على عدد المهام الجارية والنشطة.

على وجه التحديد، تقوم هذه الصيغة بما يلي:

  • يضبط حجم التجمع الأولي على أربع عقد.
  • لا يضبط حجم التجمع خلال أول 10 دقائق من دورة حياة التجمع.
  • بعد 10 دقائق، تحصل على القيمة القصوى لعدد المهام الجارية والنشطة خلال الـ 60 دقيقة الماضية.
    • إذا كانت كلتا القيمتين 0، مما يشير إلى عدم تشغيل أي مهام أو تنشيطها في آخر 60 دقيقة، يتم تعيين حجم التجمع إلى 0.
    • إذا كانت أي من القيمتين أكبر من الصفر، فلن يتم إجراء أي تغيير.
string now = DateTime.UtcNow.ToString("r");
string formula = string.Format(@"
    $TargetDedicatedNodes = {1};
    lifespan         = time() - time(""{0}"");
    span             = TimeInterval_Minute * 60;
    startup          = TimeInterval_Minute * 10;
    ratio            = 50;

    $TargetDedicatedNodes = (lifespan > startup ? (max($RunningTasks.GetSample(span, ratio), $ActiveTasks.GetSample(span, ratio)) == 0 ? 0 : $TargetDedicatedNodes) : {1});
    ", now, 4);

الخطوات التالية