Dinamik yürütme, Bazel'deki bir özelliktir. Bu özellik sayesinde aynı işlemin yerel ve uzaktan yürütülmesi paralel olarak başlatılır. Tamamlanan ilk daldan elde edilen çıktı 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 gecikme süresiyle birleştirerek hem temiz hem de artımlı derlemeler için her iki dünyanın en iyisini sunar.
Bu sayfada, dinamik yürütmenin nasıl etkinleştirileceği, ayarlanacağı ve hata ayıklamasının nasıl yapılacağı açıklanmaktadır. Hem yerel hem de uzaktan yürütmeyi ayarladıysanız ve daha iyi performans için Bazel ayarlarını düzenlemeye çalışıyorsanız bu sayfa size yöneliktir. Uzaktan yürütmeyi henüz ayarlamadıysanız önce Bazel Uzaktan Yürütmeye Genel Bakış sayfasına gidin.
Dinamik yürütme etkinleştiriliyor mu?
Dinamik yürütme modülü Bazel'in bir parçasıdır ancak dinamik yürütmeden yararlanmak için aynı Bazel kurulumundan hem yerel hem de uzaktan derleme yapabilmeniz gerekir.
Dinamik yürütme modülünü etkinleştirmek için Bazel'e --internal_spawn_scheduler
işaretini iletin. Bu işlem, dynamic
adlı yeni bir uygulama stratejisi ekler. Artık bunu, dinamik olarak yayınlamak istediğiniz anımsatıcılar için stratejiniz olarak kullanabilirsiniz. Örneğin:
--strategy=Javac=dynamic
. Hangi anımsatıcılar için dinamik yürütmeyi etkinleştireceğinizi seçme hakkında bilgi edinmek için sonraki bölüme bakın.
Dinamik stratejinin kullanıldığı tüm anımsatıcılar için uzak 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
iletildiğinde, dinamik yürütmenin yerel dalı için varsayılan değer, çalışanlarla veya korumalı alan yürütmesiyle bu sırayla denenmesi olarak ayarlanır. --dynamic_local_strategy=Javac=worker
iletildiğinde yalnızca Javac anımsatıcısı için varsayılan değer geçersiz kılınır. 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ülemiyorsa 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 önbellek isabeti gösterdikten sonra yerel yürütmeye milisaniye cinsinden bir gecikme ekler. Bu, daha fazla önbellek isabeti olması muhtemel olduğunda yerel yürütmenin çalıştırılmasını önler. Varsayılan değer 1.000 ms'dir ancak genellikle önbellek isabetlerinin süresinden 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, belirli bir uzak sistemin tüm kullanıcıları için değer aynıdır. Ancak bazı kullanıcılar gidiş dönüş gecikmesi ekleyecek kadar uzakta olabilir. Tipik önbellek isabetlerinin ne kadar sürdüğünü görmek için Bazel profil oluşturma ö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ütmeyle kullanıldığında otomatik olarak sanal 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ütmeye başladığında çıkış kilidini alması gerektiğinden, uzak stratejinin önce tamamlanmasını etkili bir şekilde engeller. --experimental_local_lockfree_output
işareti, yerel yürütmenin doğrudan çıkışa yazmasına izin vererek ancak önce tamamlanması durumunda uzak yürütme tarafından durdurularak bu sorunu çözmenin bir yolunu sunar.
Dinamik yürütmenin dallarından biri önce tamamlanır ancak başarısız olursa işlemin tamamı başarısız olur. Bu, yerel ve uzak yürütme arasındaki farkların gözden kaçmasını önlemek için kasıtlı olarak yapılmış bir seçimdir.
Dinamik yürütme ve kilitleme işlevi hakkında daha fazla bilgi edinmek 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 uzaktan yürütme sistemi gerekir. Şu anda yalnızca önbelleğe alma özelliğine sahip bir uzak sistem kullanılamamaktadır. Çünkü önbellek isabeti olmaması, başarısız bir işlem olarak kabul edilir.
Tüm işlem türleri uzaktan yürütme için uygun değildir. En iyi adaylar, yerel olarak daha hızlı olanlardır. Örneğin, kalıcı çalışanlar kullanılarak veya uzaktan yürütmenin ek yükünün yürütme süresine hakim olacak kadar hızlı çalışanlar. Yerel olarak yürütülen her işlem, belirli miktarda CPU ve bellek kaynağını kilitlediğinden bu kategorilere girmeyen işlemlerin yürütülmesi, bu kategorilere giren işlemlerin yürütülmesini yalnızca geciktirir.
5.0.0-pre.20210708.4 sürümünden itibaren,
performans profili oluşturma, dinamik yürütme yarışını kaybettikten sonra bir iş isteğini tamamlamak için harcanan süre de dahil olmak üzere çalışan yürütmeyle ilgili verileri içerir. Kaynak edinmek için önemli ölçüde zaman harcayan dinamik yürütme işçi iş parçacıkları veya async-worker-finish
içinde çok fazla zaman harcayan işçi iş parçacıkları görürseniz işçi iş parçacıklarını geciktiren bazı yavaş yerel işlemleriniz olabilir.
8 Javac çalışanı kullanan yukarıdaki profilde, birçok Javac çalışanının yarışları kaybettiğini ve işlerini async-worker-finish
iş parçacıklarında tamamladığını görüyoruz. Bu durum, çalışan olmayan bir anımsatıcının çalışanları geciktirecek kadar kaynak almasından kaynaklanıyordu.
Dinamik yürütme ile yalnızca Javac çalıştırıldığında, çalışmaya başlayan işçilerin yaklaşık yarısı işlerini tamamlayamaz.
Daha önce önerilen --experimental_spawn_scheduler
işaretinin desteği sonlandırıldı.
Bu seçenek, dinamik yürütmeyi etkinleştirir ve tüm anımsatıcılar için varsayılan strateji olarak dynamic
'yı ayarlar. Bu da genellikle bu tür sorunlara yol açar.
Performans
Dinamik yürütme yaklaşımı, yerel ve uzaktan yeterli kaynak olduğunu ve genel performansı artırmak için biraz daha fazla kaynak harcamanın faydalı olacağını varsayar. Ancak aşırı kaynak kullanımı, Bazel'in kendisini veya üzerinde çalıştığı makineyi yavaşlatabilir ya da uzak bir sisteme beklenmedik bir yük bindirebilir. Dinamik yürütmenin davranışını değiştirmek için çeşitli seçenekler vardır:
--dynamic_local_execution_delay
, uzak dal başladıktan sonra yerel dalın başlangıcını belirli bir milisaniye kadar geciktirir ancak yalnızca mevcut derleme sırasında uzak önbellek isabeti varsa. Bu sayede, uzak önbelleğe almadan yararlanan derlemeler, çoğu çıkışı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 kullanma 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, bu özelliği devre dışı bırakır.
0'dan büyük 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 ayarladığınızda, --local_cpu_resources
'ya göre kullanılabilir CPU sayısı kadar işlem planlanabilir. Daha düşük değerler ayarlandığında, çalıştırılacak daha fazla işlem olsa bile planlanan işlem sayısı buna uygun olarak daha az olur. Bu, sezgisel olarak ters gelebilir ancak iyi bir uzaktan sistemle, birçok işlem çalıştırılırken yerel yürütme pek yardımcı olmaz ve yerel CPU, uzaktan işlemleri yönetmek için daha iyi kullanılır.
--experimental_dynamic_slow_remote_time
, uzak dal en az bu süre boyunca çalıştırıldığında yerel dalları başlatmaya öncelik verir. Yarışı kazanma şansı en yüksek olduğundan, normalde en son planlanan işlem öncelik kazanır. Ancak uzak sistem bazen kilitlenirse veya çok uzun sürerse bu işlem, derlemenin ilerlemesini sağlayabilir. Bu özellik, düzeltilmesi gereken uzak sistemle ilgili sorunları gizleyebileceğinden varsayılan olarak etkinleştirilmez. Bu seçeneği etkinleştirirseniz uzak sisteminizin performansını izlediğinizden emin olun.
--experimental_dynamic_ignore_local_signals
, yerel bir spawn belirli bir sinyal nedeniyle çıktığında uzak şubenin devralmasına izin vermek için kullanılabilir. Bu, özellikle çalışan kaynak sınırlarıyla birlikte kullanıldığında faydalıdır (bkz. --experimental_worker_memory_limit_mb
, --experimental_worker_sandbox_hardening
ve --experimental_sandbox_memory_limit_mb
). Çalışan işlemleri çok fazla kaynak kullandığında sonlandırılabilir.
JSON izleme profili, performans ve kaynak kullanımı arasındaki dengeyi iyileştirmenin yollarını belirlemeye yardımcı olabilecek bir dizi performansla ilgili grafik içerir.
Sorun giderme
Dinamik yürütmeyle ilgili sorunlar, yalnızca yerel ve uzaktan yürütmenin belirli kombinasyonlarında ortaya çıkabildiği için ince ayrıntılı olabilir ve hata ayıklaması zor olabilir.
--debug_spawn_scheduler
, bu sorunların hata ayıklanmasına yardımcı olabilecek dinamik yürütme sisteminden ek çıktı ekler. Sorunların yeniden üretilmesini kolaylaştırmak için --dynamic_local_execution_delay
işaretini ve uzaktan çalışılan işlerin sayısını yerel işlerin sayısına göre de ayarlayabilirsiniz.
standalone
stratejisini kullanarak dinamik yürütmeyle ilgili sorunlar yaşıyorsanız --experimental_local_lockfree_output
olmadan çalıştırmayı veya yerel işlemlerinizi korumalı alanda çalıştırmayı deneyin. Bu işlem, derlemenizi biraz yavaşlatabilir (Mac veya Windows kullanıyorsanız yukarıya bakın) ancak olası bazı hata nedenlerini ortadan kaldırır.