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, 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.

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.

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.