Dinamik yürütme, 0.21 sürümünden beri Bazel'de bulunan bir özelliktir. Bu özellikte, aynı işlemin yerel ve uzak yürütmesi paralel olarak başlatılır. Biten ilk dalın çıkışı kullanılır ve diğer dal iptal edilir. Uzaktan 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ütmeye 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.
Uzaktan sisteminizde önbellek varsa --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şleminin yapılması önlenir. Varsayılan değer 1000 ms'dir ancak ö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ıştırılır ve çoklu çalışanları kullanamaz. Darwin ve Windows sistemlerinde korumalı alan stratejisi yavaş olabilir. Bu sistemlerde korumalı alan oluşturmanın ek maliyetini 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 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 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 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ü itibarıyla performans profilleme, 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 veriler içerir. Dinamik yürütme işleyici iş parçaları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çalarını geciktiren bazı yavaş yerel işlemler olabilir.
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.
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.
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 hata ayıklama işlemine yardımcı olabilecek ek çıkışlar ekler. Ayrıca, sorunların yeniden oluşturulmasını kolaylaştırmak için --local_execution_delay
işaretini ve uzaktan çalıştırılan ve yerel olarak çalıştırılan 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.