Antrian merupakan elemen konfigurasi penting dalam penjadwalan tugas untuk manajemen sumber daya dan alokasi yang efektif, pengoptimalan penjadwalan pekerjaan, peningkatan utilisasi sistem, serta memenuhi berbagai persyaratan pekerjaan. Konfigurasi antrian yang tepat memastikan tugas prioritas tinggi menerima sumber daya yang diperlukan terlebih dahulu, memaksimalkan efisiensi pemanfaatan sumber daya. Topik ini menjelaskan cara mengimplementasikan strategi konfigurasi antrian yang sesuai dalam lingkungan Slurm untuk memproses sebanyak mungkin tugas saat pekerjaan dikirimkan atau status pekerjaan berubah, mencapai kinerja optimal.
1. Fitur inti Slurm
Alokasi sumber daya: Mengalokasikan sumber daya CPU/memori/GPU sesuai kebutuhan, menghindari konflik dan pemborosan.
Penjadwalan pekerjaan: Menjadwalkan antrian pekerjaan secara dinamis, mengeksekusi sesuai prioritas, dan memantau status tugas secara keseluruhan.
Kontrol prioritas: Tugas antrian prioritas tinggi dijadwalkan pertama.
Alat pemantauan: Memantau penggunaan sumber daya dan status pekerjaan melalui
scontrol/sacct.Dukungan penyesuaian: Beberapa antrian menyesuaikan dengan berbagai persyaratan (seperti tugas intensif CPU/memori/GPU).
Optimasi sistem: Meningkatkan pemanfaatan sumber daya, mengurangi waktu idle, dan meningkatkan efisiensi komputasi.
Topik ini didasarkan pada versi Slurm 24.05. Versi lainnya mungkin memiliki perbedaan.
2. Jenis antrian Slurm
Tugas Slurm dieksekusi berdasarkan urutan prioritas. Jika partisi memiliki tugas yang tidak dapat dijadwalkan, tugas berikutnya akan dijeda. Tugas prioritas tinggi dapat merebut sumber daya dari tugas prioritas rendah. Tugas yang direbut dapat dibatalkan, direset, atau ditangguhkan. Jika Anda mengaktifkan penjadwalan backfill (default), sistem menghitung apakah tugas prioritas rendah dapat berjalan tanpa menunda tugas prioritas tinggi berdasarkan siklus bf_interval. Ini memerlukan pendudukan seluruh mesin dan dapat memicu preemption di tingkat mesin. Konfigurasi penjadwalan ditentukan melalui SchedulerType (plugin default sched/backfill) dan parameter detail SchedulerParameters di slurm.conf. Untuk konfigurasi parameter spesifik, lihat dokumentasi resmi.
Selama penjadwalan, semua tugas diintegrasikan ke dalam satu daftar, dan urutan eksekusinya ditentukan melalui algoritma prioritas yang berbeda. Slurm mendukung dua jenis antrian berikut:
Antrian First In, First Out (FIFO), di mana tugas diurutkan berdasarkan urutan waktu pengiriman mereka.
Antrian MultiFactors, yang merupakan mekanisme penjadwalan tugas yang lebih canggih dan diaktifkan secara default. Ini dapat menghitung prioritas pekerjaan berdasarkan beberapa faktor.
2.1 Antrian First In, First Out
Secara default, Slurm menggunakan FIFO sebagai dasar untuk mengalokasikan prioritas pekerjaan. File konfigurasi untuk penjadwalan prioritas disimpan di slurm.conf. Anda dapat mengonfigurasi prioritas dengan memodifikasi parameter PriorityType.
# 1. Temukan dan edit file slurm.conf
sudo nano /etc/slurm-llnl/slurm.conf
# 2. Aktifkan mode preemption dan tentukan strategi preemption berdasarkan prioritas first in, first out
PriorityType=priority/basic Anda disarankan untuk mencadangkan file slurm.conf asli sebelum melakukan perubahan, sehingga Anda dapat mengembalikannya jika terjadi masalah. Selain itu, untuk perubahan besar dalam lingkungan produksi, Anda disarankan untuk mengujinya secara menyeluruh di lingkungan pengujian terlebih dahulu.
2.2 Antrian pekerjaan Multifactors
Penjadwalan multifactor Slurm menentukan prioritas tugas melalui perhitungan bobot dari faktor-faktor berikut: waktu eksekusi pekerjaan, perbedaan sumber daya (dialokasikan vs. dikonsumsi), ukuran pekerjaan, parameter pengguna, partisi data, TRES (Total Resource Equivalents) jenis, dan Quality of Service (QoS). Untuk alokasi bobot dan logika perhitungan spesifik, lihat instruksi konfigurasi prioritas multifactor.
Job_priority =
site_factor +
(PriorityWeightAge) * (age_factor) +
(PriorityWeightAssoc) * (assoc_factor) +
(PriorityWeightFairshare) * (fair-share_factor) +
(PriorityWeightJobSize) * (job_size_factor) +
(PriorityWeightPartition) * (priority_job_factor) +
(PriorityWeightQOS) * (QOS_factor) +
SUM(TRES_weight_cpu * TRES_factor_cpu,
TRES_weight_<type> * TRES_factor_<type>,
...)
- nice_factorPrioritas pekerjaan Slurm dihitung menggunakan faktor bobot berikut:
Nilai dasar:
site_factor(skor kustom).Bobot waktu tunggu pekerjaan: Semakin lama waktu tunggu pekerjaan, semakin tinggi bobotnya (
PriorityWeightAge × age_factor).Bobot asosiasi: Keadilan penggunaan sumber daya kelompok pengguna/akun (
PriorityWeightAssoc × assoc_factor).Bobot fair share: Menyesuaikan skor berdasarkan proporsi penggunaan sumber daya (
PriorityWeightFairshare × fair-share_factor).Bobot ukuran pekerjaan: Prioritas pekerjaan kecil/besar (
PriorityWeightJobSize × job_size_factor).Bobot partisi: Prioritas partisi (
PriorityWeightPartition × priority_job_factor).Bobot QoS: Tingkat layanan kualitas (
PriorityWeightQOS × QOS_factor).Bobot sumber daya: Jenis sumber daya (CPU/GPU, dll.) diberi bobot.
Penurunan Nice:
- nice_factor(nilai lebih tinggi berarti prioritas lebih rendah).
Anda dapat mencapai penjadwalan tugas yang adil dan efisien dengan menyesuaikan parameter bobot secara dinamis.
Contoh aplikasi tipikal.
Selesaikan pekerjaan kecil dengan cepat:
Atur
PriorityWeightJobSize=-1, menurunkan prioritas pekerjaan besar sehingga pekerjaan kecil dijadwalkan lebih cepat.Jamin pengguna/kelompok kritis:
Pastikan pekerjaan dari tim penting dijalankan pertama melalui
PriorityWeightAssocdanFair-share_factor.Perlindungan kelaparan sumber daya:
Konfigurasikan
PriorityWeightFairshare=2000, secara signifikan meningkatkan prioritas pekerjaan dari pengguna dengan penggunaan sumber daya rendah.
Contoh: Menyiapkan prioritas pekerjaan multifactor
Menyesuaikan prioritas partisi
Slurm dapat membagi mesin berdasarkan struktur organisasi, membatasi tugas hanya berjalan di kolam sumber daya yang ditugaskan. Tugas diklasifikasikan sebagai mendesak (merebut tugas prioritas rendah) atau tidak mendesak (dieksekusi dengan cepat tetapi tidak memblokir tugas mendesak). Saat tugas mendekati tenggat waktu dan perlu ditandai sebagai mendesak, Slurm tidak dapat menyesuaikan ini secara otomatis. Diperlukan migrasi manual ke antrian prioritas tinggi.
Anda dapat membuat dua partisi yang menunjuk ke kolam node yang sama (membedakan tugas mendesak/tidak mendesak) dan menyesuaikan prioritas secara dinamis dengan mengubah partisi tempat tugas tersebut berada. Ini meningkatkan pemanfaatan sumber daya dan menyederhanakan operasi. Ini mendukung penjadwalan fleksibel beban kerja dinamis sambil mengurangi kompleksitas manajemen. Ini tidak hanya membantu sistem beradaptasi lebih baik dengan persyaratan beban kerja yang berubah secara dinamis tetapi juga menyederhanakan pekerjaan manajemen personel operasi dalam lingkungan pekerjaan yang kompleks. Anda dapat merujuk langkah-langkah berikut untuk pengaturan.
Pertama, aktifkan saklar fungsi preemption di klaster dan atur jenis preemption ke
preempt/partition_prio.# 1. Temukan dan edit file slurm.conf sudo nano /etc/slurm-llnl/slurm.conf # 2. Aktifkan mode preemption dan tentukan strategi preemption berdasarkan prioritas partisi PreemptMode=preempt/partition_prio # 3. Perilaku saat pekerjaan direbut, mendefinisikan apa yang terjadi saat pekerjaan direbut. # cancel berarti mengakhiri pekerjaan; suspend akan menjeda hingga sumber daya tersedia kembali. Pilih berdasarkan kebutuhan Anda. PreemptType=suspend # atau "cancel"PentingAnda disarankan untuk mencadangkan file
slurm.confasli sebelum melakukan perubahan, sehingga Anda dapat mengembalikannya jika terjadi masalah. Selain itu, untuk perubahan besar dalam lingkungan produksi, Anda disarankan untuk mengujinya secara menyeluruh di lingkungan pengujian terlebih dahulu.Anda dapat menambahkan partisi prioritas tinggi di klaster menggunakan perintah berikut, atau dengan menambahkan catatan partisi baru di slurm.conf.
scontrol create partition=hipri PriorityTier=2 nodes=ALLSetelah itu, Anda dapat mencapai preemption pekerjaan dengan mengirimkan pekerjaan ke partisihipriatau mengubah pekerjaan ke partisi prioritas tinggi. Berikut adalah contoh pengiriman pekerjaan.# 1. Tambahkan partisi prioritas tinggi di klaster Slurm. root@slurm-test-0:/# scontrol create partition=hipri PriorityTier=2 nodes=ALL # 2. Lihat partisi klaster saat ini. root@slurm-test-0:/# scontrol show partition # Hasil. PartitionName=debug AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL AllocNodes=ALL Default=YES QoS=N/A DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=0 LLN=NO MaxCPUsPerNode=UNLIMITED MaxCPUsPerSocket=UNLIMITED Nodes=slurm-test-worker-cpu-0 PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=FORCE:1 OverTimeLimit=NONE PreemptMode=GANG,SUSPEND State=UP TotalCPUs=4 TotalNodes=1 SelectTypeParameters=NONE JobDefaults=(null) DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED TRES=cpu=4,mem=6401M,node=1,billing=4 ResumeTimeout=GLOBAL SuspendTimeout=GLOBAL SuspendTime=GLOBAL PowerDownOnIdle=NO PartitionName=hipri AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL AllocNodes=ALL Default=NO QoS=N/A DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=1 LLN=NO MaxCPUsPerNode=UNLIMITED MaxCPUsPerSocket=UNLIMITED Nodes=slurm-test-worker-cpu-0 PriorityJobFactor=1 PriorityTier=2 RootOnly=NO ReqResv=NO OverSubscribe=NO OverTimeLimit=NONE PreemptMode=GANG,SUSPEND State=UP TotalCPUs=0 TotalNodes=0 SelectTypeParameters=NONE JobDefaults=(null) DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED TRES=(null) ResumeTimeout=GLOBAL SuspendTimeout=GLOBAL SuspendTime=GLOBAL PowerDownOnIdle=NO # Kirim 4 tugas berturut-turut. root@slurm-test-0:/# srun sleep 1d & root@slurm-test-0:/# srun sleep 1d & root@slurm-test-0:/# srun sleep 1d & root@slurm-test-0:/# srun sleep 1d & # Periksa status klaster saat ini. root@slurm-test-0:/# squeue # Klaster saat ini memiliki 4 tugas yang sedang berjalan. JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 4 debug sleep root R 0:03 1 slurm-test-worker-cpu-0 2 debug sleep root R 0:04 1 slurm-test-worker-cpu-0 3 debug sleep root R 0:04 1 slurm-test-worker-cpu-0 1 debug sleep root R 0:05 1 slurm-test-worker-cpu-0 # Kirim tugas ke partisi prioritas tinggi. root@slurm-test-0:/# srun --partition=hipri sleep 1d & root@slurm-test-0:/# squeue # ST (status) dari tugas 4 telah berubah dari R menjadi S, dan status tugas 5 berubah menjadi R, menunjukkan bahwa tugas 4 telah ditangguhkan. JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 2 debug sleep root R 1:06 1 slurm-test-worker-cpu-0 3 debug sleep root R 1:06 1 slurm-test-worker-cpu-0 1 debug sleep root R 1:07 1 slurm-test-worker-cpu-0 4 debug sleep root S 0:59 1 slurm-test-worker-cpu-0 5 hipri sleep root R 0:06 1 slurm-test-worker-cpu-0 # Kirim tugas prioritas rendah. root@slurm-test-0:/# srun sleep 1d & # Perbarui tugas ke prioritas tinggi. root@slurm-test-0:/# scontrol update jobid=6 partition=hipri root@slurm-test-0:/# squeue # Tugas 1 dan 2 telah ditangguhkan. Ini karena tugas dalam partisi yang sama berbagi waktu eksekusi, jadi 1, 2, 3, 4 akan dieksekusi secara bergantian. JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 4 debug sleep root R 3:21 1 slurm-test-worker-cpu-0 3 debug sleep root R 3:33 1 slurm-test-worker-cpu-0 2 debug sleep root S 3:41 1 slurm-test-worker-cpu-0 1 debug sleep root S 4:01 1 slurm-test-worker-cpu-0 6 hipri sleep root R 0:03 1 slurm-test-worker-cpu-0 5 hipri sleep root R 3:33 1 slurm-test-worker-cpu-0
Menyesuaikan prioritas kualitas layanan QoS
Slurm perlu mengonfigurasi QoS prioritas tinggi/rendah (secara default, normal dengan prioritas 0 sudah ada) dan mengaktifkan preemption dengan membuat QoS prioritas tinggi melalui sacctmgr. Fungsionalitas preemption perlu diaktifkan di slurm.conf (seperti PreemptMode=priority), tetapi perhatikan: Jika PreemptType=SUSPEND,GANG, setelah tugas prioritas tinggi merebut, tugas prioritas rendah akan berbagi waktu eksekusi dengan tugas prioritas tinggi dalam mode time-sharing (tidak sepenuhnya terganggu). Mengonfigurasi QoS memerlukan penggunaan alat sacctmgr. Berikut adalah perintah umum untuk membuat QoS prioritas tinggi.
sacctmgr add qos high preempt=normal preemptmode=gang,suspend priority=10preempt=normal: Menentukan bahwahighQoS dapat merebut tugas dengannormalQoS.preemptmode=gang,suspend:Mode Gang: Tugas yang merebut perlu sepenuhnya mendapatkan sumber daya sebelum mulai dieksekusi.
Mode Suspend: Tugas yang direbut ditangguhkan bukan diakhiri, melepaskan sumber daya untuk digunakan oleh perebut, dan dilanjutkan saat tugas perebut selesai.
priority=10: Skor dasar prioritas default untuk tugashighQoS adalah 10 (nilai lebih tinggi berarti prioritas lebih tinggi).
Mengaktifkan saklar terkait preemption di slurm.conf melibatkan parameter berikut. Selain itu, saat mengonfigurasi Partition, Anda perlu menambahkan OverSubscribe=FORCE:1 di akhir konfigurasi.
Berikut adalah contoh penggunaan QoS berbeda untuk manajemen preemption tugas:
# Lihat QoS saat ini.
root@slurm-test-0:/# sacctmgr show qos format=name
Name
----------
normal
# Buat QoS prioritas tinggi.
root@slurm-test-0:/# sacctmgr add qos high preempt=normal preemptmode=gang,suspend priority=10
Adding QOS(s)
high
Settings
Description = high
Preempt = normal
PreemptMode = GANG,SUSPEND
Priority = 10
Apakah Anda ingin menyimpan perubahan? (Anda memiliki 30 detik untuk memutuskan)
(N/y): y
# Lihat QoS saat ini.
root@slurm-test-0:/# sacctmgr show qos format=name,priority,preempt
Name Priority Preempt
---------- ---------- ----------
normal 0
high 10 normal
# Isi test.sh adalah sebagai berikut.
# #!/bin/bash
# srun sleep 10m
# Kirim lima tugas berturut-turut.
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 4
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 5
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 6
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 7
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 8
root@slurm-test-0:/# squeue # Tugas 8 dalam status Pending
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
8 debug test.sh root PD 0:00 1 (Resources)
7 debug test.sh root R 0:03 1 slurm-test-worker-cpu-0
5 debug test.sh root R 0:15 1 slurm-test-worker-cpu-0
6 debug test.sh root R 0:15 1 slurm-test-worker-cpu-0
4 debug test.sh root R 0:18 1 slurm-test-worker-cpu-0
root@slurm-test-0:/# sbatch --qos=high test.sh # Kirim tugas ke QoS prioritas tinggi
Submitted batch job 9
root@slurm-test-0:/# squeue # QoS prioritas tinggi mulai dieksekusi, berbagi sumber daya dengan tugas lain dalam mode time-sharing
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
8 debug test.sh root PD 0:00 1 (Resources)
7 debug test.sh root R 0:26 1 slurm-test-worker-cpu-0
5 debug test.sh root R 0:38 1 slurm-test-worker-cpu-0
6 debug test.sh root R 0:38 1 slurm-test-worker-cpu-0
4 debug test.sh root R 0:41 1 slurm-test-worker-cpu-0
9 debug test.sh root S 0:00 1 slurm-test-worker-cpu-0
Menyesuaikan prioritas ukuran pekerjaan
Prioritas ukuran pekerjaan ditentukan oleh PriorityWeightJobSize dan PriorityWeightAge=1000.
Job Size Factor
Tugas non-mendesak perlu memanfaatkan sumber daya klaster secara efisien (tanpa melebihi tenggat waktu). Saat waktu eksekusi tugas tidak diketahui, penjadwalan backfill gagal. Dalam hal ini, memprioritaskan tugas kecil mengurangi head-of-line blocking, sementara meningkatkan prioritas tugas besar berdasarkan panjang antrian mencegah kelaparan. Tugas besar yang mendekati tenggat waktu dapat merebut sumber daya dari tugas kecil (menangguhkan tugas kecil hingga selesai).
Untuk meningkatkan utilisasi klaster untuk tugas non-mendesak (tanpa melebihi tenggat waktu), Anda dapat mengadopsi strategi berikut:
Prioritaskan penjadwalan tugas kecil untuk mengurangi head-of-line blocking.
Tingkatkan prioritas tugas besar berdasarkan panjang antrian untuk mencegah kelaparan.
Izinkan tugas besar yang mendekati tenggat waktu untuk merebut sumber daya dari tugas kecil (tugas kecil ditangguhkan hingga selesai). Saat waktu eksekusi tugas tidak diketahui, penjadwalan backfill gagal, memerlukan mekanisme di atas untuk memastikan pemanfaatan sumber daya yang efisien.
Dengan menerapkan langkah-langkah ini, Anda dapat memaksimalkan pemanfaatan sumber daya klaster sambil memastikan tugas kritis selesai tepat waktu, serta menyeimbangkan berbagai jenis tugas.
Konfigurasi berikut perlu dilakukan di slurm.conf (hanya konfigurasi khusus yang ditampilkan di sini, konfigurasi lain di slurm.conf tidak terpengaruh):
PriorityFavorSmall=YES PriorityWeightAge=1000 PriorityWeightJobSize=1000 PriorityMaxAge=1-0Job Waiting Time Factor
Setelah menyiapkan prioritas ukuran pekerjaan, waktu tunggu pengiriman menjadi faktor kedua. Slurm menghitung skor ukuran pekerjaan berdasarkan rasio sumber daya yang diminta terhadap total sumber daya klaster. Jika
PriorityFavorSmall=YESdiaktifkan, rumus skornya adalah: skor = (1 - rasio sumber daya) × PriorityWeightJobSize. Sebagai contoh, ketika klaster memiliki 4 core CPU tersedia:Skor tugas yang meminta 1 core:
(1 - 1/4) × bobot = 0.75×bobot → contoh skor 0.375 (jika bobot adalah 0.5).Tugas yang meminta 4 core mendapat skor 0 (sepenuhnya menggunakan sumber daya).
Perhitungan prioritas AgeFactor:
Tugas yang melebihi
PriorityMaxAge: Secara langsung menerima poin penuhPriorityWeightAge.Tugas lain mendapat skor berdasarkan proporsi waktu pengiriman. Misalnya, dengan
PriorityWeightAge=1000, setiap menit menambah sekitar 0.69 poin, mencapai 1000 poin penuh setelah 24 jam.
Rekomendasi penjadwalan backfill: Jika waktu eksekusi tugas dapat diperkirakan, Anda disarankan untuk mengaktifkan penjadwalan backfill default (atau mengonfigurasi secara manual
SchedulerType=sched/backfill), memungkinkannya menjadwalkan tugas kecil untuk mengisi periode idle sebelum tugas besar. Dikombinasikan dengan mekanisme prioritas tugas besar default sistem dan fungsionalitas preemption mendekati tenggat waktu, ini dapat menyeimbangkan pemanfaatan sumber daya dan keadilan.