Batch işlem düğümlerinin kullanımını en üst düzeye çıkarmak için görevleri eşzamanlı olarak çalıştırma
Her düğümde aynı anda birden fazla görev çalıştırarak havuzunuzda daha az sayıda işlem düğümünde kaynak kullanımını en üst düzeye çıkarabilirsiniz.
Bazı senaryolar düğümün tek bir göreve ayrılmış tüm kaynaklarıyla en iyi şekilde çalışsa da, birden çok görev bu kaynakları paylaştığında belirli iş yükleri daha kısa iş süreleri ve maliyetleri düşürebilir. Aşağıdaki senaryoları göz önünde bulundurun:
- Veri paylaşabilen görevler için veri aktarımını en aza indirin. Paylaşılan verileri daha az sayıda düğüme kopyalayıp her düğümde görevleri paralel olarak yürüterek veri aktarımı ücretlerini önemli ölçüde azaltabilirsiniz. Bu strateji özellikle her düğüme kopyalanacak verilerin coğrafi bölgeler arasında aktarılması gerekiyorsa geçerlidir.
- Büyük miktarda bellek gerektiren, ancak yalnızca kısa sürelerde ve yürütme sırasında değişken zamanlarda bellek kullanımını en üst düzeye çıkarın. Bu tür ani artışları verimli bir şekilde işlemek için daha az ama daha büyük, daha fazla belleğe sahip işlem düğümleri kullanabilirsiniz. Bu düğümlerin her düğümde paralel olarak çalışan birden çok görevi vardır, ancak her görev farklı zamanlarda düğümlerin bol miktarda belleğinden yararlanabilir.
- Havuz içinde düğümler arası iletişim gerektiğinde düğüm numarası sınırlarını azaltın. Şu anda düğümler arası iletişim için yapılandırılan havuzlar 50 işlem düğümüyle sınırlıdır. Böyle bir havuzdaki her düğüm görevleri paralel olarak yürütebiliyorsa, aynı anda daha fazla sayıda görev yürütülebilir.
- Bir işlem ortamını Azure'a ilk taşıdığınızda olduğu gibi şirket içi işlem kümesini çoğaltma. Geçerli şirket içi çözümünüz işlem düğümü başına birden çok görev yürütürse, bu yapılandırmayı daha yakından yansıtmak için en fazla düğüm görevi sayısını artırabilirsiniz.
Örnek senaryo
Örneğin, Standard_D1 düğümlerinin yeterli olması için CPU ve bellek gereksinimlerine sahip bir görev uygulaması düşünün. Ancak, işi gerekli sürede tamamlamak için bu düğümlerden 1.000'i gerekir.
Bir CPU çekirdeğine sahip Standard_D1 düğümleri kullanmak yerine, her biri 16 çekirdeği olan Standard_D14 düğümleri kullanabilir ve paralel görev yürütmeyi etkinleştirebilirsiniz. 1.000 düğüm yerine 16 kat daha az düğüm kullanabilirsiniz, yalnızca 63 düğüm gerekir. Her düğüm için büyük uygulama dosyaları veya başvuru verileri gerekiyorsa, veriler yalnızca 63 düğüme kopyalandığından iş süresi ve verimliliği iyileştirilir.
Paralel görev yürütmeyi etkinleştirme
İşlem düğümlerini havuz düzeyinde paralel görev yürütmesi için yapılandırabilirsiniz. Batch .NET kitaplığıyla, havuz oluştururken CloudPool.TaskSlotsPerNode özelliğini ayarlayın. Batch REST API'sini kullanıyorsanız havuz oluşturma sırasında istek gövdesinde taskSlotsPerNode öğesini ayarlayın.
Not
öğesini ve TaskSlotsPerNode özelliğini yalnızca havuz oluşturma zamanında ayarlayabilirsiniztaskSlotsPerNode
. Havuz oluşturulduktan sonra değiştirilemezler.
Azure Batch düğüm başına görev yuvalarını düğüm çekirdeği sayısına (4 kat) kadar ayarlamanızı sağlar. Örneğin, havuz "Büyük" (dört çekirdek) taskSlotsPerNode
boyutunda düğümlerle yapılandırılmışsa 16 olarak ayarlanabilir. Ancak düğümde kaç çekirdek olduğuna bakılmaksızın düğüm başına 256'dan fazla görev yuvasına sahip olamazsınız. Düğüm boyutlarının her birinin çekirdek sayısı hakkında ayrıntılı bilgi için bkz. Cloud Services boyutları (klasik). Hizmet sınırları hakkında daha fazla bilgi için bkz . Batch hizmeti kotaları ve sınırları.
İpucu
Havuzunuz için otomatik ölçeklendirme formülü oluştururken değeri dikkate taskSlotsPerNode
aldığınızdan emin olun. Örneğin, değerlendiren $RunningTasks
bir formül düğüm başına görev sayısındaki artıştan önemli ölçüde etkilenebilir. Daha fazla bilgi için bkz. Batch havuzunda işlem düğümlerini ölçeklendirmek için otomatik formül oluşturma.
Görev dağılımını belirtme
Eşzamanlı görevleri etkinleştirirken, görevlerin havuzdaki düğümler arasında nasıl dağıtılmasını istediğinizi belirtmek önemlidir.
CloudPool.TaskSchedulingPolicy özelliğini kullanarak, görevlerin havuzdaki tüm düğümlere eşit olarak atanması gerektiğini belirtebilirsiniz ("yayma"). Ya da havuzdaki başka bir düğüme ("paketleme") atanmadan önce her düğüme mümkün olduğunca çok görev atanması gerektiğini belirtebilirsiniz.
Örnek olarak, CloudPool.TaskSlotsPerNode değeri 16 ile yapılandırılmış Standard_D14 düğüm havuzunu (önceki örnekte) düşünün. CloudPool.TaskSchedulingPolicypaketinComputeNodeFillType değeriyle yapılandırılırsa, her düğümün 16 çekirdeğinin tamamının kullanımını en üst düzeye çıkarır ve otomatik ölçeklendirme havuzunun kullanılmayan düğümleri (görev atanmamış düğümler) havuzdan kaldırmasına izin verir. Otomatik ölçeklendirme, kaynak kullanımını en aza indirir ve tasarruf edebilir.
Görev başına değişken yuvaları tanımlama
Bir görev CloudTask.RequiredSlots özelliğiyle tanımlanabilir ve işlem düğümünde kaç yuva çalıştırılması gerektiğini belirtir. Varsayılan değer 1’dir. Görevlerinizin işlem düğümündeki kaynak kullanımıyla ilişkili farklı ağırlıkları varsa değişken görev yuvaları ayarlayabilirsiniz. Değişken görev yuvaları, her işlem düğümünün CPU veya bellek gibi aşırı sistem kaynakları olmadan makul sayıda eşzamanlı çalışan göreve sahip olmasını sağlar.
Örneğin, özelliğine taskSlotsPerNode = 8
sahip bir havuz için ile çok çekirdekli gerekli CPU yoğunluklu görevler requiredSlots = 8
gönderebilirken, diğer görevler olarak requiredSlots = 1
ayarlanabilir. Bu karma iş yükü zamanlandığında, YOĞUN CPU kullanan görevler yalnızca işlem düğümlerinde çalıştırılırken, diğer görevler diğer düğümlerde eşzamanlı olarak (aynı anda en fazla sekiz görev) çalıştırılabilir. Karma iş yükü, iş yükünüzü işlem düğümleri arasında dengelemenize ve kaynak kullanım verimliliğini artırmanıza yardımcı olur.
Bir görevin requiredSlots
havuzun taskSlotsPerNode
değerinden büyük olacağını belirtmediğinizden veya görevin hiçbir zaman çalışmayacağından emin olun. Batch Hizmeti şu anda görevleri gönderdiğinizde bu çakışmayı doğrulamaz. Bir işin gönderim zamanında bağlı bir havuzu olmadığından veya devre dışı bırakılarak/yeniden etkinleştirilerek farklı bir havuza değiştirilebileceği için çakışmayı doğrulamaz.
İpucu
Değişken görev yuvaları kullanılırken, bazı düğümlerde boşta yuvalar olsa bile herhangi bir işlem düğümünde yeterli yuva olmadığından, daha fazla gerekli yuvaya sahip büyük görevlerin geçici olarak zamanlanmaması mümkündür. Düğümlerdeki kullanılabilir yuvalar için rekabet etme şanslarını artırmak için bu görevlerin iş önceliğini yükseltebilirsiniz.
Batch hizmeti, bir görevi çalıştırılacak şekilde zamanlayamaması durumunda TaskScheduleFailEvent değerini gösterir ve gerekli yuvalar kullanılabilir duruma gelene kadar zamanlamayı yeniden denemeye devam eder. Olası görev zamanlama sorunlarını algılamak ve uygun şekilde azaltmak için bu olayı dinleyebilirsiniz.
Batch .NET örneği
Aşağıdaki Batch .NET API kod parçacıkları, düğüm başına birden çok görev yuvasına sahip bir havuzun nasıl oluşturulacağını ve gerekli yuvalara sahip bir görevin nasıl göndereceğini gösterir.
Düğüm başına birden çok görev yuvasına sahip bir havuz oluşturma
Bu kod parçacığı, düğüm başına dört görev yuvasına izin verilen dört düğüm içeren bir havuz oluşturma isteğini gösterir. Havuzdaki başka bir düğüme görev atamadan önce her düğümü görevlerle dolduran bir görev zamanlama ilkesi belirtir.
Batch .NET API'sini kullanarak havuz ekleme hakkında daha fazla bilgi için bkz. 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();
Gerekli yuvalarla görev oluşturma
Bu kod parçacığı, varsayılan olmayan requiredSlots
bir görev oluşturur. Bu görev, bir işlem düğümünde yeterli boş yuva olduğunda çalışır.
CloudTask task = new CloudTask(taskId, taskCommandLine)
{
RequiredSlots = 2
};
Çalışan görevler ve yuvalar için sayılarla işlem düğümlerini listeleme
Bu kod parçacığı havuzdaki tüm işlem düğümlerini listeler ve düğüm başına çalışan görevlerin ve görev yuvalarının sayısını yazdırır.
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);
İşin görev sayılarını listeleme
Bu kod parçacığı, görev durumu başına hem görevleri hem de görev yuvaları sayısını içeren işin görev sayılarını alır.
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 örneği
Aşağıdaki Batch REST API kod parçacıkları, düğüm başına birden çok görev yuvasına sahip bir havuz oluşturmayı ve gerekli yuvalara sahip bir görevi göndermeyi gösterir.
Düğüm başına birden çok görev yuvasına sahip bir havuz oluşturma
Bu kod parçacığı, düğüm başına en fazla dört görev içeren iki büyük düğüm içeren bir havuz oluşturma isteğini gösterir.
REST API kullanarak havuz ekleme hakkında daha fazla bilgi için bkz. Hesaba havuz ekleme.
{
"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,
}
Gerekli yuvalarla görev oluşturma
Bu kod parçacığında, zaman uyumsuz bir görev requiredSlots
ekleme isteği gösterilir. Bu görev yalnızca işlem düğümünde yeterli boş yuva olduğunda çalışır.
{
"id": "taskId",
"commandLine": "bash -c 'echo hello'",
"userIdentity": {
"autoUser": {
"scope": "task",
"elevationLevel": "nonadmin"
}
},
"requiredSLots": 2
}
GitHub'da kod örneği
GitHub'da ParallelTasks projesi CloudPool.TaskSlotsPerNode özelliğinin kullanımını gösterir.
Bu C# konsol uygulaması, bir veya daha fazla işlem düğümüne sahip bir havuz oluşturmak için Batch .NET kitaplığını kullanır. Değişken yükünün benzetimini yapmak için bu düğümlerde yapılandırılabilir sayıda görev yürütür. Uygulamadan elde edilen çıktı, her görevi yürüten düğümleri gösterir. Uygulama ayrıca iş parametrelerinin ve süresinin özetini de sağlar.
Aşağıdaki örnekte ParallelTasks örnek uygulamasının iki farklı çalıştırmasından çıkışın özet bölümü gösterilmektedir. Burada gösterilen iş süreleri havuz oluşturma süresini içermez çünkü her iş, işlem düğümleri gönderme zamanında Boşta durumunda olan önceden oluşturulmuş bir havuza gönderilmiştir.
Örnek uygulamanın ilk yürütmesi, havuzda tek bir düğüm ve düğüm başına varsayılan bir görev ayarı ile iş süresinin 30 dakikadan uzun olduğunu gösterir.
Nodes: 1
Node size: large
Task slots per node: 1
Max slots per task: 1
Tasks: 32
Duration: 00:30:01.4638023
Örneğin ikinci çalıştırması, iş süresinde önemli bir düşüş olduğunu gösterir. Bu azaltmanın nedeni havuzun düğüm başına dört görevle yapılandırılması ve paralel görev yürütmenin işin neredeyse dörtte birinde tamamlanmasına olanak sağlamasıdır.
Nodes: 1
Node size: large
Task slots per node: 4
Max slots per task: 1
Tasks: 32
Duration: 00:08:48.2423500