Pekerja Multiplex (Fitur Eksperimental)

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.
Laporkan masalah Lihat sumber

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 berbicara dengan proses pekerja yang sama, yang kemudian dapat menangani permintaan secara paralel. Untuk bahasa seperti Java dan Scala, ini menghemat waktu pemanasan JVM dan waktu kompilasi JIT, dan secara umum memungkinkan penggunaan satu cache bersama antara semua pekerja dengan jenis yang sama.

Ringkasan

Ada dua lapisan antara server Bazel dan proses pekerja. Untuk mnemonik 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 tersebut, dan mengirimkan respons ke WorkerMultiplexer. Saat menerima respons, WorkerMultiplexer akan mengurai request_id dan meneruskan respons kembali ke WorkerProxy yang benar. Sama seperti pekerja non- multipleks, semua komunikasi dilakukan melalui masuk/keluar standar, tetapi alat ini tidak dapat hanya menggunakan stderr untuk output yang terlihat oleh pengguna (lihat di bawah).

Setiap pekerja memiliki kunci. Bazel menggunakan kode hash kunci (terdiri dari variabel lingkungan, root eksekusi, dan mnemonik) 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 panggilan Bazel, setiap mnemonik unik hanya dapat memiliki satu proses WorkerMultiplexer dan satu 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 agar dapat memanfaatkan pekerja multipleks. Protobuf memungkinkan kumpulan aturan untuk mengurai permintaan tunggal meskipun mungkin ada beberapa permintaan yang menumpuk di aliran. Setiap kali proses pekerja mengurai permintaan dari aliran, proses tersebut harus menangani permintaan di thread baru. Karena thread yang berbeda dapat menyelesaikan dan menulis ke aliran data pada waktu yang bersamaan, proses pekerja perlu memastikan respons ditulis secara atomik (pesan tidak tumpang-tindih). Respons harus berisi request_id permintaan yang sedang ditangani.

Menangani output multipleks

Pekerja multipleks harus lebih berhati-hati dalam menangani output-nya daripada pekerja singleplex. Apa pun yang dikirim ke stderr akan masuk ke satu file log yang dibagikan di antara semua WorkerProxy dari jenis yang sama, disisipkan secara acak di antara permintaan serentak. Meskipun mengalihkan stdout ke stderr adalah ide yang bagus, jangan kumpulkan output tersebut ke dalam kolom output dari WorkResponse, karena hal tersebut dapat menunjukkan bagian output yang rusak kepada pengguna. Jika alat Anda hanya mengirimkan output berorientasi pengguna ke stdout atau stderr, Anda harus mengubah perilaku tersebut sebelum dapat mengaktifkan pekerja multipleks.

Memungkinkan pekerja multipleks

Pekerja multipleks tidak diaktifkan secara default. Kumpulan aturan dapat mengaktifkan pekerja multipleks menggunakan tag supports-multiplex-workers dalam execution_requirements tindakan (seperti tag supports-workers yang memungkinkan pekerja biasa). Seperti halnya saat menggunakan pekerja reguler, strategi pekerja harus ditentukan, baik di tingkat kumpulan aturan (misalnya, --strategy=[some_mnemonic]=worker) atau secara umum di tingkat strategi (misalnya, --dynamic_local_strategy=worker,standalone.) Tidak ada tanda tambahan yang diperlukan, dan supports-multiplex-workers lebih diutamakan daripada supports-workers, jika keduanya ditetapkan. Anda dapat menonaktifkan pekerja multipleks secara global dengan meneruskan --noexperimental_worker_multiplex.

Kumpulan 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 mereka menerapkan sandbox multipleks. Mencoba menjalankan pekerja multipleks yang tidak ditempatkan sandbox dengan eksekusi dinamis akan menggunakan pekerja singleplex dengan sandbox sebagai gantinya.

Sandbox 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 secara langsung dalam direktori kerjanya.

Untuk mendukung sandbox multipleks, pekerja harus menggunakan kolom sandbox_dir dari WorkRequest dan menggunakannya sebagai awalan untuk semua pembacaan dan penulisan file. Meskipun kolom arguments dan inputs tetap tidak berubah dari permintaan tanpa sandbox, input 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 ke sandbox_dir. Ini termasuk lokasi seperti '.', serta lokasi yang ditemukan dalam file yang ditentukan dalam argumen (seperti argumen "argfile").

Setelah pekerja mendukung sandbox multipleks, kumpulan aturan dapat mendeklarasikan dukungan ini dengan menambahkan supports-multiplex-sandboxing ke execution_requirements dari suatu tindakan. Kemudian, Bazel akan menggunakan sandbox multipleks jika flag --experimental_worker_multiplex_sandboxing diteruskan, atau jika pekerja digunakan dengan eksekusi dinamis.

File pekerja pekerja multipleks dengan sandbox masih relatif terhadap direktori kerja proses pekerja. Jadi, jika file digunakan untuk menjalankan pekerja dan sebagai input, file tersebut harus ditentukan sebagai input dalam argumen flagfile serta dalam tools, executable, atau runfiles.