Dinamik Yürütme

Sorun bildir Kaynağı göster

Dinamik yürütme Bazel'de, aynı işlemin yerel ve uzaktan yürütülme işleminin paralel olarak başlatıldığı, biten ilk daldan gelen çıkışın kullanılarak diğer dalın iptal edildiği bir özelliktir. Bu çözüm, 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 temiz ve artımlı derlemeler için her iki platformdan da en iyi şekilde yararlanmanızı sağlar.

Bu sayfada, dinamik yürütmenin nasıl etkinleştirileceği, ayarlanacağı ve hata ayıklamanın nasıl yapılacağı açıklanmaktadır. Hem yerel hem de uzaktan yürütme kurulumunu yaptıysanız ve daha iyi performans için Bazel ayarlarını yapmaya çalışıyorsanız bu sayfa tam size göre. Uzaktan yürütmeyi önceden ayarlamadıysanız önce Bazel Uzaktan Yürütmeye Genel Bakış'a gidin.

Dinamik yürütme etkinleştirilsin mi?

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 olarak hem de uzaktan derleyebiliyor olmanız gerekir.

Dinamik yürütme modülünü etkinleştirmek için --internal_spawn_scheduler işaretini Bazel'a iletin. Bu işlem, dynamic adlı yeni bir yürütme stratejisi ekler. Artık bunu, dinamik olarak yayınlamak istediğiniz anımsatıcılar için bir strateji olarak kullanabilirsiniz (ör. --strategy=Javac=dynamic). Dinamik yürütmenin etkinleştirileceği anımsatıcıların nasıl seçileceğini öğrenmek için bir sonraki bölüme bakın.

Dinamik stratejiyi kullanan herhangi bir anımsatıcı için uzaktan yürütme stratejileri --dynamic_remote_strategy işaretinden ve yerel stratejiler --dynamic_local_strategy işaretinden alınır. --dynamic_local_strategy=worker,sandboxed değerini geçirmek, dinamik yürütmenin yerel dalı için söz konusu sıradaki çalışanlarla veya korumalı alana alınmış yürütmeyle denemek üzere varsayılanı ayarlar. --dynamic_local_strategy=Javac=worker geçirilmesi, yalnızca Javac anımsatıcısı için varsayılanı geçersiz kılar. Uzak sürüm de aynı şekilde çalışır. Her iki işaret de birden fazla kez belirtilebilir. Bir eylem yerel olarak yürütülemezse normal şekilde uzaktan yürütülür veya uzaktan yürütülürse bu işlemin tam tersi yapılır.

Uzak sisteminizde bir önbellek varsa --dynamic_local_execution_delay işareti, uzak sistem bir önbellek isabeti gösterdikten sonra yerel yürütmeye milisaniye cinsinden bir gecikme ekler. Bu, daha fazla önbellek isabeti olasılığı olduğunda yerel yürütmenin çalıştırılmasını önler. Varsayılan değer 1000 ms'dir, ancak önbellek isabetlerinin genellikle gerekenden biraz daha uzun olacak şekilde ayarlanması gerekir. Gerçek süre hem uzak sisteme hem de gidişin ne kadar sürdüğüne bağlıdır. Bazıları gidiş dönüş gecikmesi ekleyecek kadar uzakta olmadıkça belirli bir uzak sistemin tüm kullanıcıları için genellikle değer aynı olur. Tipik önbellek isabetlerinin ne kadar sürdüğüne bakmak için Bazel profil oluşturma özelliklerini kullanabilirsiniz.

Dinamik yürütme, yerel korumalı alana alınmış stratejinin yanı sıra kalıcı çalışanlarla da kullanılabilir. Kalıcı çalışanlar, dinamik yürütmeyle birlikte kullanıldığında otomatik olarak korumalı alan ile çalışır ve Multiplex çalışanları kullanamaz. Darwin ve Windows sistemlerinde korumalı alana alınmış strateji yavaş olabilir. Bu sistemlerde korumalı alan oluşturma yükünü azaltmak için --reuse_sandbox_directories değerini geçirebilirsiniz.

Dinamik yürütme, standalone stratejisiyle de çalıştırılabilir. Ancak standalone stratejisinin çalıştırılmaya başladığında çıkış kilidini alması gerektiğinden, uzaktan stratejinin önce bitmesini etkili bir şekilde engeller. --experimental_local_lockfree_output işareti, yerel yürütmenin doğrudan çıkışa yazmasına ve önce bitmesi durumunda uzaktan yürütme tarafından iptal edilmesine izin vererek bu sorunu aşacak bir yol sunar.

Dinamik yürütme kollarından biri önce biterse ancak başarısız olursa tüm işlem başarısız olur. Bu, yerel ve uzaktan yürütme arasındaki farkların fark edilmesini önlemek için bilinçli bir seçimdir.

Dinamik yürütmenin ve kilitlemenin nasıl çalıştığıyla ilgili daha fazla bilgi için JulioMerino'nun mükemmel blog yayınlarına göz atın

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

Dinamik yürütme, bir tür uzaktan yürütme sistemi gerektirir. Önbellekte bulunmama durumu, başarısız bir işlem olarak kabul edileceğinden şu anda yalnızca önbellekten oluşan bir uzak sistem kullanmak mümkün değildir.

Tüm işlem türleri uzaktan yürütme için uygun değildir. En iyi adaylar, yerel olarak daha hızlı çalışanlardır. Örneğin, kalıcı çalışanların kullanılmasıyla çalışırlar ya da uzaktan yürütmenin ek yükünün yürütme süresine hakim olacağı kadar hızlı çalışırlar. Yerel olarak yürütülen her işlem, bir miktar CPU ve bellek kaynağını kilitlediğinden, bu kategorilere girmeyen işlemlerin çalıştırılması yalnızca olanlar için yürütmeyi geciktirir.

5.0.0-pre.20210708.4 sürümü itibarıyla 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 çalışanı iş parçacıklarının kaynak toplamak için çok fazla zaman harcadığını veya async-worker-finish içinde çok fazla zaman harcadığını görürseniz çalışan iş parçacıklarını geciktiren bazı yavaş yerel işlemleriniz olabilir.

Kötü dinamik yürütme performansı ile verilerin profilini oluşturma

8 Javac çalışanı kullanan yukarıdaki profilde, birçok Javac çalışanının yarışları kaybedip async-worker-finish iş parçacıklarındaki işlerini bitirdiğini görüyoruz. Bunun nedeni, çalışanları ertelemek için yeterli kaynağın kullanılması olan, çalışan olmayan bir hatırlatıcıydı.

Daha iyi dinamik yürütme performansıyla verilerin profilini oluşturma

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

Daha önce önerilen --experimental_spawn_scheduler işareti kullanımdan kaldırılmıştır. Dinamik yürütmeyi etkinleştirir ve tüm anımsatıcılar için varsayılan strateji olarak dynamic değerini ayarlar. Bu durum, genellikle bu tür sorunlara yol açar.

Performans

Dinamik yürütme yaklaşımı, yerel ve uzaktan kullanılabilen yeterli kaynak bulunduğunu varsayar. Bu durum, genel performansı iyileştirmek için ekstra kaynak harcamaya değebilir. Ancak aşırı kaynak kullanımı, Bazel'ın kendisini veya çalıştığı makineyi yavaşlatabilir ya da uzak bir sistem üzerinde beklenmedik bir baskı yaratabilir. Dinamik yürütme davranışını değiştirmek için birkaç seçenek vardır:

--dynamic_local_execution_delay, uzak dal başladıktan sonra yerel dalın başlatılmasını birkaç milisaniye geciktirir. Ancak bu durum yalnızca geçerli derleme sırasında uzak önbellek isabeti meydana gelmişse geçerlidir. Bu, çoğu çıkışın önbellekte bulunabileceği durumlarda, uzaktan önbelleğe alma işleminden yararlanan derlemelerin, yerel kaynakları boşa harcamamasını sağlar. Önbelleğin kalitesine bağlı olarak, bu oranın azaltılması 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. Bu özelliği devre dışı bırakmak için 0 ile 1, 0 arasında bir değer olmalıdır. 0'dan büyük bir değere ayarlandığında Bazel, planlanmayı bekleyen birçok işlem olduğunda, yerel olarak planlanan işlemlerin sayısını ayarlar. Bu değeri 1 olarak ayarlamak, kullanılabilir CPU olduğu kadar çok sayıda işlemin planlanmasına olanak tanır (--local_cpu_resources uyarınca). Daha düşük değerler, programlanan işlem sayısını, yürütülebilecek işlem sayısı yükseldikçe daha az olacak şekilde ayarlar. Bu yöntem kulağa pek mantıklı gelmese de iyi bir uzak sistemde, birçok işlem çalıştırılırken yerel yürütme pek yardımcı olmaz ve yerel CPU, uzak işlemlerin yönetilmesine daha uygun şekilde harcanır.

--experimental_dynamic_slow_remote_time, uzak dal en az bu kadar süredir çalıştığında yerel dalları başlatmaya öncelik verir. Normalde, yarışı kazanma şansı en yüksek olduğu için en yakın zamanda planlanan işlem öncelikli olur. Ancak uzak sistem bazen takılıyor veya ekstra uzun sürüyorsa buna uygun bir yapı elde edilebilir. Bu özellik, uzak sistemde düzeltilmesi gereken sorunları gizleyebileceği için varsayılan olarak etkin değildir. Bu seçeneği etkinleştirirseniz uzak sisteminizin performansını izlediğinizden emin olun.

--experimental_dynamic_ignore_local_signals, belirli bir sinyal nedeniyle yerel bir üretilen çıkış olduğunda Remote şubenin devralmasını sağlamak için kullanılabilir. Bu özellik çoğunlukla, çok fazla kaynak kullandığında çalışan süreçlerinin sonlandırılabileceği çalışan kaynak sınırları (bkz. --experimental_worker_memory_limit_mb, --experimental_worker_sandbox_hardening ve --experimental_sandbox_memory_limit_mb) ile birlikte kullanışlıdır.

JSON izleme profili, performans ve kaynak kullanımını iyileştirmenin yollarını belirlemenize yardımcı olabilecek, performansla ilgili bir dizi grafik içerir.

Sorun giderme

Dinamik yürütmeyle ilgili sorunlar, yalnızca belirli yerel ve uzaktan yürütme kombinasyonları altında ortaya çıkabildiği için kolayca fark edilebilir ve hata ayıklaması zor olabilir. --debug_spawn_scheduler, dinamik yürütme sisteminden bu sorunların giderilmesine yardımcı olabilecek ekstra çıkışlar ekler. Sorunların yeniden oluşturulmasını kolaylaştırmak için --dynamic_local_execution_delay işaretini ve uzak/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ı deneyin veya yerel işlemlerinizi korumalı alana alınmış olarak çalıştırın. Bu, derlemenizi biraz yavaşlatabilir (Mac veya Windows kullanıyorsanız yukarıya bakın) ancak hataların bazı olası nedenlerini ortadan kaldırır.