Dinamik Yürütme

Dinamik yürütme, Bazel'de 0.21 sürümünden beri bulunan bir özelliktir. Bu özellik sayesinde aynı işlemin yerel ve uzak yürütülmesi paralel olarak başlatılır. Tamamlanan ilk dalın çıktısı kullanılarak 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 gecikme süresiyle 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ı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. Henüz uzaktan yürütmeyi 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ütmeyi kullanabilmek 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 olarak önce çalışanlarla, ardından da bu sırayla korumalı alan yürütmesiyle denenir. --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 --local_execution_delay işareti, uzak sistem önbellek isabeti olduğunu belirttikten 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, bazı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. Normal ö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 değerini 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 bitmesi durumunda uzak yürütme tarafından iptal edilerek bu sorunu çözmenin bir yolunu sağlar.

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 uzaktan yürütme arasındaki farkların gözden kaçmasını önlemek için kasıtlı olarak yapılmış bir tercihtir.

Dinamik yürütme ve kilitleme işlevi hakkında daha fazla bilgi için Julio Merino'nun mükemmel blog yayınlarına göz atın.

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. Bunun nedeni, önbellek isabeti olmaması durumunda işlemin başarısız sayılmasıdır.

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. Dinamik yürütme işçi iş parçacıklarının kaynak edinmek için önemli ölçüde zaman harcadığını veya async-worker-finish içinde çok fazla zaman geçirdiğini görüyorsanız işçi iş parçacıklarını geciktiren bazı yavaş yerel işlemleriniz olabilir.

Kötü dinamik yürütme performansına sahip profilleme verileri

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ışanları geciktirecek kadar kaynak kullanan bir çalışan olmayan anımsatıcıdan kaynaklanıyordu.

Daha iyi dinamik yürütme performansına sahip profilleme verileri

Dinamik yürütme ile yalnızca Javac çalıştırıldığında, başlatılan çalışanların yalnızca yaklaşık yarısı işe başladıktan sonra yarışı kaybeder.

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.

Sorun giderme

Dinamik yürütmeyle ilgili sorunlar, yalnızca yerel ve uzak yürütmenin belirli kombinasyonlarında ortaya çıkabildiği için ince olabilir ve hata ayıklaması zor olabilir. --debug_spawn_scheduler, bu sorunların hata ayıklamasına yardımcı olabilecek dinamik yürütme sisteminden ek çıktı ekler. Sorunların yeniden üretilmesini kolaylaştırmak için --local_execution_delay işaretini ve uzaktan çalışılan işlere kıyasla yerel işlerin sayısını da 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.