Dinamik Yürütme

Sorun bildirme Kaynağı görüntüleme Nightly · 8.0 . 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Dinamik yürütme, Bazel'deki bir özelliktir. Bu özellikte, aynı işlemin yerel ve uzaktan yürütmesi paralel olarak başlatılır. İlk dalın tamamlanmasıyla elde edilen çıkış kullanılır ve diğer dal iptal edilir. Uzak derleme sisteminin yürütme gücünü ve/veya büyük paylaşılan önbelleğini yerel yürütmenin düşük gecikmesiyle birleştirerek hem temiz hem de artımlı derlemeler için her iki dünyanın da en iyisini sunar.

Bu sayfada, dinamik yürütmenin nasıl etkinleştirileceği, ayarlanacağı ve hata ayıklanacak açıklanmaktadır. Hem yerel hem de uzaktan yürütme ayarladıysanız ve daha iyi performans için Bazel ayarlarını düzenlemeye çalışıyorsanız bu sayfa tam size göre. Henüz uzaktan yürütme ayarlamadıysanız önce Bazel Uzaktan Yürütme'ye Genel Bakış başlıklı makaleyi inceleyin.

Dinamik yürütmeyi etkinleştirme

Dinamik yürütme modülü Bazel'in bir parçasıdır ancak dinamik yürütmeyi kullanmak için aynı Bazel kurulumundan hem yerel hem de uzaktan derleme yapabilmeniz gerekir.

Dinamik yürütme modülünü etkinleştirmek için --internal_spawn_scheduler işaretini Bazel'e iletin. Bu işlem, dynamic adlı yeni bir uygulama stratejisi ekler. Artık dinamik olarak çalıştırmak istediğiniz anımsatıcılar (ör. --strategy=Javac=dynamic) için stratejiniz olarak bunu kullanabilirsiniz. Hangi anımsatıcılar için dinamik yürütmeyi etkinleştireceğinizi seçmek üzere sonraki bölüme bakın.

Dinamik stratejiyi kullanan tüm anımsatıcılar için uzaktan yürütme stratejileri --dynamic_remote_strategy işaretinden, yerel stratejiler ise --dynamic_local_strategy işaretinden alınır. --dynamic_local_strategy=worker,sandboxed iletilmesi, dinamik yürütmenin yerel şubesinin varsayılan olarak işçilerle veya korumalı alanla yürütmeyle denemesini bu sırayla belirler. --dynamic_local_strategy=Javac=worker ile iletilen değerler yalnızca Javac mnemoni için varsayılan ayarı geçersiz kılar. Uzaktan sürüm de aynı şekilde çalışır. Her iki işaret de birden çok kez belirtilebilir. Bir işlem yerel olarak yürütülemezse normal şekilde uzaktan yürütülür ve bunun tersi de geçerlidir.

Uzak sisteminizde önbellek varsa --dynamic_local_execution_delay işareti, uzak sistem bir önbellek isabeti belirttikten sonra yerel yürütmeye milisaniye cinsinden bir gecikme ekler. Bu sayede, daha fazla önbelleğe isabet olasılığı olduğunda yerel yürütme işlemi yapılmaz. Varsayılan değer 1000 ms'dir ancak bu değer, önbelleğe isabetlerin genellikle aldığından biraz daha uzun olacak şekilde ayarlanmalıdır. Gerçek süre hem uzak sisteme hem de gidiş dönüş süresine bağlıdır. Genellikle, bazı kullanıcılar gidiş dönüş gecikmesi ekleyecek kadar uzakta olmadığı sürece değer, belirli bir uzak sistemin tüm kullanıcıları için aynı olur. Tipik önbellek isabetlerinin ne kadar sürdüğünü görmek için Bazel profilleme özelliklerini kullanabilirsiniz.

Dinamik yürütme, yerel korumalı alan stratejisinin yanı sıra kalıcı çalışanlarla da kullanılabilir. Kalıcı çalışanlar, dinamik yürütme ile kullanıldığında otomatik olarak korumalı alanla çalışır ve çoklu çalışanları kullanamaz. Darwin ve Windows sistemlerinde korumalı alan stratejisi yavaş olabilir. Bu sistemlerde korumalı alan oluşturmanın ek yükünü azaltmak için --reuse_sandbox_directories parametresini iletebilirsiniz.

Dinamik yürütme, standalone stratejisiyle de çalışabilir. Ancak standalone stratejisi, yürütülmeye başladığında çıkış kilidini alması gerektiğinden uzak stratejinin önce bitmesini etkili bir şekilde engeller. --experimental_local_lockfree_output işareti, yerel yürütmenin doğrudan çıkışa yazmasına izin vererek ancak uzak yürütme önce biterse uzak yürütme tarafından iptal edilerek bu sorunun etrafından dolaşmanın bir yolunu sağlar.

Dinamik yürütmenin dallarından biri önce biterse ancak başarısız olursa işlemin tamamı başarısız olur. Bu, yerel ve uzak yürütme arasındaki farklılıkların gözden kaçmasını önlemek için bilinçli olarak yapılan bir seçimdir.

Dinamik yürütmenin ve kilitlenmesinin işleyiş şekli hakkında daha fazla bilgi için Julio Merino'nun mükemmel blog yayınlarını inceleyin.

Dinamik yürütmeyi ne zaman kullanmalıyım?

Dinamik yürütme için bir tür uzak yürütme sistemi gerekir. Önbellek hatası başarısız bir işlem olarak değerlendirileceğinden, şu anda yalnızca önbelleğe sahip uzak bir sistem kullanılamamaktadır.

Tüm işlem türleri uzaktan yürütme için uygun değildir. En iyi adaylar, yerel olarak doğal olarak daha hızlı olanlardır (ör. kalıcı çalışanlar kullanılarak) veya uzaktan yürütmenin ek yükünün yürütme süresine hakim olduğu kadar hızlı çalışanlardır. Yerel olarak yürütülen her işlem belirli miktarda CPU ve bellek kaynağını kilitlediğinden, bu kategorilere girmeyen işlemlerin çalıştırılması, bu kategorilere giren işlemlerin yürütülmesini yalnızca geciktirir.

5.0.0-pre.20210708.4 sürümü itibarıyla performans profili, dinamik yürütme yarışını kaybettikten sonra bir iş isteğini tamamlamak için harcanan süre de dahil olmak üzere işleyici yürütmeyle ilgili verileri içerir. Dinamik yürütme işleyici iş parçacıklarının kaynak edinmek için önemli miktarda zaman harcadığını veya async-worker-finish içinde çok fazla zaman geçirdiğini görüyorsanız işleyici iş parçacıklarını geciktiren bazı yavaş yerel işlemler olabilir.

Dinamik yürütme performansı düşük olan verileri profilleme

8 Javac işleyicinin kullanıldığı yukarıdaki profilde, yarışları kaybeden ve async-worker-finish iş parçacıklarında çalışmalarını tamamlayan birçok Javac işleyici görüyoruz. Bu durum, çalışan olmayan bir hatırlatıcının çalışanları geciktirmek için yeterli kaynağı almasından kaynaklanıyordu.

Daha iyi dinamik yürütme performansıyla verileri profilleme

Yalnızca Javac dinamik yürütmeyle çalıştırıldığında, başlatılan iş parçacıklarının yalnızca yarısı işe başladıktan sonra yarışı kaybeder.

Daha önce önerilen --experimental_spawn_scheduler işaretinin desteği sonlandırıldı. Dinamik yürütmeyi etkinleştirir ve tüm anımsatıcılar için varsayılan strateji olarak dynamic'ı ayarlar. Bu da genellikle bu tür sorunlara yol açar.

Performans

Dinamik yürütme yaklaşımı, yerel ve uzak kaynaklarda genel performansı iyileştirmek için ek kaynaklar harcamaya değer olacak kadar yeterli kaynak olduğunu varsayar. Ancak aşırı kaynak kullanımı Bazel'i veya çalıştığı makineyi yavaşlatabilir ya da uzak bir sisteme beklenmedik bir baskı uygulayabilir. Dinamik yürütmenin davranışını değiştirmek için birkaç seçenek vardır:

--dynamic_local_execution_delay, yerel dalın başlangıcını uzak dal başladıktan sonra milisaniye cinsinden geciktirir. Ancak bu durum yalnızca mevcut derleme sırasında uzak önbelleğe isabet olması durumunda geçerlidir. Bu sayede, uzak önbellekten yararlanan derlemeler, çoğu çıktının önbellekte bulunabileceği durumlarda yerel kaynakları boşa harcamaz. Önbelleğin kalitesine bağlı olarak, bu değeri düşürmek, daha fazla yerel kaynak kullanılması pahasına derleme hızlarını artırabilir.

--experimental_dynamic_local_load_factor, deneysel bir gelişmiş kaynak yönetimi seçeneğidir. 0 ile 1 arasında bir değer alır. 0 değeri bu özelliği devre dışı bırakır. 0'dan yüksek bir değere ayarlandığında Bazel, planlanmayı bekleyen çok sayıda işlem olduğunda yerel olarak planlanan işlemlerin sayısını ayarlar. Bu değeri 1 olarak ayarlamak, kullanılabilir CPU sayısı kadar işlem (--local_cpu_resources'e göre) planlanmasına olanak tanır. Daha düşük değerler, daha fazla işlem çalıştırılabilir olduğundan planlanan işlem sayısını buna göre daha az ayarlandırır. Bu, mantık dışı gelebilir ancak iyi bir uzak sistemde, birçok işlem yürütüldüğünde yerel yürütme pek yardımcı olmaz ve yerel CPU'nun uzak işlemleri yönetmesi daha iyidir.

--experimental_dynamic_slow_remote_time, uzak dal en az bu süre boyunca çalışırken yerel dalları başlatmaya öncelik verir. Yarışta kazanma şansı en yüksek olduğu için genellikle en son planlanan işlem öncelik alır. Ancak uzak sistem bazen takılırsa veya çok uzun sürerse bu, derlemenin devam etmesini sağlayabilir. Bu seçenek, uzak sistemde düzeltilmesi gereken sorunları gizleyebileceği için varsayılan olarak etkin değildir. Bu seçeneği etkinleştirirseniz uzak sistem performansınızı izlemeyi unutmayın.

--experimental_dynamic_ignore_local_signals, yerel bir spawn belirli bir sinyal nedeniyle çıktığında uzak dalın devralmasına izin vermek için kullanılabilir. Bu özellik, özellikle çok fazla kaynak kullandığında işçi işlemlerinin sonlandırılabileceği işçi kaynağı sınırlarıyla (--experimental_worker_memory_limit_mb, --experimental_worker_sandbox_hardening ve --experimental_sandbox_memory_limit_mb) birlikte kullanışlıdır.

JSON izleme profili, performans ve kaynak kullanımı arasındaki dengeyi iyileştirmenin yollarını belirlemenize yardımcı olabilecek performansla ilgili çeşitli grafikler içerir.

Sorun giderme

Dinamik yürütmeyle ilgili sorunlar yalnızca yerel ve uzak yürütmenin belirli kombinasyonlarında ortaya çıkabileceğinden, bu sorunlar fark edilmeyebilir ve hata ayıklama işlemi zor olabilir. --debug_spawn_scheduler, dinamik yürütme sisteminden bu sorunların giderilmesine yardımcı olabilecek ek çıkışlar ekler. Sorunların yeniden oluşturulmasını kolaylaştırmak için --dynamic_local_execution_delay işaretini ve uzak ile yerel işlerin sayısını da ayarlayabilirsiniz.

standalone stratejisini kullanarak dinamik yürütmeyle ilgili sorun yaşıyorsanız --experimental_local_lockfree_output olmadan çalıştırmayı deneyin veya yerel işlemlerinizi korumalı alanda çalıştırın. Bu işlem derlemenizi biraz yavaşlatabilir (Mac veya Windows kullanıyorsanız yukarıdaki bilgilere bakın) ancak hataların bazı olası nedenlerini ortadan kaldırır.