Prom dan konteks
Kluster pengiraan kongsi menjalankan kerja interaktif, kerja kelompok, dan latihan boleh dipintas (preemptible). Penyewa boleh menggunakan kapasiti lonjakan (burst), tetapi tiada penyewa boleh memegang CPU, memori, atau GPU tanpa had. Kerja berkeutamaan tinggi memerlukan masa menunggu yang lebih rendah manakala penyewa berkeutamaan rendah tidak boleh mengalami kebuluran (starvation).
Reka bentuk barisan gilir, lejar sumber, dasar penjadualan, preemption, dan pemulihan. Kubernetes memisahkan PriorityClass, ResourceQuota, dan preemption; panduan pengurusan barisan gilir IETF begitu juga menganggap keadilan dan kawalan kesesakan sebagai kekangan yang berkaitan dan bukannya satu FIFO global tunggal.
Perkara yang diuji oleh penemu duga
- Memisahkan kuota penyewa, keutamaan tugas, dan kebolehlaksanaan nod.
- Menentukan keadilan yang tidak menyebabkan kebuluran bagi kerja berkeutamaan rendah.
- Mengehadkan kesan sampingan preemption, amplifikasi percubaan semula, dan pemecahan (fragmentation).
- Memulihkan daripada kegagalan penjadual, penghantaran pendua, dan kehilangan pekerja (worker).
- Membuktikan keadilan dengan metrik peringkat penyewa berbanding purata kluster.
Soalan penjelasan
- Adakah sumber berupa CPU, memori, GPU, atau nod heterogen dengan cakera tempatan?
- Adakah kuota diskopkan mengikut penyewa, projek, barisan gilir, atau organisasi?
- Bolehkah keutamaan memintas kerja, dan berapakah kos pemulihan titik semak (checkpoint)?
- Bolehkah kerja dipecahkan, dibatalkan, atau dicuba semula, dan adakah penulisan hasil bersifat idempoten?
- Adakah keadilan berasaskan perkongsian max-min, perkongsian berwajaran, atau had masa menunggu?
Jawapan tiga puluh saat
Saya akan mengekalkan kuota, penggunaan, dan kapasiti pinjaman luput bagi setiap penyewa, kemudian meletakkan tugas dalam barisan gilir peringkat penyewa. Selepas menapis kekangan nod, penjadual memilih penyewa yang paling kurang menerima perkhidmatan mengikut perkhidmatan adil berwajaran; penuaan (aging) meningkatkan keutamaan efektif supaya kerja tidak mengalami kebuluran. Preemption hanya dibenarkan apabila dasar, kuota, dan pemulihan menjadikannya selamat. Tempahan, pajakan (leases), dan token pemagaran (fencing tokens) adalah tahan lama, dan metrik diasingkan mengikut penyewa, barisan gilir, dan jenis sumber.
Reka bentuk langkah demi langkah
Langkah 1: Bina lejar sumber dan kuota
Wakilkan CPU, memori, GPU, dan label nod sebagai vektor sumber. Penggunaan jangka panjang menggunakan kuota penyewa; pinjaman lonjakan akan luput. Tempah sumber secara atomik sebelum penghantaran dan kembalikannya setelah selesai, pembatalan, atau pajakan luput. Kuat kuasakan kuota semasa kemasukan dan penjadualan supaya pemanggil tidak dapat memintasnya dengan keutamaan yang tinggi.
Langkah 2: Gunakan barisan gilir hierarki dan pemilihan adil
Lapisi organisasi, penyewa, dan kelas kerja, kemudian pilih dalam kalangan penyewa yang boleh dijalankan mengikut pemberat. Jejak perkhidmatan maya atau penggunaan sumber terkini dan pilih penyewa yang kurang menerima perkhidmatan; tambah penuaan terikat selepas ambang menunggu. Barisan gilir keutamaan global boleh membiarkan penyewa besar memiliki kedudukan hadapan selama-lamanya, manakala penggiliran peringkat penyewa menjadikan sempadan keadilan jelas.
Langkah 3: Hadkan keutamaan, peminjaman, dan preemption
Keutamaan mewakili kesegeraan, bukan kapasiti tanpa had. Peminjaman terhad kepada kapasiti terbiar atau tetingkap yang jelas. Sebelum melakukan preemption, anggarkan sumber yang dilepaskan, kos titik semak, dan belanjawan mangsa; utamakan kerja berkeutamaan rendah yang boleh dipulihkan. Jika pemulihan tidak terbukti selamat, biarkan kerja mendesak menunggu daripada mengambil risiko kesan sampingan pendua.
Langkah 4: Tapis nod dan kawal pemecahan
Tapis seni bina, model GPU, zon, afiniti, dan kapasiti sebelum memberi skor kepada nod. Mencampurkan permintaan besar dan kecil dalam satu barisan gilir mewujudkan pemecahan; tempah kolam terikat untuk bentuk (shape) besar dan tetapkan had menunggu. Rekod punca penolakan secara berasingan: jumlah kapasiti, ketidakpadanan bentuk, dan kuota habis.
Langkah 5: Hantar dengan pajakan dan pemulihan idempoten
Kekalkan tempahan berversi secara persisten. Pekerja menuntut pajakan pendek dengan token pemagaran. Penghantaran pendua disemak oleh (job_id, attempt); hanya token yang lebih baharu boleh mengambil alih pajakan yang telah luput. Lepaskan tempahan selepas komit hasil. Semasa penjadual dimulakan semula, bina semula kerja yang belum selesai daripada log atau pangkalan data dan bukannya meneka daripada memori.
Langkah 6: Kendalikan kegagalan, pembatalan, dan percubaan semula
Tandakan pekerja yang hilang sebagai tidak diketahui (unknown) terlebih dahulu, kemudian tuntut semula selepas tetingkap pajakan dan degupan jantung (heartbeat). Sambung semula kerja yang boleh dipulihkan daripada titik semak; kesan bukan idempoten memerlukan carian status atau pampasan. Percubaan semula menggunakan belanjawan penyewa dan kerja dengan backoff dihadkan. Pemulihan tidak boleh menghantar semula setiap tugas yang tamat masa sekali gus.
Langkah 7: Skalakan kapasiti dan ubah dasar
Terbitkan dasar berversi apabila nod atau pemberat berubah. Kekalkan dasar lama untuk kerja yang telah beratur dan migrasikan kerja baharu secara beransur-ansur; perubahan pemberat tidak boleh membatalkan bahagian yang dijanjikan serta-merta. Jejak sumber terhad seperti GPU, zon, dan cakera tempatan secara berasingan, dengan peristiwa audit untuk peminjaman dan penebusan semula.
Langkah 8: Sahkan keadilan dan kecekapan
Lakukan ujian beban dengan beban kerja sintetik dan sebenar: satu penyewa tepu, beberapa penyewa perlahan, kehilangan nod rawak, pemulihan titik semak, dan perubahan dasar secara langsung (hot policy changes). Ukur p50/p95 menunggu penyewa, bahagian sumber, selang kebuluran maksimum, preemption, pelaksanaan pendua, usia barisan gilir, pemecahan, dan masa pemulihan. Bandingkan FIFO, keutamaan ketat, dan penjadualan adil untuk menunjukkan pertukaran (trade-off).
Contoh jawapan berkualiti tinggi
Saya akan memisahkan kuota, keutamaan, dan kebolehlaksanaan nod. Barisan gilir penyewa dipilih mengikut perkhidmatan terkurang layan berwajaran ditambah penuaan terikat. Peminjaman menggunakan kapasiti terbiar yang luput; preemption memerlukan bukti pemulihan, semakan kuota, dan belanjawan titik semak. Setiap tugasan mengekalkan tempahan, pajakan, dan token pemagaran, manakala hasil adalah idempoten mengikut percubaan. Penjadual membina semula daripada lognya dan percubaan semula menggunakan belanjawan penyewa. Ujian kegagalan mencipta jiran yang bising dan kehilangan pekerja, kemudian membandingkan masa menunggu penyewa, bahagian, kebuluran, kerja pendua, pemecahan, dan masa pemulihan.
Kesilapan biasa
- Satu barisan gilir keutamaan global → penyewa besar menguasai kedudukan hadapan → pilih penyewa sebelum kerja tempatan penyewa.
- Menganggap kuota sebagai keutamaan → kerja mendesak memintas had → pastikan semakan kuota kekal atomik dan bebas.
- Preemption tanpa had → kos titik semak dan kesan pendua meletup → tambah belanjawan dan masa bertenang (cooldowns).
- Barisan gilir dalam memori sahaja → memulakan semula menduplikasi atau kehilangan penghantaran → kekalkan tempahan, pajakan, dan token.
- Purata kluster sahaja → penyewa boleh mengalami kebuluran tanpa disedari → asingkan masa menunggu dan bahagian mengikut penyewa.
- Percubaan semula serta-merta selepas kehilangan pekerja → pelaksanaan lama mungkin masih berjalan → tunggu pemagaran atau gunakan laluan idempoten.
Soalan susulan
Bagaimanakah anda membuktikan tiada kebuluran berlaku?
Tempah bahagian perkhidmatan minimum untuk setiap penyewa yang boleh dijalankan dan hadkan penuaan. Di bawah kapasiti tetap dan kerja yang boleh dijadualkan secara berterusan, sahkan bahawa masa menunggu maksimum kekal dalam had dasar.
Bagaimanakah anda mengelakkan pengebilan pendua selepas preemption?
Bilkan kerja logik atau peringkat yang telah dikomit, bukan setiap percubaan. Kesan luaran menggunakan kunci keidempotanan dan carian status.
Bagaimana jika kuota bercanggah dengan kapasiti terbiar?
Benarkan peminjaman yang boleh luput dan rekod kapasiti yang boleh ditebus semula. Hentikan peminjaman baharu terlebih dahulu, kemudian tunggu penyiapan atau pintas hanya kerja yang boleh dipulihkan.
Adakah penjadual memerlukan ketekalan yang kukuh (strong consistency)?
Tempahan, pajakan, dan pemagaran memerlukan kemas kini bersyarat yang boleh dilinearkan (linearizable); papan pemuka boleh jadi tak segerak. Cache yang lapuk tidak boleh memperuntukkan GPU terakhir.
Bilakah penjadualan adil tidak diperlukan?
Bagi penyewa tunggal, tetingkap kelompok tetap, atau keutamaan ketat di mana kebuluran diterima, barisan gilir keutamaan mudah lebih senang disahkan.
Apakah yang mencetuskan pengunduran (rollback)?
Pelaksanaan pendua, pemulihan yang gagal, pelanggaran had menunggu, atau bahagian penyewa di luar belanjawan akan menghentikan dasar baharu. Pulihkan versi lama dan simpan log tempahan untuk dimainkan semula.