Eksekusi Dinamis

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

Eksekusi dinamis adalah fitur di Bazel sejak versi 0.21, dengan eksekusi lokal dan jarak jauh untuk tindakan yang sama dimulai secara paralel, menggunakan output dari cabang pertama yang telah selesai, sehingga membatalkan cabang lainnya. Sistem ini menggabungkan daya eksekusi dan/atau cache bersama yang besar dari sistem build jarak jauh dengan latensi eksekusi lokal yang rendah, sehingga memberikan kemampuan terbaik dari keduanya untuk build bersih dan inkremental.

Halaman ini menjelaskan cara mengaktifkan, menyesuaikan, dan men-debug eksekusi dinamis. Jika Anda telah menyiapkan eksekusi lokal dan jarak jauh serta mencoba menyesuaikan setelan Bazel untuk performa yang lebih baik, halaman ini cocok untuk Anda. Jika Anda belum menyiapkan eksekusi jarak jauh, buka Ringkasan Eksekusi Jarak Jauh Bazel terlebih dahulu.

Mengaktifkan eksekusi dinamis?

Modul eksekusi dinamis adalah bagian dari Bazel, tetapi untuk memanfaatkan eksekusi dinamis, Anda harus dapat mengompilasi secara lokal dan jarak jauh dari penyiapan Bazel yang sama.

Untuk mengaktifkan modul eksekusi dinamis, teruskan flag --internal_spawn_scheduler ke Bazel. Tindakan ini akan menambahkan strategi eksekusi baru bernama dynamic. Anda kini dapat menggunakannya sebagai strategi untuk mnemonik yang ingin dijalankan secara dinamis, seperti --strategy=Javac=dynamic. Lihat bagian berikutnya untuk mengetahui cara memilih mnemonik yang akan digunakan untuk mengaktifkan eksekusi dinamis.

Untuk mnemonik apa pun yang menggunakan strategi dinamis, strategi eksekusi jarak jauh diambil dari tanda --dynamic_remote_strategy, dan strategi lokal dari tanda --dynamic_local_strategy. Meneruskan --dynamic_local_strategy=worker,sandboxed akan menetapkan default cabang eksekusi dinamis lokal untuk dicoba dengan pekerja atau eksekusi sandbox dalam urutan tersebut. Meneruskan --dynamic_local_strategy=Javac=worker akan menimpa default untuk mnemonik Java saja. Versi jarak jauh berfungsi dengan cara yang sama. Kedua flag tersebut dapat ditentukan beberapa kali. Jika tidak dapat dieksekusi secara lokal, tindakan akan dijalankan dari jarak jauh seperti biasa, dan sebaliknya.

Jika sistem jarak jauh Anda memiliki cache, flag --dynamic_local_execution_delay akan menambahkan penundaan dalam milidetik ke eksekusi lokal setelah sistem jarak jauh menunjukkan hit cache. Hal ini bertujuan agar eksekusi lokal tidak dijalankan saat lebih banyak cache ditemukan. Nilai defaultnya adalah 1.000 md, tetapi harus disetel agar sedikit lebih lama daripada yang biasanya ditemukan oleh cache. Waktu sebenarnya bergantung pada sistem jarak jauh dan durasi perjalanan pulang pergi. Biasanya, nilai ini akan sama untuk semua pengguna sistem jarak jauh tertentu, kecuali beberapa dari mereka cukup jauh untuk menambahkan latensi bolak-balik. Anda dapat menggunakan fitur pembuatan profil Bazel untuk melihat waktu yang dibutuhkan hit cache standar.

Eksekusi dinamis dapat digunakan dengan strategi dengan sandbox lokal serta dengan pekerja persisten. Pekerja persisten akan otomatis berjalan dengan sandbox jika digunakan dengan eksekusi dinamis, dan tidak dapat menggunakan pekerja multipleks. Pada sistem Darwin dan Windows, strategi dengan sandbox dapat berjalan lambat; Anda dapat meneruskan --reuse_sandbox_directories untuk mengurangi overhead pembuatan sandbox pada sistem ini.

Eksekusi dinamis juga dapat berjalan dengan strategi standalone, meskipun strategi standalone harus mengambil kunci output saat mulai mengeksekusinya. Strategi ini secara efektif memblokir strategi jarak jauh agar tidak selesai terlebih dahulu. Flag --experimental_local_lockfree_output memungkinkan penyelesaian masalah ini dengan memungkinkan eksekusi lokal menulis langsung ke output, tetapi dibatalkan oleh eksekusi jarak jauh, jika hal tersebut selesai terlebih dahulu.

Jika salah satu cabang eksekusi dinamis selesai terlebih dahulu tetapi gagal, seluruh tindakan akan gagal. Ini adalah pilihan yang disengaja untuk mencegah perbedaan antara eksekusi lokal dan jarak jauh menjadi tidak diperhatikan.

Untuk mengetahui latar belakang selengkapnya tentang cara kerja eksekusi dinamis dan pengunciannya, lihat postingan blog menarik dari Julio Merino

Kapan saya harus menggunakan eksekusi dinamis?

Eksekusi dinamis memerlukan beberapa bentuk sistem eksekusi jarak jauh. Saat ini Anda tidak dapat menggunakan sistem jarak jauh khusus cache, karena cache tidak ditemukan akan dianggap sebagai tindakan yang gagal.

Tidak semua jenis tindakan cocok untuk eksekusi jarak jauh. Tanggal kandidat terbaik adalah yang secara lokal lebih cepat, misalnya melalui penggunaan pekerja persisten, atau yang berjalan cukup cepat sehingga overhead eksekusi jarak jauh mendominasi waktu eksekusi. Karena setiap tindakan yang dieksekusi secara lokal mengunci sejumlah resource CPU dan memori, menjalankan tindakan yang tidak termasuk dalam kategori tersebut hanya akan menunda eksekusi yang melakukannya.

Mulai rilis 5.0.0-pre.20210708.4, pembuatan profil performa berisi data tentang eksekusi pekerja, termasuk waktu yang dihabiskan untuk menyelesaikan permintaan pekerjaan setelah kalah dalam race eksekusi dinamis. Jika Anda melihat thread pekerja eksekusi dinamis menghabiskan waktu untuk memperoleh resource secara signifikan, atau banyak waktu di async-worker-finish, Anda mungkin memiliki beberapa tindakan lokal lambat yang menunda thread pekerja.

Membuat profil data dengan performa eksekusi dinamis yang buruk

Pada profil di atas, yang menggunakan 8 pekerja Java, kita melihat banyak pekerja Java kalah dalam balapan dan menyelesaikan pekerjaan mereka di thread async-worker-finish. Hal ini disebabkan oleh mnemonik non-pekerja yang mengambil resource yang cukup untuk menunda pekerja.

Membuat profil data dengan performa eksekusi dinamis yang lebih baik

Jika hanya Javac yang dijalankan dengan eksekusi dinamis, hanya sekitar setengah pekerja yang memulai yang akan kalah dalam race setelah memulai pekerjaannya.

Flag --experimental_spawn_scheduler yang direkomendasikan sebelumnya tidak digunakan lagi. Tindakan ini akan mengaktifkan eksekusi dinamis dan menetapkan dynamic sebagai strategi default untuk semua mnemonik, yang akan sering memunculkan jenis masalah ini.

Pemecahan masalah

Masalah dengan eksekusi dinamis mungkin tidak kentara dan sulit untuk di-debug, karena masalah tersebut dapat terjadi hanya pada beberapa kombinasi eksekusi lokal dan jarak jauh tertentu. --debug_spawn_scheduler menambahkan output tambahan dari sistem eksekusi dinamis yang dapat membantu men-debug masalah ini. Anda juga dapat menyesuaikan flag --dynamic_local_execution_delay dan jumlah pekerjaan jarak jauh vs. lokal untuk mempermudah reproduksi masalah.

Jika Anda mengalami masalah dengan eksekusi dinamis menggunakan strategi standalone, coba jalankan tanpa --experimental_local_lockfree_output, atau jalankan tindakan lokal Anda dengan sandbox. Tindakan ini mungkin sedikit memperlambat build Anda (lihat di atas jika Anda menggunakan Mac atau Windows), tetapi menghapus beberapa kemungkinan penyebab kegagalan.