Dinamik Yürütme

Sorun bildir Kaynağı göster

Dinamik yürütme Bazel'de yer alan ve aynı işlemin yerel ve uzaktan yürütülmesinin paralel olarak başlatıldığı, biten ilk dalın çıkışı kullanılarak diğer dalın iptal edildiği bir özelliktir. Bir uzak derleme sisteminin yürütme gücünü ve/veya büyük paylaşılan önbelleğini, yerel yürütmenin düşük gecikmeli özelliğiyle birleştirerek temiz ve artımlı derlemeler için iki dünyanın en iyi özelliklerini sunar.

Bu sayfada, dinamik yürütmenin nasıl etkinleştirileceği, ayarlanacağı ve hata ayıklanacağı 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 ayarlamadıysanız önce Bazel Uzaktan Yürütme'ye Genel Bakış'a gidin.

Dinamik yürütme etkinleştirilsin mi?

Dinamik yürütme modülü Bazel'ın bir parçasıdır ancak dinamik yürütmeden yararlanmak için aynı Bazel kurulumundan hem yerel olarak hem de uzaktan derleme yapabiliyor 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 bu stratejiyi, dinamik olarak yayınlamak istediğiniz anımsatıcılar (ör. --strategy=Javac=dynamic) için bir strateji olarak kullanabilirsiniz. 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 stratejinin kullanıldığı anımsatıcılar için uzaktan yürütme stratejileri --dynamic_remote_strategy işaretinden ve yerel stratejiler de --dynamic_local_strategy işaretinden alınır. --dynamic_local_strategy=worker,sandboxed geçişi, dinamik yürütmenin yerel dalı için varsayılan değeri, ilgili sırayla çalışanlar veya korumalı alana alınmış yürütmeyle denenecek şekilde ayarlar. --dynamic_local_strategy=Javac=worker öğesinin iletilmesi yalnızca Javac anımsatıcısı için varsayılan değeri 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ür.

Uzak sisteminizde önbellek varsa --dynamic_local_execution_delay işareti, uzak sistem bir önbellek isabeti belirttikten sonra yerel yürütmeye milisaniye cinsinden bir gecikme ekler. Bu, daha fazla önbellek isabetinin söz konusu olabileceği durumlarda yerel yürütmenin çalıştırılmasını önler. Varsayılan değer 1.000 ms'dir ancak önbellek isabetlerinin genellikle gerekenden biraz daha uzun olacak şekilde ayarlanması gerekir. Gerçek süre hem uzak sisteme hem de gidiş dönüşün ne kadar sürdüğüne bağlıdır. Bazı kullanıcılar gidiş dönüş gecikmesi ekleyebilecek kadar uzakta olmadığı sürece genellikle değer, belirli bir uzak sistemin tüm kullanıcıları için 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ış stratejiyle ve kalıcı çalışanlarla birlikte 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 ek yükünü azaltmak için --reuse_sandbox_directories parametresini geçirebilirsiniz.

Dinamik yürütme, standalone stratejisiyle de çalıştırılabilir. Ancak standalone stratejisinin yürütmeye başladığında çıkış kilidini alması gerektiğinden, uzaktan stratejinin önce bitirmesini 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 soruna çözüm getirir.

Dinamik yürütmenin dallarından biri daha ö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öz ardı 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. Şu anda yalnızca önbelleğe alınmış uzak bir sistem kullanmak mümkün değildir, çünkü önbellekte eksiklikler başarısız bir işlem olarak kabul edilir.

Her tür işlem, uzaktan yürütme için uygun değildir. En iyi adaylar, yapısı gereği yerel olarak daha hızlı olanlardır; örneğin, kalıcı çalışanların kullanılması sayesinde veya uzaktan yürütmenin ek yükünün yürütme süresine baskın olacağı kadar hızlı çalışan kişilerdir. Yerel olarak yürütülen her işlem bir miktar CPU ve bellek kaynağını kilitlediğinden, bu kategorilere girmeyen çalıştırılan işlemler yalnızca bu tür işlemlerin yürütülmesini geciktirir.

5.0.0-pre.20210708.4 sürümü itibarıyla performans profili oluşturma, dinamik yürütme yarışını kaybettikten sonra iş isteğini tamamlamak için harcanan süre de dahil, çalışan yürütmeyle ilgili verileri içermektedir. Dinamik yürütme çalışanı iş parçacıklarının kaynak edinmek 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.

Dinamik yürütme performansı kötü olan verilerin profilini oluşturma

8 Javac çalışanının kullanıldığı 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 miktarda kaynağın kullanılması olan, işçi 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ışı kaybediyor.

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

Performans

Dinamik yürütme yaklaşımı yerel ve uzaktan kullanılabilir yeterli kaynak olduğunu varsayar. Bu nedenle genel performansı iyileştirmek için fazladan kaynak harcamaya değer. Ancak aşırı kaynak kullanımı, Bazel'ın kendisini veya üzerinde çalıştığı makineyi yavaşlatabilir ya da uzak bir sistem üzerinde beklenmedik bir baskı yaratabilir. Dinamik yürütmenin 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 bir önbellek isabeti oluşması durumunda geçerlidir. Böylece, çoğu çıkışın önbellekte bulunabileceği durumlarda, uzaktan önbelleğe alma özelliğinden yararlanan derlemeler, yerel kaynakları boşa harcamaz. Ö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şlem sayısını ayarlar. Değeri 1 olarak ayarlamak, kullanılabilir CPU'lar kadar çok sayıda işlemin planlanmasına izin verir (--local_cpu_resources uyarınca). Daha düşük değerler, programlanan işlem sayısını, çalıştırılabilecek işlem sayısı arttıkça daha az olacak şekilde ayarlar. Bu kulağa alışılmadık gelebilir ancak iyi bir uzak sistemle, çok sayıda işlem çalıştırıldığında yerel yürütme pek faydalı olmaz ve yerel CPU, uzaktaki işlemleri yönetmek için daha iyi 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, en son planlanan işlem önceliklidir çünkü yarışı kazanma şansı en yüksektir ancak uzak sistem bazen takılıyor veya daha uzun sürüyorsa ilerleyebileceğiniz bir yapı oluşturabilirsiniz. Bu özellik, uzak sistemde düzeltilmesi gereken sorunları gizleyebileceğinden varsayılan olarak etkin değildir. Bu seçeneği etkinleştirirseniz uzak sistem performansınızı izlediğinizden emin olun.

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

JSON iz profili, performans ve kaynak kullanımı karşılığında daha fazla değer elde etmenin yollarını belirlemenize yardımcı olabilecek, performansla ilgili çeşitli grafikler içerir.

Sorun giderme

Dinamik yürütmede bazı sorunlar, yalnızca belirli yerel ve uzaktan yürütme kombinasyonları altında ortaya çıkarılabileceği için hafif 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ş 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ın. Bu, derlemenizi biraz yavaşlatabilir (Mac veya Windows kullanıyorsanız yukarıya bakın) ancak hatalara ilişkin bazı olası nedenleri ortadan kaldırır.