Halaman ini menjelaskan pekerja multipleks, cara menulis aturan yang kompatibel dengan multipleks, dan solusi untuk batasan tertentu.
Pekerja multipleks memungkinkan Bazel menangani beberapa permintaan dengan satu proses pekerja. Untuk pekerja multi-thread, Bazel dapat menggunakan lebih sedikit resource untuk mencapai performa yang sama, atau lebih baik. Misalnya, alih-alih memiliki satu proses pekerja per pekerja, Bazel dapat memiliki empat pekerja multipleks yang berkomunikasi dengan proses pekerja yang sama, yang kemudian dapat menangani permintaan secara paralel. Untuk bahasa seperti Java dan Scala, hal ini menghemat waktu pemanasan JVM dan waktu kompilasi JIT, dan secara umum memungkinkan penggunaan satu cache bersama di antara semua pekerja dari jenis yang sama.
Ringkasan
Ada dua lapisan antara server Bazel dan proses pekerja. Untuk mnemoni
tertentu yang dapat menjalankan proses secara paralel, Bazel mendapatkan WorkerProxy
dari
kumpulan pekerja. WorkerProxy
meneruskan permintaan ke proses pekerja
secara berurutan bersama dengan request_id
, proses pekerja memproses permintaan
dan mengirim respons ke WorkerMultiplexer
. Saat menerima respons, WorkerMultiplexer
akan mengurai request_id
, lalu meneruskan respons
kembali ke WorkerProxy
yang benar. Sama seperti pekerja non-multipleks, semua
komunikasi dilakukan melalui input/output standar, tetapi alat ini tidak dapat menggunakan
stderr
untuk output yang terlihat pengguna (lihat di bawah).
Setiap pekerja memiliki kunci. Bazel menggunakan kode hash kunci (terdiri dari variabel
lingkungan, root eksekusi, dan mnemoni) untuk menentukan
WorkerMultiplexer
yang akan digunakan. WorkerProxy
berkomunikasi dengan
WorkerMultiplexer
yang sama jika memiliki kode hash yang sama. Oleh karena itu, dengan asumsi
variabel lingkungan dan root eksekusi sama dalam satu pemanggilan
Bazel, setiap mnemoni unik hanya dapat memiliki satu WorkerMultiplexer
dan satu
proses pekerja. Jumlah total pekerja, termasuk pekerja reguler dan
WorkerProxy
, masih dibatasi oleh --worker_max_instances
.
Menulis aturan yang kompatibel dengan multipleks
Proses pekerja aturan harus multi-thread untuk memanfaatkan pekerja multipleks. Protobuf memungkinkan kumpulan aturan mengurai satu permintaan meskipun
mungkin ada beberapa permintaan yang menumpuk di aliran. Setiap kali
proses pekerja mengurai permintaan dari streaming, proses tersebut harus menangani permintaan dalam
thread baru. Karena thread yang berbeda dapat menyelesaikan dan menulis ke aliran data secara
bersamaan, proses pekerja harus memastikan respons ditulis
secara acak (pesan tidak tumpang-tindih). Respons harus berisi
request_id
permintaan yang ditanganinya.
Menangani output multipleks
Pekerja multipleks harus lebih berhati-hati dalam menangani output mereka daripada pekerja singleplex. Semua yang dikirim ke stderr
akan masuk ke satu file log yang dibagikan di antara semua WorkerProxy
dari jenis yang sama, yang diselingi secara acak di antara permintaan serentak. Meskipun mengalihkan stdout
ke stderr
adalah ide yang bagus, jangan kumpulkan output tersebut ke kolom output
WorkResponse
, karena hal itu dapat menampilkan potongan output yang rusak kepada pengguna.
Jika alat Anda hanya mengirim output yang berorientasi pada pengguna ke stdout
atau stderr
, Anda
harus mengubah perilaku tersebut sebelum dapat mengaktifkan pekerja multipleks.
Mengaktifkan pekerja multipleks
Pekerja multipleks tidak diaktifkan secara default. Kumpulan aturan dapat mengaktifkan pekerja multiplex
menggunakan tag supports-multiplex-workers
di
execution_requirements
tindakan (sama seperti tag supports-workers
yang mengaktifkan pekerja reguler). Seperti halnya saat menggunakan pekerja reguler, strategi pekerja
harus ditentukan, baik di tingkat kumpulan aturan (misalnya,
--strategy=[some_mnemonic]=worker
) atau umumnya di tingkat strategi (misalnya, --dynamic_local_strategy=worker,standalone
.) Tidak diperlukan tanda tambahan, dan supports-multiplex-workers
lebih diutamakan daripada
supports-workers
, jika keduanya ditetapkan. Anda dapat menonaktifkan pekerja multipleks
secara global dengan meneruskan --noworker_multiplex
.
Set aturan dianjurkan untuk menggunakan pekerja multipleks jika memungkinkan, untuk mengurangi tekanan memori dan meningkatkan performa. Namun, pekerja multipleks saat ini tidak kompatibel dengan eksekusi dinamis kecuali jika menerapkan sandbox multipleks. Mencoba menjalankan pekerja multipleks tanpa sandbox dengan eksekusi dinamis akan menggunakan pekerja singleplex dengan sandbox secara diam-diam.
Sandboxing multipleks
Pekerja multipleks dapat di-sandbox dengan menambahkan dukungan eksplisit untuknya dalam implementasi pekerja. Meskipun sandbox pekerja singleplex dapat dilakukan dengan menjalankan setiap proses pekerja di sandbox-nya sendiri, pekerja multipleks berbagi direktori kerja proses di antara beberapa permintaan paralel. Untuk mengizinkan sandboxing pekerja multipleks, pekerja harus mendukung pembacaan dari dan penulisan ke subdirektori yang ditentukan dalam setiap permintaan, bukan langsung di direktori kerjanya.
Untuk mendukung sandboxing multipleks, pekerja harus menggunakan kolom sandbox_dir
dari WorkRequest
dan menggunakannya sebagai awalan untuk semua operasi baca dan tulis file.
Meskipun kolom arguments
dan inputs
tetap tidak berubah dari permintaan tanpa sandbox, input yang sebenarnya bersifat relatif terhadap sandbox_dir
. Pekerja harus
menerjemahkan jalur file yang ditemukan di arguments
dan inputs
untuk membaca dari
jalur yang diubah ini, dan juga harus menulis semua output yang relatif terhadap sandbox_dir
.
Hal ini mencakup jalur seperti '.', serta jalur yang ditemukan dalam file yang ditentukan
dalam argumen (seperti argumen "argfile").
Setelah pekerja mendukung sandboxing multipleks, kumpulan aturan dapat mendeklarasikan
dukungan ini dengan menambahkan supports-multiplex-sandboxing
ke
execution_requirements
tindakan. Bazel kemudian akan menggunakan sandbox multipleks
jika flag --experimental_worker_multiplex_sandboxing
diteruskan, atau jika pekerja digunakan dengan eksekusi dinamis.
File pekerja dari pekerja multipleks dengan sandbox masih relatif terhadap
direktori kerja proses pekerja. Dengan demikian, jika file
digunakan untuk menjalankan pekerja dan sebagai input, file tersebut harus ditentukan sebagai
input dalam argumen flagfile serta dalam tools
, executable
, atau
runfiles
.