Bagikan melalui


Jalankan tugas secara bersamaan untuk memaksimalkan penggunaan simpul komputasi Batch

Anda dapat memaksimalkan penggunaan sumber daya pada sejumlah kecil simpul komputasi di kumpulan Anda dengan menjalankan lebih dari satu tugas secara bersamaan pada setiap simpul.

Meskipun beberapa skenario bekerja paling baik ketika semua sumber daya node didedikasikan untuk satu tugas, beban kerja tertentu mungkin memiliki waktu penyelesaian pekerjaan yang lebih singkat dan biaya yang lebih rendah ketika beberapa tugas berbagi sumber daya tersebut. Pertimbangkan skenario berikut:

  • Minimalkan transfer data untuk tugas yang dapat berbagi data. Anda dapat secara dramatis mengurangi biaya transfer data dengan menyalin data bersama ke sejumlah kecil simpul, lalu menjalankan tugas secara paralel pada setiap simpul. Strategi ini terutama berlaku jika data yang akan disalin ke setiap simpul harus ditransfer antar wilayah geografis.
  • Maksimalkan penggunaan memori untuk tugas yang memerlukan memori dalam jumlah besar, tetapi hanya selama waktu yang singkat, dan pada waktu variabel selama eksekusi. Anda dapat menggunakan simpul komputasi yang lebih besar tetapi lebih sedikit, dengan lebih banyak memori, untuk menangani lonjakan tersebut secara efisien. Simpul ini memiliki beberapa tugas yang berjalan secara paralel pada setiap simpul, tetapi setiap tugas dapat memanfaatkan memori node yang berlimpah pada waktu yang berbeda.
  • Mengurangi batas nomor simpul saat komunikasi antar-simpul diperlukan dalam kumpulan. Saat ini, kumpulan yang dikonfigurasi untuk komunikasi antar-simpul dibatasi hingga 50 simpul komputasi. Jika setiap simpul dalam kumpulan tersebut dapat menjalankan tugas secara paralel, sejumlah besar tugas dapat dijalankan secara bersamaan.
  • Replikasi kluster komputasi lokal, seperti saat Anda pertama kali memindahkan lingkungan komputasi ke Azure. Jika solusi lokal Anda saat ini menjalankan beberapa tugas per simpul komputasi, Anda dapat meningkatkan jumlah maksimum tugas simpul untuk lebih cerminkan konfigurasi tersebut.

Contoh skenario

Sebagai contoh, bayangkan aplikasi tugas dengan persyaratan CPU dan memori sehingga simpul Standard_D1 sudah cukup. Namun, untuk menyelesaikan pekerjaan dalam waktu yang diperlukan, diperlukan 1.000 simpul ini.

Alih-alih menggunakan simpul Standard_D1 yang memiliki satu inti CPU, Anda dapat menggunakan simpul Standard_D14 yang masing-masing memiliki 16 inti, dan mengaktifkan eksekusi tugas paralel. Anda berpotensi menggunakan 16 kali lebih sedikit simpul alih-alih 1.000 simpul, hanya 63 yang akan diperlukan. Jika file aplikasi besar atau data referensi diperlukan untuk setiap simpul, durasi dan efisiensi pekerjaan ditingkatkan, karena data hanya disalin menjadi 63 simpul.

Aktifkan pelaksanaan tugas paralel

Anda mengonfigurasi simpul komputasi untuk eksekusi tugas paralel di tingkat kumpulan. Dengan pustaka Batch .NET, atur properti CloudPool.TaskSlotsPerNode saat Anda membuat kumpulan. Jika Anda menggunakan REST API Batch, atur elemen taskSlotsPerNode di isi permintaan selama pembuatan kumpulan.

Nota

Anda dapat mengatur taskSlotsPerNode elemen dan properti TaskSlotsPerNode hanya pada waktu pembuatan kumpulan. Mereka tidak dapat dimodifikasi setelah kumpulan sudah dibuat.

Azure Batch memungkinkan Anda mengatur slot tugas per simpul hingga (4x) jumlah inti simpul. Misalnya, jika kumpulan dikonfigurasi dengan simpul berukuran "Besar" (empat inti), maka taskSlotsPerNode dapat diatur ke 16. Namun, terlepas dari berapa banyak inti yang dimiliki simpul, Anda tidak dapat memiliki lebih dari 256 slot tugas per simpul. Untuk detail tentang jumlah inti untuk setiap ukuran simpul, lihat Ukuran untuk Cloud Services (klasik). Untuk informasi selengkapnya tentang batas layanan, lihat Kuota dan batas layanan Batch.

Nasihat

Pastikan untuk memperhitungkan taskSlotsPerNode nilai saat Anda membuat rumus skala otomatis untuk kumpulan Anda. Misalnya, rumus yang mengevaluasi $RunningTasks dapat dipengaruhi secara dramatis oleh peningkatan tugas per simpul. Untuk informasi selengkapnya, lihat Membuat rumus otomatis untuk menskalakan simpul komputasi di kumpulan Batch.

Tentukan distribusi tugas

Saat mengaktifkan tugas bersamaan, penting untuk menentukan bagaimana Anda ingin tugas didistribusikan di seluruh simpul di kumpulan.

Dengan menggunakan properti CloudPool.TaskSchedulingPolicy, Anda dapat menentukan bahwa tugas harus didistribusikan secara merata ke seluruh simpul dalam kumpulan ("pembagian"). Atau Anda dapat menentukan bahwa tugas sebanyak mungkin harus ditetapkan ke setiap simpul sebelum tugas ditetapkan ke simpul lain di kumpulan ("packing").

Sebagai contoh, pertimbangkan kumpulan simpul Standard_D14 (dalam contoh sebelumnya) yang dikonfigurasi dengan nilai CloudPool.TaskSlotsPerNode sebesar 16. Jika CloudPool.TaskSchedulingPolicy dikonfigurasi dengan ComputeNodeFillType tipe Pack, itu akan memaksimalkan penggunaan semua 16 inti dari setiap simpul dan memungkinkan kumpulan penskalaan otomatis untuk menghapus simpul yang tidak digunakan (simpul tanpa tugas yang ditetapkan) dari kumpulan. Autoscaling meminimalkan penggunaan sumber daya dan dapat menghemat uang.

Menentukan slot variabel per tugas

Tugas dapat ditentukan dengan properti CloudTask.RequiredSlots , menentukan berapa banyak slot yang diperlukan untuk dijalankan pada simpul komputasi. Nilai defaultnya adalah 1. Anda dapat mengatur slot tugas variabel jika tugas Anda memiliki bobot yang berbeda yang terkait dengan penggunaan sumber dayanya pada simpul komputasi. Slot tugas variabel memungkinkan setiap simpul komputasi memiliki jumlah tugas yang berjalan bersamaan yang wajar tanpa sumber daya sistem yang luar biasa seperti CPU atau memori.

Misalnya, untuk kumpulan dengan properti taskSlotsPerNode = 8, Anda dapat mengirimkan tugas-tugas yang memerlukan CPU intensif dan multi-inti dengan requiredSlots = 8, sementara tugas-tugas lainnya dapat diatur ke requiredSlots = 1. Ketika beban kerja campuran ini dijadwalkan, tugas intensif CPU berjalan secara eksklusif pada simpul komputasi mereka, sementara tugas lain dapat berjalan bersamaan (hingga delapan tugas sekaligus) pada simpul lain. Beban kerja campuran membantu Anda menyeimbangkan beban kerja di seluruh simpul komputasi dan meningkatkan efisiensi penggunaan sumber daya.

Pastikan Anda tidak menentukan requiredSlots suatu tugas menjadi lebih besar dari kumpulan taskSlotsPerNode, atau tugas tidak akan pernah berjalan. Layanan Batch saat ini tidak memvalidasi konflik ini saat Anda mengirimkan tugas. Ini tidak memvalidasi konflik, karena tugas mungkin tidak memiliki kumpulan yang ditetapkan pada waktu pengiriman, atau dapat berubah ke kumpulan yang berbeda dengan menonaktifkan lalu mengaktifkannya kembali.

Nasihat

Saat menggunakan slot tugas variabel, ada kemungkinan bahwa tugas besar dengan slot yang lebih diperlukan dapat gagal untuk sementara waktu dijadwalkan karena tidak cukup slot yang tersedia pada simpul komputasi apa pun, bahkan ketika masih ada slot menganggur pada beberapa simpul. Anda dapat meningkatkan prioritas pekerjaan untuk tugas-tugas ini guna meningkatkan peluang mereka bersaing untuk slot yang tersedia pada node.

Layanan Batch memancarkan TaskScheduleFailEvent ketika gagal menjadwalkan tugas untuk dijalankan dan terus mencoba kembali penjadwalan hingga slot yang diperlukan tersedia. Anda dapat mendengarkan peristiwa tersebut untuk mendeteksi potensi masalah penjadwalan tugas dan menguranginya.

Contoh Batch .NET

Cuplikan kode Batch .NET API berikut menunjukkan cara membuat kumpulan dengan beberapa slot tugas per simpul dan cara mengirimkan tugas dengan slot yang diperlukan.

Membuat kumpulan dengan beberapa slot tugas per simpul

Cuplikan kode ini menunjukkan permintaan untuk membuat kumpulan yang berisi empat simpul, dengan empat slot tugas yang diizinkan per simpul. Ini menentukan kebijakan penjadwalan tugas yang mengisi setiap simpul dengan tugas sebelum menetapkan tugas ke simpul lain di kumpulan.

Untuk informasi selengkapnya tentang menambahkan kumpulan dengan menggunakan Batch .NET API, lihat 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();

Membuat tugas dengan slot yang diperlukan

Cuplikan kode ini membuat tugas dengan nonstandar requiredSlots. Tugas ini berjalan ketika ada cukup slot gratis yang tersedia pada simpul komputasi.

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

Mencantumkan node komputasi dengan jumlah tugas yang sedang berjalan dan slot.

Cuplikan kode ini mencantumkan semua simpul komputasi dalam pool dan mencetak jumlah tugas yang berjalan serta slot tugas per simpul.

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);

Mencantumkan jumlah tugas untuk pekerjaan tersebut

Cuplikan kode ini mendapatkan jumlah tugas untuk pekerjaan, yang mencakup jumlah tugas dan slot tugas berdasarkan status tugas.

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}");

Contoh Penggunaan REST Batch

Cuplikan kode REST API Batch berikut menunjukkan cara membuat kumpulan dengan beberapa slot tugas per simpul dan cara mengirimkan tugas dengan slot yang diperlukan.

Membuat kumpulan dengan beberapa slot tugas per simpul

Cuplikan ini menunjukkan permintaan untuk membuat kumpulan yang berisi dua simpul besar dengan maksimal empat tugas per simpul.

Untuk informasi selengkapnya tentang menambahkan kumpulan dengan menggunakan REST API, lihat Menambahkan kumpulan ke akun.

{
  "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,
}

Membuat tugas dengan slot yang diperlukan

Cuplikan ini menunjukkan permintaan untuk menambahkan tugas dengan pengaturan nonstandar requiredSlots. Tugas ini hanya berjalan ketika ada cukup slot gratis yang tersedia pada simpul komputasi.

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

Sampel kode di GitHub

Proyek ParallelTasks di GitHub mengilustrasikan penggunaan properti CloudPool.TaskSlotsPerNode .

Aplikasi konsol C# ini menggunakan pustaka Batch .NET untuk membuat kumpulan dengan satu atau beberapa simpul komputasi. Ini menjalankan sejumlah tugas yang dapat dikonfigurasi pada simpul tersebut untuk mensimulasikan beban variabel. Output dari aplikasi menunjukkan simpul mana yang menjalankan setiap tugas. Aplikasi ini juga menyediakan ringkasan parameter dan durasi pekerjaan.

Contoh berikut menunjukkan bagian ringkasan output dari dua eksekusi aplikasi sampel ParallelTasks yang berbeda. Durasi pekerjaan yang ditampilkan di sini tidak termasuk waktu pembuatan kumpulan, karena setiap pekerjaan dikirimkan ke kumpulan yang dibuat sebelumnya yang simpul komputasinya berada dalam status Menganggur pada waktu pengiriman.

Eksekusi pertama aplikasi sampel menunjukkan bahwa dengan satu simpul di kumpulan dan pengaturan default satu tugas per simpul, durasi pekerjaan lebih dari 30 menit.

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

Pengulangan kedua dari sampel menunjukkan penurunan durasi pekerjaan yang signifikan. Pengurangan ini karena kumpulan dikonfigurasi dengan empat tugas per simpul, memungkinkan eksekusi tugas paralel untuk menyelesaikan pekerjaan dalam hampir seperempat waktu.

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

Langkah berikutnya