قم بتشغيل المهام بشكل متزامن لتعظيم استخدام عقد الحوسبة الدفعية

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

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

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

أحد أمثلة السيناريوهات

على سبيل المثال، تخيل تطبيق مهمة مع متطلبات وحدة المعالجة المركزية والذاكرة مثل أن العقد Standard_D1 كافية. ومع ذلك، لإنهاء المهمة في الوقت المطلوب، هناك حاجة إلى 1000 من هذه العقد.

بدلا من استخدام العقد Standard_D1 التي تحتوي على ذاكرة أساسية واحدة لوحدة المعالجة المركزية، يمكنك استخدام Standard_D14 العقد التي تحتوي على 16 نواة لكل منها، وتمكين تنفيذ المهام المتوازية. من المحتمل أن تستخدم عقدا أقل ب 16 مرة بدلا من 1000 عقدة، سيكون هناك حاجة إلى 63 عقدة فقط. إذا كانت هناك حاجة إلى ملفات تطبيق كبيرة أو بيانات مرجعية لكل عقدة، يتم تحسين مدة العمل وكفاءته، حيث يتم نسخ البيانات إلى 63 عقدة فقط.

تمكين تنفيذ المهمة المتوازية

يمكنك تكوين عقد الحساب لتنفيذ المهام المتوازية على مستوى التجمع. باستخدام مكتبة Batch .NET، قم بتعيين خاصية CloudPool.TaskSlotsPerNode عند إنشاء مجموعة. إذا كنت تستخدم Batch REST API، فقم بتعيين عنصر taskSlotsPerNode في نص الطلب أثناء إنشاء التجمع.

ملاحظة

يمكنك تعيين عنصر taskSlotsPerNodeوخاصيةTaskSlotsPerNode فقط في وقت إنشاء التجمع. لا يمكن تعديلها بعدما إنشاء تجمع بالفعل.

يسمح لك Azure Batch بتعيين فتحات المهام لكل عقدة حتى (4x) عدد مراكز العقد. على سبيل المثال، إذا تم تكوين التجمع باستخدام عقد ذات حجم "كبير" (أربعة مراكز)، فقد يتم تعيين taskSlotsPerNode على 16. ومع ذلك، بغض النظر عن عدد النوى التي تحتوي عليها العقدة، لا يمكن أن يكون لديك أكثر من 256 فتحة مهمة لكل عقدة. للحصول على تفاصيل حول عدد الذاكرات الأساسية لكل حجم من أحجام العقدة، راجع أحجام الخدمات السحابية (الكلاسيكية). لمزيد من المعلومات حول حدود الخدمة، راجع حصص وحدود خدمة الدفعات.

تلميح

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

حدد توزيع المهام

عند تمكين المهام المتزامنة، من المهم تحديد الطريقة التي تريد بها توزيع المهام عبر العقد في المجموعة.

باستخدام الخاصية CloudPool.TaskSchedulingPolicy، يمكنك تحديد المهام التي يجب تخصيصها بالتساوي عبر جميع العقد في التجمع ("الانتشار"). أو يمكنك تحديد أنه يجب تعيين أكبر عدد ممكن من المهام لكل عقدة قبل تعيين المهام لعقدة أخرى في التجمع ("التعبئة").

على سبيل المثال، ضع في اعتبارك تجمع العقد Standard_D14 (في المثال السابق) التي تم تكوينها بقيمة CloudPool.TaskSlotsPerNode البالغة 16. إذا تم تكوين CloudPool.TaskSchedulingPolicy باستخدام ComputeNodeFillType من Pack، فسيؤدي ذلك إلى زيادة استخدام جميع النوى الـ 16 لكل عقدة والسماح بتجمع قياس تلقائيلإزالة العقد غير المستخدمة (العقد دون تعيين أي مهام) من التجمع. يقلل التحجيم التلقائي من استخدام الموارد ويمكن أن يوفر المال.

حدد خانات متغيرة لكل مهمة

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

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

تأكد من عدم تحديد مهمة requiredSlots لتكون أكبر من ، taskSlotsPerNodeأو أن المهمة لا تعمل أبدا. لا تتحقق خدمة الدفعات حاليا من صحة هذا التعارض عند إرسال المهام. لا يتحقق من صحة التعارض، لأن الوظيفة قد لا تحتوي على تجمع مرتبط في وقت الإرسال، أو قد تتغير إلى تجمع مختلف عن طريق تعطيل/إعادة التمكين.

تلميح

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

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

مثال دفعة NET

توضح مقتطفات شفرة واجهة برمجة التطبيقات Batch .NET التالية كيفية إنشاء مجموعة ذات فتحات مهام متعددة لكل عقدة وكيفية إرسال مهمة بالفتحات المطلوبة.

قم بإنشاء مجموعة ذات فتحات مهام متعددة لكل عقدة

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

لمزيد من المعلومات حول إضافة المجمعات باستخدام Batch .NET API، راجع BatchClient.PoolOperations.CreatePool.

CloudPool pool =
    batchClient.PoolOperations.CreatePool(
        poolId: "mypool",
        targetDedicatedComputeNodes: 4
        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.TaskSlotsPerNode = 4;
pool.TaskSchedulingPolicy = new TaskSchedulingPolicy(ComputeNodeFillType.Pack);
pool.Commit();

قم بإنشاء مهمة بالفتحات المطلوبة

ينشئ مقتطف التعليمات البرمجية هذا مهمة مع nofault requiredSlots. يتم تشغيل هذه المهمة عندما تكون هناك فتحات مجانية كافية متوفرة على عقدة حساب.

CloudTask task = new CloudTask(taskId, taskCommandLine)
{
    RequiredSlots = 2
};

سرد عقد الحساب مع عدد المهام قيد التشغيل والفتحات

تسرد القصاصة البرمجية هذه جميع عقد الحوسبة في التجمع وتطبع أعداد المهام قيد التشغيل وفتحات المهام لكل عقدة.

ODATADetailLevel nodeDetail = new ODATADetailLevel(selectClause: "id,runningTasksCount,runningTaskSlotsCount");
IPagedEnumerable<ComputeNode> nodes = batchClient.PoolOperations.ListComputeNodes(poolId, nodeDetail);

await nodes.ForEachAsync(node =>
{
    Console.WriteLine(node.Id + " :");
    Console.WriteLine($"RunningTasks = {node.RunningTasksCount}, RunningTaskSlots = {node.RunningTaskSlotsCount}");

}).ConfigureAwait(continueOnCapturedContext: false);

قائمة بحساب المهمة للوظيفة

يحصل مقتطف الشفرة هذا على عدد المهام للوظيفة، والتي تتضمن عدد المهام وفترات المهام لكل حالة مهمة.

TaskCountsResult result = await batchClient.JobOperations.GetJobTaskCountsAsync(jobId);

Console.WriteLine("\t\tActive\tRunning\tCompleted");
Console.WriteLine($"TaskCounts:\t{result.TaskCounts.Active}\t{result.TaskCounts.Running}\t{result.TaskCounts.Completed}");
Console.WriteLine($"TaskSlotCounts:\t{result.TaskSlotCounts.Active}\t{result.TaskSlotCounts.Running}\t{result.TaskSlotCounts.Completed}");

مثال Batch REST

توضح مقتطفات شفرة واجهة برمجة التطبيقات Batch REST التالية كيفية إنشاء مجموعة ذات فتحات مهام متعددة لكل عقدة وكيفية إرسال مهمة بالفتحات المطلوبة.

قم بإنشاء مجموعة ذات فتحات مهام متعددة لكل عقدة

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

لمزيد من المعلومات حول إضافة تجمعات باستخدام واجهة برمجة تطبيقات REST، راجع إضافة مستودع إلى حساب.

{
  "odata.metadata":"https://myaccount.myregion.batch.azure.com/$metadata#pools/@Element",
  "id":"mypool",
  "vmSize":"large",
  "virtualMachineConfiguration": {
    "imageReference": {
      "publisher": "canonical",
      "offer": "ubuntuserver",
      "sku": "20.04-lts"
    },
    "nodeAgentSKUId": "batch.node.ubuntu 20.04"
  },
  "targetDedicatedComputeNodes":2,
  "taskSlotsPerNode":4,
  "enableInterNodeCommunication":true,
}

قم بإنشاء مهمة بالفتحات المطلوبة

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

{
  "id": "taskId",
  "commandLine": "bash -c 'echo hello'",
  "userIdentity": {
    "autoUser": {
      "scope": "task",
      "elevationLevel": "nonadmin"
    }
  },
  "requiredSLots": 2
}

عينة التعليمات البرمجية على GitHub

يوضح مشروع ParallelTasksعلى GitHub استخدام خاصية CloudPool.TaskSlotsPerNode.

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

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

يُظهر التنفيذ الأول للتطبيق النموذجي أنه مع وجود عقدة واحدة في التجمع والإعداد الافتراضي لمهمة واحدة لكل عقدة، فإن مدة المهمة تزيد عن 30 دقيقة.

Nodes: 1
Node size: large
Task slots per node: 1
Max slots per task: 1
Tasks: 32
Duration: 00:30:01.4638023

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

Nodes: 1
Node size: large
Task slots per node: 4
Max slots per task: 1
Tasks: 32
Duration: 00:08:48.2423500

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