Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Azure Batch dapat secara otomatis menskalakan kumpulan berdasarkan parameter yang Anda tentukan, sehingga menghemat waktu dan uang Anda. Dengan penskalaan otomatis, Batch secara dinamis menambahkan simpul ke kumpulan saat tuntutan tugas meningkat, dan menghapus simpul komputasi saat tuntutan tugas berkurang.
Untuk mengaktifkan penskalaan otomatis pada kumpulan simpul komputasi, Anda mengaitkan kumpulan dengan rumus skala otomatis yang Anda tentukan. Layanan Batch menggunakan rumus skala otomatis untuk menentukan berapa banyak simpul yang diperlukan untuk menjalankan beban kerja Anda. Simpul ini dapat berupa simpul khusus atau simpul Azure Spot. Batch secara berkala meninjau data metrik layanan dan menggunakannya untuk menyesuaikan jumlah simpul dalam kumpulan berdasarkan rumus Anda dan pada interval yang Anda tentukan.
Anda dapat mengaktifkan penskalaan otomatis saat membuat kumpulan, atau menerapkannya ke kumpulan yang ada. Batch memungkinkan Anda mengevaluasi rumus sebelum menetapkannya ke kumpulan dan untuk memantau status eksekusi penskalaan otomatis. Setelah Mengonfigurasi kumpulan dengan penskalaan otomatis, Anda bisa membuat perubahan pada rumus nanti.
Penting
Saat Membuat akun Batch, Anda dapat menentukan mode alokasi kumpulan, yang menentukan apakah kumpulan dialokasikan dalam langganan layanan Batch (default) atau di langganan pengguna Anda. Jika Anda membuat akun Batch dengan konfigurasi layanan Batch default, maka akun Anda terbatas pada jumlah maksimum core yang dapat digunakan untuk pemrosesan. Layanan Batch menskalakan simpul komputasi hanya sampai batas inti tersebut. Untuk alasan ini, layanan Batch mungkin tidak mencapai jumlah target simpul komputasi yang ditentukan oleh rumus skala otomatis. Untuk mempelajari cara melihat dan meningkatkan kuota akun Anda, lihat Kuota dan batasan untuk layanan Azure Batch.
Jika Anda membuat akun dengan mode langganan pengguna, maka akun Anda akan berbagi dalam kuota inti untuk langganan. Untuk informasi selengkapnya, lihat batas Komputer Virtual di langganan Azure dan batas layanan, kuota, dan batasan.
Rumus penskalaan otomatis
Rumus skala otomatis adalah nilai untai yang Anda tentukan yang berisi satu atau beberapa pernyataan. Formula skala otomatis ditetapkan ke elemen autoScaleFormula pada kumpulan (Batch REST) atau properti CloudPool.AutoScaleFormula (Batch .NET). Layanan Batch menggunakan rumus Anda untuk menentukan jumlah target simpul komputasi dalam kumpulan untuk interval pemrosesan berikutnya. Untai rumus tidak boleh melebihi 8 KB, dapat menyertakan hingga 100 pernyataan yang dipisahkan oleh titik koma, dan dapat menyertakan jeda baris dan komentar.
Anda dapat menganggap rumus penskalaan otomatis sebagai "bahasa" skala otomatis Batch. Pernyataan rumus adalah ekspresi yang dibentuk bebas yang dapat mencakup variabel yang ditentukan layanan, yang ditentukan oleh layanan Batch, dan variabel yang ditentukan pengguna. Rumus bisa melakukan berbagai operasi pada nilai-nilai ini dengan menggunakan jenis, operator, dan fungsi bawaan. Misalnya, pernyataan mungkin berupa formulir berikut:
$myNewVariable = function($ServiceDefinedVariable, $myCustomVariable);
Rumus umumnya berisi beberapa pernyataan yang melakukan operasi pada nilai yang diperoleh dalam pernyataan sebelumnya. Misalnya, pertama-tama Anda mendapatkan nilai untuk variable1, lalu meneruskannya ke fungsi untuk mengisi variable2:
$variable1 = function1($ServiceDefinedVariable);
$variable2 = function2($OtherServiceDefinedVariable, $variable1);
Sertakan pernyataan ini dalam rumus skala otomatis Anda untuk sampai pada target jumlah simpul komputasi. Node khusus dan node Spot masing-masing memiliki pengaturan target mereka sendiri. Rumus skala otomatis dapat menyertakan nilai target untuk node khusus, nilai target untuk node Spot, atau keduanya.
Jumlah target simpul mungkin lebih tinggi, lebih rendah, atau sama dengan jumlah simpul saat ini dari jenis tersebut dalam kumpulan. Batch mengevaluasi rumus penskalaan otomatis suatu kumpulan pada interval tertentu penskalaan otomatis. Batch menyesuaikan jumlah target setiap jenis simpul dalam kumpulan sesuai dengan jumlah yang ditentukan oleh rumus penskalaan otomatis Anda pada saat evaluasi.
Contoh rumus skala otomatis
Contoh berikut menunjukkan dua rumus skala otomatis, yang dapat disesuaikan untuk bekerja untuk sebagian besar skenario. Variabel startingNumberOfVMs dan maxNumberofVMs dalam contoh rumus dapat disesuaikan dengan kebutuhan Anda.
Tugas tertunda
Dengan rumus skala otomatis ini, kumpulan awalnya dibuat dengan satu VM.
$PendingTasksMetrik menentukan jumlah tugas yang sedang berjalan atau diantrekan. Rumus menghitung jumlah rata-rata tugas tertunda dalam 15 menit terakhir dan menetapkan variabel $TargetDedicatedNodes sesuai. Rumus ini memastikan bahwa jumlah target simpul khusus tidak pernah melebihi 25 VM. Saat tugas baru dikirimkan, kumpulan secara otomatis bertambah besar. Saat tugas selesai, VM menjadi kosong dan rumus penskalaan otomatis menyusutkan kumpulan.
Rumus ini menskalakan node khusus, tetapi dapat dimodifikasi untuk diterapkan guna menskalakan node Spot juga.
startingNumberOfVMs = 1;
maxNumberofVMs = 25;
pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(TimeInterval_Minute * 15);
pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(TimeInterval_Minute * 15));
$TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);
$NodeDeallocationOption = taskcompletion;
Penting
Saat ini, Layanan Batch memiliki batasan dalam hal penyelesaian tugas yang tertunda. Saat tugas ditambahkan ke pekerjaan, tugas juga ditambahkan ke dalam antrean internal yang digunakan oleh layanan Batch untuk penjadwalan. Jika tugas dihapus sebelum dapat dijadwalkan, tugas mungkin bertahan dalam antrean, menyebabkannya masih dihitung dalam $PendingTasks. Tugas yang dihapus ini akhirnya akan dihapus dari antrean ketika Batch mempunyai kesempatan untuk menarik tugas dari antrean untuk dijadwalkan dengan simpul yang menganggur di kumpulan Batch.
Simpul yang dipreempt
Contoh ini membuat kolam yang dimulai dengan 25 node Spot. Setiap kali node Spot dihentikan, node tersebut diganti dengan node khusus. Seperti contoh pertama, maxNumberofVMs variabel mencegah kumpulan melebihi 25 VM. Contoh ini berguna untuk memanfaatkan Spot VMs sekaligus memastikan bahwa hanya jumlah pemutusan tetap yang terjadi selama masa operasional kumpulan.
maxNumberofVMs = 25;
$TargetDedicatedNodes = min(maxNumberofVMs, $PreemptedNodeCount.GetSample(180 * TimeInterval_Second));
$TargetLowPriorityNodes = min(maxNumberofVMs , maxNumberofVMs - $TargetDedicatedNodes);
$NodeDeallocationOption = taskcompletion;
Anda akan mempelajari selengkapnya tentang cara membuat rumus skala otomatis dan melihat contoh rumus skala otomatis lainnya nanti di artikel ini.
Variabel
Anda dapat menggunakan variabel yang ditentukan oleh layanan dan yang ditentukan oleh pengguna dalam rumus skala otomatis Anda.
Variabel yang didefinisikan oleh layanan terintegrasi dalam layanan Batch. Beberapa variabel yang ditentukan oleh layanan adalah variabel baca-tulis, dan beberapa lainnya adalah variabel baca-saja.
Variabel yang ditentukan pengguna adalah variabel yang Anda tentukan. Dalam contoh sebelumnya, $TargetDedicatedNodes dan $PendingTasks merupakan variabel yang ditentukan layanan, sementara startingNumberOfVMs dan maxNumberofVMs merupakan variabel yang ditentukan pengguna.
Catatan
Variabel yang ditentukan layanan selalu didahului oleh tanda dolar ($). Untuk variabel yang ditentukan pengguna, tanda dolar bersifat opsional.
Tabel berikut menunjukkan variabel yang dapat dibaca-dan-ditulis dan yang hanya-dapat-dibaca yang ditentukan oleh layanan Batch.
Variabel yang ditentukan layanan baca-tulis
Anda bisa mendapatkan dan mengatur nilai variabel yang ditentukan layanan ini untuk mengelola jumlah simpul komputasi dalam kumpulan.
| Variabel | Deskripsi |
|---|---|
| $TargetDedicatedNodes | Jumlah target simpul komputasi khusus untuk kumpulan. Ditentukan sebagai target karena kumpulan mungkin tidak selalu mencapai jumlah node yang diinginkan. Misalnya, jika jumlah target simpul khusus dimodifikasi oleh evaluasi skala otomatis sebelum kumpulan mencapai target awal, kumpulan mungkin tidak mencapai target. Sebuah pool dalam akun yang dibuat dalam mode layanan Batch mungkin tidak dapat mencapai sasarannya jika sasaran tersebut melebihi simpul akun Batch atau kuota inti. Kumpulan dalam akun yang dibuat dalam mode berlangganan pengguna mungkin tidak mencapai sasarannya jika sasaran tersebut melebihi kuota inti bersama untuk langganan. |
| $TargetLowPriorityNodes | Jumlah node komputasi Spot yang ditargetkan untuk kumpulan. Ditentukan sebagai target karena kumpulan mungkin tidak selalu mencapai jumlah node yang diinginkan. Misalnya, jika jumlah target simpul Spot dimodifikasi oleh evaluasi skala otomatis sebelum kumpulan mencapai target awal, kumpulan mungkin tidak mencapai target. Kumpulan mungkin juga tidak mencapai targetnya jika target melebihi simpul akun Batch atau kuota inti. Untuk informasi selengkapnya tentang node komputasi Spot, lihat Menggunakan mesin virtual Spot dengan Batch. |
| $NodeDeallocationOption | Tindakan yang terjadi ketika simpul komputasi dihapus dari kumpulan. Kemungkinan nilai adalah: - Requeue: Nilai default. Segera mengakhiri tugas dan memasukkannya kembali ke dalam antrean tugas agar dapat dijadwalkan ulang. Tindakan ini memastikan jumlah target simpul tercapai secepat mungkin. Namun, mungkin kurang efisien, karena tugas yang sedang berjalan terganggu dan kemudian harus dimulai ulang. - mengakhiri: Segera mengakhiri tugas dan menghapusnya dari antrean pekerjaan. - penyelesaian tugas: Menunggu tugas yang sedang berjalan selesai dan kemudian mengeluarkan node dari pool. Gunakan opsi ini untuk mencegah tugas terganggu dan diulang, sehingga tidak membuang pekerjaan apa pun yang telah dilakukan. - retaineddata: Menunggu sampai semua data yang dipertahankan oleh tugas lokal pada simpul dibersihkan sebelum menghapus simpul dari kumpulan tersebut. |
Catatan
Variabel $TargetDedicatedNodes ini juga dapat ditentukan menggunakan alias $TargetDedicated. Demikian pula, variabel $TargetLowPriorityNodes dapat ditentukan menggunakan alias $TargetLowPriority. Jika variabel dengan nama lengkap dan aliasnya diatur oleh rumus, nilai yang ditetapkan ke variabel dengan nama lengkap lebih diprioritaskan.
Variabel yang ditentukan layanan baca-saja
Anda bisa mendapatkan nilai variabel yang ditentukan layanan ini untuk membuat penyesuaian yang didasarkan pada metrik dari layanan Batch.
Penting
Tugas rilis pekerjaan tidak termasuk saat ini dalam variabel yang menyediakan jumlah tugas, seperti $ActiveTasks dan $PendingTasks. Bergantung pada rumus skala otomatis Anda, ini dapat mengakibatkan simpul dihapus, sehingga tidak ada simpul yang tersedia untuk menjalankan tugas pelepasan pekerjaan.
Petunjuk
Variabel yang ditentukan layanan baca-saja adalah objek yang menyediakan berbagai metode untuk mengakses data yang terkait dengan masing-masing. Untuk informasi selengkapnya, lihat Mendapatkan data sampel nanti di artikel ini.
| Variabel | Deskripsi |
|---|---|
| $CPUPercent | Persentase rata-rata penggunaan CPU. |
| $ActiveTasks | Jumlah tugas yang siap dijalankan tetapi belum dijalankan. Ini termasuk semua tugas yang dalam keadaan aktif dan yang dependensinya telah terpenuhi. Tugas apa pun yang berada dalam status aktif tetapi dependensinya belum terpenuhi dikecualikan dari $ActiveTasks hitungan. Untuk tugas multi-instans, $ActiveTasks sertakan jumlah instans yang ditetapkan pada tugas. |
| $RunningTasks | Jumlah tugas yang sedang berjalan. |
| $TugasMenunggu | Jumlah dari $ActiveTasks dan $RunningTasks. |
| $TugasBerhasil | Jumlah tugas yang berhasil diselesaikan. |
| $TugasGagal | Jumlah tugas yang gagal. |
| (Posisi Pekerjaan Per Node) | Jumlah slot tugas yang dapat digunakan untuk menjalankan tugas bersamaan pada satu simpul komputasi dalam kumpulan. |
| $NodeTerdedikasiSaatIni | Jumlah simpul komputasi khusus saat ini. |
| $CurrentLowPriorityNodes | Jumlah simpul komputasi Spot saat ini, termasuk node apa pun yang telah diambil alih. |
| $UsableNodeCount | Jumlah simpul komputasi yang dapat digunakan. |
| $JumlahNodeYangDicegah | Jumlah simpul dalam kumpulan yang berada dalam keadaan diinterupsi. |
Catatan
Gunakan $RunningTasks saat penskalaan berdasarkan jumlah tugas yang berjalan pada titik waktu tertentu, dan $ActiveTasks saat penskalaan berdasarkan jumlah tugas yang diantrekan untuk dijalankan.
Jenis
Rumus skala otomatis mendukung jenis berikut ini:
- ganda
- doubleVec
- doubleVecList
- benang
- tanda waktu--struktur gabungan yang berisi anggota berikut:
- tahun
- bulan (1-12)
- hari (1-31)
- hari kerja (dalam format angka; misalnya, 1 untuk Senin)
- jam (dalam format angka 24 jam; misalnya, 13 berarti 1 siang)
- menit (00-59)
- detik (00-59)
- timeinterval
- TimeInterval_Zero
- TimeInterval_100ns
- TimeInterval_Microsecond
- TimeInterval_Millisecond
- IntervalWaktu_Detik
- TimeInterval_Menit
- IntervalWaktu_Jam
- IntervalWaktu_Hari
- IntervalWaktu_Minggu
- IntervalWaktu_Tahun
Operasional
Operasi ini diperbolehkan pada jenis yang tercantum di bagian sebelumnya.
| Operasi | Operator yang didukung | Jenis Hasil |
|---|---|---|
| ganda operator ganda | +, -, *, / | ganda |
| timeinterval operator ganda | * | timeinterval |
| operator doubleVec ganda | +, -, *, / | doubleVec |
| operator doubleVec doubleVec | +, -, *, / | doubleVec |
| selang waktu operator ganda | *, / | timeinterval |
| timeinterval operator timeinterval | +, - | timeinterval |
| timeinterval operator tanda waktu | + | stempel waktu |
| timeinterval operator tanda waktu | + | stempel waktu |
| penanda waktu operator penanda waktu | - | timeinterval |
| operator ganda | -, ! | ganda |
| timeinterval operator | - | timeinterval |
| ganda operator ganda | <, <=, ==, >=, >, != | ganda |
| string operator string | <, <=, ==, >=, >, != | ganda |
| penanda waktu operator penanda waktu | <, <=, ==, >=, >, != | ganda |
| timeinterval operator timeinterval | <, <=, ==, >=, >, != | ganda |
| ganda operator ganda | &&, || | ganda |
Menguji ganda dengan operator terner (double ? statement1 : statement2), menghasilkan nonzero sebagai true, dan nol sebagai false.
Fungsi
Anda bisa menggunakan fungsi yang sudah ditentukan sebelumnya ini saat menentukan rumus skala otomatis.
| Fungsi | Tipe pengembalian | Deskripsi |
|---|---|---|
| avg(doubleVecList) | ganda | Mengembalikan nilai rata-rata untuk semua nilai dalam doubleVecList. |
| ceil(double) | ganda | Mengembalikan nilai bilangan bulat terkecil tidak kurang dari ganda. |
| ceil(doubleVecList) | doubleVec | Mengembalikan berdasarkan komponen ceil dari doubleVecList. |
| fungsi lantai(double) | ganda | Mengembalikan nilai bilangan bulat terbesar yang tidak lebih besar dari dua kali lipat. |
| floor(doubleVecList) | doubleVec | Mengembalikan berdasarkan komponen floor dari doubleVecList. |
| len(doubleVecList) | ganda | Mengembalikan panjang vektor yang dibuat dari doubleVecList. |
| lg(ganda) | ganda | Mengembalikan basis log 2 dari ganda. |
| lg(doubleVecList) | doubleVec | Mengembalikan berdasarkan komponen lg dari doubleVecList. |
| ln(double) | ganda | Mengembalikan logaritma natural dari bilangan double. |
| ln(doubleVecList) | doubleVec | Mengembalikan berdasarkan komponen ln dari doubleVecList. |
| log(ganda) | ganda | Mengembalikan basis log 10 dari ganda. |
| log(doubleVecList) | doubleVec | Mengembalikan berdasarkan komponen log dari doubleVecList. |
| max(doubleVecList) | ganda | Mengembalikan nilai maksimum dalam doubleVecList. |
| min(doubleVecList) | ganda | Mengembalikan nilai minimum dalam doubleVecList. |
| norm(doubleVecList) | ganda | Mengembalikan norma dua dari vektor yang dibentuk dari doubleVecList. |
| persentil(doubleVec v, double p) | ganda | Mengembalikan elemen persentil dari vektor v. |
| rand() | ganda | Mengembalikan nilai acak antara 0,0 dan 1,0. |
| range(doubleVecList) | ganda | Mengembalikan perbedaan antara nilai min dan max dalam doubleVecList. |
| pembulatan(double) | ganda | Mengembalikan nilai bilangan bulat terdekat ke double (dalam format floating-point), membulatkan angka yang berada di tengah menjauhi nol. |
| round(doubleVecList) | doubleVec | Mengembalikan berdasarkan komponen round dari doubleVecList. |
| std(doubleVecList) | ganda | Mengembalikan standar deviasi sampel dari nilai-nilai dalam doubleVecList. |
| hentikan() | Menghentikan evaluasi terhadap ekspresi penskalaan otomatis. | |
| jumlahkan(doubleVecList) | ganda | Mengembalikan jumlah semua komponen doubleVecList. |
| time(string dateTime="") | stempel waktu | Mengembalikan cap waktu dari waktu saat ini jika tidak ada parameter yang dilewatkan, atau cap waktu dari string tanggal dan waktu jika dilewatkan. Format tanggalwaktu yang didukung adalah W3C-DTF dan RFC 1123. |
| val(doubleVec v, double i) | ganda | Mengembalikan nilai elemen yang berada di lokasi i di vektor v, dengan indeks awal nol. |
Beberapa fungsi yang diuraikan dalam tabel sebelumnya bisa menerima daftar sebagai argumen. Daftar yang dipisahkan koma adalah kombinasi dari double dan doubleVec. Contohnya:
doubleVecList := ( (double | doubleVec)+(, (double | doubleVec) )* )?
Nilai doubleVecList dikonversi menjadi single doubleVec sebelum dievaluasi. Misalnya, jika v = [1,2,3], maka panggilan avg(v) setara dengan panggilan avg(1,2,3). Panggilan avg(v, 7) setara dengan panggilan avg(1,2,3,7).
Metrik
Anda dapat menggunakan metrik sumber daya dan tugas saat menentukan rumus. Anda menyesuaikan jumlah target simpul khusus dalam kumpulan berdasarkan data metrik yang Anda peroleh dan evaluasi. Untuk informasi selengkapnya tentang setiap metrik, lihat bagian Variabel .
| Metrik | Deskripsi |
|---|---|
| Sumber daya | Metrik sumber daya didasarkan pada CPU, bandwidth, penggunaan memori simpul komputasi, dan jumlah simpul. Variabel yang ditentukan layanan ini berguna untuk membuat penyesuaian berdasarkan jumlah simpul: - $TargetDedicatedNodes - $TargetLowPriorityNodes - $CurrentDedicatedNodes - $CurrentLowPriorityNodes - $PreemptedNodeCount - $UsableNodeCount Variabel yang ditentukan layanan ini berguna untuk membuat penyesuaian berdasarkan penggunaan sumber daya simpul: - $CPUPersen |
| Tugas | Metrik tugas didasarkan pada status tugas, seperti Aktif, Tertunda, dan Selesai. Variabel yang ditentukan layanan berikut berguna untuk membuat penyesuaian ukuran kumpulan berdasarkan metrik tugas: - $ActiveTasks - $RunningTasks - $PendingTasks - $TugasBerhasil - $FailedTasks |
Mendapatkan contoh data
Operasi inti rumus skala otomatis adalah mendapatkan data metrik tugas dan sumber daya (sampel), lalu menyesuaikan ukuran kumpulan berdasarkan data tersebut. Dengan demikian, penting untuk memiliki pemahaman yang jelas tentang bagaimana rumus skala otomatis berinteraksi dengan sampel.
Metode
Rumus skala otomatis bertindak berdasarkan sampel data metrik yang disediakan oleh layanan Batch. Rumus menambah atau mengurangi jumlah simpul komputasi dalam kumpulan berdasarkan nilai yang diperolehnya. Variabel yang ditentukan layanan adalah objek yang menyediakan metode untuk mengakses data yang terkait dengan objek tersebut. Misalnya, ekspresi berikut menunjukkan permintaan untuk mendapatkan lima menit terakhir penggunaan CPU:
$CPUPercent.GetSample(TimeInterval_Minute * 5)
Metode berikut dapat digunakan untuk mendapatkan data sampel tentang variabel yang ditentukan layanan.
| Metode | Deskripsi |
|---|---|
| GetSample() | Metode GetSample() ini mengembalikan vektor sampel data.Sampel adalah data metrik berdurasi 30 detik. Dengan kata lain, sampel diperoleh setiap 30 detik. Tetapi seperti yang disebutkan di bawah ini, ada penundaan antara saat sampel dikumpulkan dan ketika tersedia untuk formula. Dengan demikian, tidak semua sampel untuk periode waktu tertentu mungkin tersedia untuk dievaluasi oleh rumus. - doubleVec GetSample(double count): Menentukan jumlah sampel yang akan diperoleh dari sampel terbaru yang dikumpulkan.
GetSample(1) mengembalikan sampel terakhir yang tersedia. Namun, untuk metrik seperti $CPUPercent, GetSample(1) tidak boleh digunakan, karena tidak mungkin untuk mengetahui kapan sampel dikumpulkan. Bisa baru-baru ini, atau, karena masalah sistem, mungkin juga sudah terlalu lama. Dalam kasus seperti itu, lebih baik menggunakan interval waktu seperti yang ditunjukkan di bawah ini.- doubleVec GetSample((timestamp or timeinterval) startTime [, double samplePercent]): Menentukan jangka waktu untuk mengumpulkan data sampel. Secara opsional, ini juga menentukan persentase sampel yang harus tersedia dalam jangka waktu yang diminta. Misalnya, $CPUPercent.GetSample(TimeInterval_Minute * 10) akan mengembalikan 20 sampel jika semua sampel selama 10 menit terakhir ada dalam CPUPercent riwayat. Jika menit terakhir sejarah tidak dapat diakses, hanya 18 sampel yang akan diperoleh kembali. Dalam kasus ini $CPUPercent.GetSample(TimeInterval_Minute * 10, 95) akan gagal karena hanya 90 persen sampel yang tersedia, tetapi $CPUPercent.GetSample(TimeInterval_Minute * 10, 80) akan berhasil.- doubleVec GetSample((timestamp or timeinterval) startTime, (timestamp or timeinterval) endTime [, double samplePercent]): Menentukan jangka waktu untuk mengumpulkan data, dengan waktu mulai dan waktu akhir. Seperti disebutkan di atas, ada penundaan antara ketika sampel dikumpulkan dan ketika tersedia untuk rumus. Pertimbangkan penundaan ini saat Anda menggunakan metode GetSample ini. Lihat GetSamplePercent bawah. |
| GetSamplePeriod() | Mengembalikan periode sampel yang diambil dalam rangkaian data sampel riwayat. |
| Count() | Mengembalikan jumlah total sampel dalam riwayat metrik. |
| HistoryBeginTime() | Mengembalikan tanda waktu sampel data tertua yang tersedia untuk metrik. |
| GetSamplePercent() | Mengembalikan persentase sampel yang tersedia untuk interval waktu tertentu. Contohnya,doubleVec GetSamplePercent( (timestamp or timeinterval) startTime [, (timestamp or timeinterval) endTime] ). Karena metode GetSample gagal jika persentase sampel yang dikembalikan kurang dari samplePercent yang ditentukan, Anda dapat menggunakan metode GetSamplePercent untuk memeriksa terlebih dahulu. Kemudian Anda dapat melakukan tindakan alternatif jika sampel yang tidak mencukupi ada, tanpa menghentikan evaluasi penskalaan otomatis. |
Sampel
Layanan Batch secara berkala mengambil sampel metrik tugas dan sumber daya dan membuatnya tersedia untuk rumus skala otomatis Anda. Sampel ini dicatat setiap 30 detik oleh layanan Batch. Namun, biasanya ada penundaan antara kapan sampel tersebut direkam dan kapan sampel tersebut tersedia untuk (dan dibaca oleh) rumus skala otomatis Anda. Selain itu, sampel mungkin tidak direkam untuk interval tertentu karena faktor-faktor seperti jaringan atau masalah infrastruktur lainnya.
Sampel persentase
Ketika samplePercent diteruskan ke metode GetSample() atau ketika metode GetSamplePercent() dipanggil, persen mengacu pada perbandingan antara jumlah total kemungkinan sampel yang dicatat oleh layanan Batch dan jumlah sampel yang tersedia untuk rumus skala otomatis Anda.
Mari kita lihat rentang waktu 10 menit sebagai contoh. Karena sampel dicatat setiap 30 detik dalam rentang waktu 10 menit itu, jumlah total maksimum sampel yang dicatat oleh Batch adalah 20 sampel (2 per menit). Namun, karena latensi mekanisme pelaporan yang melekat dan masalah lain dalam Azure, mungkin hanya ada 15 sampel yang tersedia untuk rumus skala otomatis Anda untuk dibaca. Jadi, misalnya, untuk periode 10 menit itu, hanya 75 persen dari jumlah total sampel yang direkam mungkin tersedia untuk rumus Anda.
GetSample() dan rentang sampel
Rumus penskalaan otomatis Anda menambah dan mengurangi kumpulan Anda dengan menambahkan atau menghapus simpul. Karena simpul membutuhkan biaya, pastikan rumus Anda menggunakan metode analisis cerdas yang didasarkan pada data yang memadai. Disarankan agar Anda menggunakan analisis tren dalam rumus Anda. Jenis ini memperbesar dan memperkecil kumpulan Anda berdasarkan rentang sampel yang dikumpulkan.
Untuk melakukannya, gunakan GetSample(interval look-back start, interval look-back end) untuk mengembalikan vektor sampel:
$runningTasksSample = $RunningTasks.GetSample(1 * TimeInterval_Minute, 6 * TimeInterval_Minute);
Saat Batch mengevaluasi baris di atas, Batch mengembalikan rentang sampel sebagai vektor nilai. Contohnya:
$runningTasksSample=[1,1,1,1,1,1,1,1,1,1];
Setelah mengumpulkan vektor sampel, Anda kemudian dapat menggunakan fungsi seperti min(), max(), dan avg() untuk mendapatkan nilai yang bermakna dari rentang yang dikumpulkan.
Untuk berhati-hati ekstra, Anda dapat memaksa agar evaluasi rumus gagal jika kurang dari persentase sampel tertentu yang tersedia dalam periode waktu tertentu. Saat Anda memaksa evaluasi rumus gagal, Anda menginstruksikan Batch untuk menghentikan evaluasi rumus lebih lanjut jika persentase sampel yang ditentukan tidak tersedia. Dalam hal ini, tidak ada perubahan yang dilakukan pada ukuran kumpulan. Untuk menentukan persentase sampel yang diperlukan agar evaluasi berhasil, tentukan sebagai parameter ketiga untuk GetSample(). Di sini, ditentukan persyaratan 75 persen sampel :
$runningTasksSample = $RunningTasks.GetSample(60 * TimeInterval_Second, 120 * TimeInterval_Second, 75);
Karena mungkin ada keterlambatan dalam ketersediaan sampel, Anda harus selalu menentukan rentang waktu dengan waktu mulai look-back yang lebih lama dari satu menit. Dibutuhkan sekitar satu menit agar sampel menyebar melalui sistem, sehingga sampel dalam rentang (0 * TimeInterval_Second, 60 * TimeInterval_Second) mungkin tidak tersedia. Sekali lagi, Anda dapat menggunakan parameter GetSample() persentase untuk memaksa persyaratan persentase sampel tertentu.
Penting
Kami sangat menyarankan agar Anda tidak mengandalkanhanya pada GetSample(1)penskalaan otomatis. Ini karena GetSample(1) pada dasarnya mengatakan kepada layanan Batch, "Beri saya sampel terakhir yang Anda miliki, tidak peduli berapa lama anda mengambilnya." Karena ini hanya sampel tunggal, dan mungkin sampel yang lebih lama, sampel mungkin tidak mewakili gambaran tugas atau status sumber daya terbaru yang lebih besar. Jika Anda menggunakan GetSample(1), pastikan bahwa itu adalah bagian dari pernyataan yang lebih besar dan bukan satu-satunya titik data yang diandalkan dalam rumus Anda.
Membuat rumus skala otomatis
Anda menyusun rumus skala otomatis dengan membentuk pernyataan yang menggunakan komponen di atas, lalu menggabungkan pernyataan tersebut ke dalam rumus lengkap. Di bagian ini, Anda membuat contoh rumus skala otomatis yang dapat melakukan keputusan penskalaan dunia nyata dan membuat penyesuaian.
Pertama, mari kita tentukan persyaratan untuk rumus skala otomatis baru kami. Rumus harus:
- Tingkatkan jumlah simpul komputasi dedikasi dalam suatu kumpulan jika penggunaan CPU tinggi.
- Mengurangi jumlah target simpul komputasi khusus dalam kumpulan saat penggunaan CPU rendah.
- Selalu membatasi jumlah maksimum simpul khusus hingga 400.
- Saat mengurangi jumlah simpul, jangan hapus simpul yang menjalankan tugas; jika perlu, tunggu sampai tugas selesai sebelum menghapus simpul.
Pernyataan pertama dalam rumus meningkatkan jumlah simpul selama penggunaan CPU yang tinggi. Anda menentukan pernyataan yang mengisi variabel yang ditentukan pengguna ($totalDedicatedNodes) dengan nilai yang 110 persen dari jumlah target simpul khusus saat ini, tetapi hanya jika penggunaan CPU rata-rata minimum selama 10 menit terakhir di atas 70 persen. Jika tidak, sistem menggunakan nilai untuk jumlah simpul khusus saat ini.
$totalDedicatedNodes =
(min($CPUPercent.GetSample(TimeInterval_Minute * 10)) > 0.7) ?
($CurrentDedicatedNodes * 1.1) : $CurrentDedicatedNodes;
Untuk mengurangi jumlah simpul khusus selama penggunaan CPU rendah, pernyataan berikutnya dalam rumus menetapkan variabel yang sama $totalDedicatedNodes menjadi 90 persen dari jumlah target simpul khusus saat ini, jika penggunaan CPU rata-rata dalam 60 menit terakhir kurang dari 20 persen. Jika tidak, ia menggunakan nilai saat ini dari $totalDedicatedNodes yang telah diisi dalam pernyataan di atas.
$totalDedicatedNodes =
(avg($CPUPercent.GetSample(TimeInterval_Minute * 60)) < 0.2) ?
($CurrentDedicatedNodes * 0.9) : $totalDedicatedNodes;
Sekarang, batasi jumlah target simpul komputasi khusus hingga maksimum 400.
$TargetDedicatedNodes = min(400, $totalDedicatedNodes);
Terakhir, pastikan bahwa simpul tidak dihapus hingga tugasnya selesai.
$NodeDeallocationOption = taskcompletion;
Berikut rumus lengkapnya:
$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;
Catatan
Jika Anda mau, Anda dapat menyertakan komentar dan pembatas baris dalam string rumus. Perlu diketahui juga bahwa titik koma yang hilang dapat mengakibatkan kesalahan evaluasi.
Interval otomatis penskalaan
Secara default, layanan Batch menyesuaikan ukuran kumpulan sesuai dengan rumus skala otomatis setiap 15 menit. Interval ini dapat dikonfigurasi dengan menggunakan properti kumpulan berikut:
- CloudPool.AutoScaleEvaluationInterval (Batch .NET)
- autoScaleEvaluationInterval (REST API)
Interval minimum adalah lima menit, dan maksimum adalah 168 jam. Jika interval ditentukan di luar rentang ini, layanan Batch mengembalikan kesalahan Permintaan Buruk (400).
Catatan
Autoscaling saat ini tidak dimaksudkan untuk menanggapi perubahan dalam waktu kurang dari satu menit, melainkan dimaksudkan untuk menyesuaikan ukuran kumpulan Anda secara bertahap saat Anda menjalankan beban kerja.
Membuat kumpulan yang mendukung penskalaan otomatis dengan Batch SDK
Penskalaan otomatis dari kumpulan dapat dikonfigurasi menggunakan salah satu dari Batch SDK, Batch REST API, cmdlet Batch PowerShell, dan Batch CLI. Di bagian ini, Anda dapat melihat contoh untuk .NET dan Python.
.JARING
Untuk membuat kumpulan dengan penskalaan otomatis diaktifkan di .NET, ikuti langkah-langkah berikut:
- Buat kumpulan dengan BatchClient.PoolOperations.CreatePool.
- Atur properti CloudPool.AutoScaleEnabled menjadi true.
- Atur properti CloudPool.AutoScaleFormula dengan rumus skala otomatis Anda.
- (Opsional) Mengatur properti CloudPool.AutoScaleEvaluationInterval (defaultnya adalah 15 menit).
- Kirimkan kumpulan dengan CloudPool.Commit atau CommitAsync.
Contoh berikut membuat kumpulan yang mendukung penskalaan otomatis di .NET. Rumus penskalaan otomatis kolam menetapkan jumlah simpul khusus yang ditargetkan menjadi 5 pada hari Senin, dan menjadi 1 pada setiap hari lainnya dalam seminggu.
Interval penskalaan otomatis diatur ke 30 menit. Dalam cuplikan ini dan cuplikan C# lainnya dalam artikel ini, myBatchClient adalah instans yang diinisialisasi dengan benar dari kelas 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();
Penting
Saat Anda membuat kumpulan berkemampuan skala otomatis, jangan tentukan parameter targetDedicatedNodes atau parameter targetLowPriorityNodes pada panggilan ke CreatePool. Sebagai gantinya, tentukan properti AutoScaleEnabled dan properti AutoScaleFormula pada kumpulan. Nilai untuk properti ini menentukan jumlah target dari setiap jenis simpul.
Untuk mengubah ukuran kumpulan yang mendukung penskalaan otomatis secara manual (misalnya, dengan BatchClient.PoolOperations.ResizePoolAsync), Anda harus terlebih dahulu menonaktifkan penskalaan otomatis pada kumpulan, lalu mengubah ukurannya.
Petunjuk
Untuk contoh selengkapnya tentang menggunakan .NET SDK, lihat repositori Mulai Cepat .NET Batch di GitHub.
Phyton
Untuk membuat kumpulan berkemampuan skala otomatis dengan Python SDK:
- Buat kumpulan dan tentukan konfigurasinya.
- Tambahkan kumpulan ke klien layanan.
- Aktifkan skala otomatis pada kumpulan dengan rumus yang Anda tulis.
Contoh berikut mengilustrasikan langkah-langkah ini.
# 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)
Petunjuk
Untuk contoh selengkapnya tentang menggunakan Python SDK, lihat repositori Quickstart Python Batch di GitHub.
Aktifkan penskalaan otomatis pada kumpulan yang ada
Setiap Batch SDK menyediakan cara untuk mengaktifkan penskalaan otomatis. Contohnya:
- BatchClient.PoolOperations.EnableAutoScaleAsync (Batch .NET)
- Aktifkan penskalaan otomatis pada kumpulan (REST API)
Saat Anda mengaktifkan penskalaan otomatis pada kumpulan yang ada, ingatlah:
- Jika penskalaan otomatis saat ini dinonaktifkan pada kumpulan, Anda harus menentukan rumus skala otomatis yang valid saat Anda mengeluarkan permintaan. Anda dapat menentukan interval penskalaan otomatis secara opsional. Jika Anda tidak menentukan interval, akan digunakan nilai default 15 menit.
- Jika penskalaan otomatis saat ini diaktifkan pada kumpulan, Anda bisa menentukan rumus baru, interval baru, atau keduanya. Anda harus menentukan minimal salah satu atribut ini.
- Jika Anda menentukan interval penskalaan otomatis baru, jadwal yang ada akan dihentikan dan jadwal baru dimulai. Waktu mulai jadwal baru adalah waktu di mana permintaan untuk mengaktifkan penskalaan otomatis dikeluarkan.
- Jika Anda menghilangkan rumus atau interval skala otomatis, layanan Batch terus menggunakan nilai pengaturan tersebut saat ini.
Catatan
Jika Anda menentukan nilai untuk parameter targetDedicatedNodes atau targetLowPriorityNodes metode CreatePool saat Anda membuat kumpulan di .NET, atau untuk parameter yang sebanding dalam bahasa lain, maka nilai tersebut diabaikan saat rumus skala otomatis dievaluasi.
Contoh C# ini menggunakan pustaka .NET Batch untuk mengaktifkan penskalaan otomatis pada kumpulan yang ada.
// 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);
Perbarui rumus skala otomatis
Untuk memperbarui rumus pada kumpulan berkemampuan skala otomatis yang sudah ada, jalankan operasi untuk mengaktifkan skala otomatis lagi dengan rumus baru. Misalnya, jika penskalaan otomatis sudah diaktifkan pada myexistingpool ketika kode .NET berikut dijalankan, rumus skala otomatisnya diganti dengan konten myNewFormula.
await myBatchClient.PoolOperations.EnableAutoScaleAsync(
"myexistingpool",
autoscaleFormula: myNewFormula);
Memperbarui interval penskalaan otomatis
Untuk memperbarui interval evaluasi skala otomatis dari kumpulan berkemampuan skala otomatis yang ada, panggil operasi untuk mengaktifkan penskalaan otomatis lagi dengan interval baru. Misalnya, untuk mengatur interval evaluasi skala otomatis menjadi 60 menit untuk kumpulan yang sudah diaktifkan secara otomatis di .NET:
await myBatchClient.PoolOperations.EnableAutoScaleAsync(
"myexistingpool",
autoscaleEvaluationInterval: TimeSpan.FromMinutes(60));
Mengevaluasi rumus skala otomatis
Anda bisa mengevaluasi rumus sebelum menerapkannya ke kumpulan. Ini memungkinkan Anda menguji hasil rumus sebelum Anda memasukkannya ke dalam produksi.
Sebelum Anda bisa mengevaluasi rumus skala otomatis, Anda harus terlebih dahulu mengaktifkan penghitungan otomatis pada kumpulan dengan rumus yang valid, seperti rumus satu baris $TargetDedicatedNodes = 0. Lalu, gunakan salah satu hal berikut ini untuk mengevaluasi rumus yang ingin Anda uji:
BatchClient.PoolOperations.EvaluateAutoScale atau EvaluateAutoScaleAsync
Metode Batch .NET ini memerlukan ID dari pool yang ada dan string yang berisi rumus penskalaan otomatis untuk dievaluasi.
Mengevaluasi rumus penskalaan otomatis
Dalam permintaan REST API ini, tentukan ID kumpulan di URI, dan rumus skala otomatis di elemen autoScaleFormula dari isi permintaan. Respons operasi berisi informasi kesalahan apa pun yang mungkin terkait dengan rumus.
Contoh Batch .NET berikut mengevaluasi rumus skala otomatis. Jika kumpulan belum menggunakan autoscaling, aktifkan terlebih dahulu.
// 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);
}
}
Evaluasi yang berhasil dari rumus yang diperlihatkan dalam cuplikan kode ini memberikan hasil yang mirip dengan:
AutoScaleRun.Results:
$TargetDedicatedNodes=10;
$NodeDeallocationOption=requeue;
$curTime=2016-10-13T19:18:47.805Z;
$isWeekday=1;
$isWorkingWeekdayHour=0;
$workHours=0
Dapatkan informasi tentang proses skala otomatis
Disarankan untuk memeriksa secara berkala evaluasi rumus penskalaan otomatis Anda oleh layanan Batch. Untuk melakukannya, dapatkan (atau perbarui) referensi ke kumpulan, lalu periksa properti dari operasi penskalaan otomatis terakhirnya.
Dalam Batch .NET, properti CloudPool.AutoScaleRun memiliki beberapa properti yang menyediakan informasi tentang proses penskalaan otomatis terbaru yang dilakukan pada kumpulan:
Di REST API, informasi tentang kumpulan menyertakan informasi eksekusi penskalakan otomatis terbaru di properti autoScaleRun .
Contoh C# berikut menggunakan pustaka .NET Batch untuk mencetak informasi tentang penskalaan otomatis terakhir yang dijalankan pada kumpulan 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);
Contoh output dari contoh sebelumnya:
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:
Dapatkan riwayat skala otomatis yang berjalan menggunakan peristiwa penskalaan otomatis kumpulan
Anda juga dapat memeriksa riwayat penskalaan otomatis dengan mengkueri PoolAutoScaleEvent. Batch menghasilkan event ini untuk merekam setiap kali evaluasi dan eksekusi rumus skala otomatis dilakukan, yang dapat membantu mengidentifikasi dan mengatasi masalah potensial.
Contoh peristiwa untuk 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": []
}
}
Contoh rumus skala otomatis
Mari kita lihat beberapa rumus yang menunjukkan berbagai cara untuk menyesuaikan jumlah sumber daya komputasi dalam kumpulan.
Contoh 1: Penyesuaian berbasis waktu
Misalkan Anda ingin menyesuaikan ukuran kumpulan berdasarkan satu hari tertentu dalam seminggu dan waktu tertentu pada hari itu. Contoh ini menunjukkan cara meningkatkan atau mengurangi jumlah simpul dalam kumpulan yang sesuai.
Rumus ini pertama-tama mendapatkan waktu saat ini. Jika ini adalah hari kerja (1-5) dan dalam jam kerja (8 pagi hingga 6 sore), maka ukuran kumpulan target diatur ke 20 simpul. Jika tidak, nilai ini diatur menjadi 10 simpul.
$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 dapat disesuaikan untuk mencerminkan zona waktu lokal Anda dengan menambahkan time() ke hasil perkalian TimeZoneInterval_Hour dan offset UTC Anda. Untuk contoh, gunakan $curTime = time() + (-6 * TimeInterval_Hour); untuk Waktu Siang Gunung (MDT). Perlu diingat bahwa offset perlu disesuaikan pada awal dan akhir waktu hemat siang, jika diperlukan.
Contoh 2: Penyesuaian berbasis tugas
Dalam contoh C# ini, ukuran kumpulan disesuaikan berdasarkan jumlah tugas dalam antrean. Komentar dan hentian baris disertakan dalam string rumus.
// 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;
Contoh 3: Akuntansi untuk tugas paralel
Contoh C# ini menyesuaikan ukuran kumpulan berdasarkan jumlah tugas. Rumus ini juga memperhitungkan nilai TaskSlotsPerNode yang telah ditetapkan untuk pool. Pendekatan ini berguna dalam situasi di mana eksekusi tugas paralel telah diaktifkan di kumpulan Anda.
// 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;
Contoh 4: Mengatur ukuran kumpulan awal
Contoh ini memperlihatkan contoh C# dengan rumus skala otomatis yang mengatur ukuran kumpulan ke jumlah simpul tertentu untuk periode waktu awal. Setelah itu, menyesuaikan ukuran kumpulan berdasarkan jumlah tugas yang berjalan dan aktif.
Secara khusus, rumus ini melakukan hal berikut:
- Menyetel ukuran kumpulan awal menjadi empat simpul.
- Tidak menyesuaikan ukuran kumpulan dalam 10 menit pertama siklus hidup kumpulan.
- Setelah 10 menit, mendapatkan nilai maksimal dari jumlah tugas yang berjalan dan aktif dalam 60 menit terakhir.
- Jika kedua nilai adalah 0, menunjukkan bahwa tidak ada tugas yang berjalan atau aktif dalam 60 menit terakhir, ukuran kumpulan diatur ke 0.
- Jika salah satu nilai lebih besar dari nol, tidak ada perubahan yang dilakukan.
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);
Langkah berikutnya
- Pelajari cara menjalankan beberapa tugas secara bersamaan pada simpul komputasi di kumpulan Anda. Seiring dengan penskalaan otomatis, hal ini dapat membantu menurunkan durasi kerja untuk beberapa beban kerja, menghemat uang Anda.
- Pelajari cara mengkueri layanan Azure Batch secara efisien.