Dinamik Yürütme

Sorun bildirin Kaynağı göster

Dinamik yürütme, Bazel'de aynı eylemin yerel ve uzaktan yürütülmesinin paralel olarak başlatıldığı, tamamlanan ilk daldaki çıktıyı kullanarak diğer dalı iptal eden bir özelliktir. Yerel yürütmenin düşük gecikmesiyle uzak derleme sisteminin yürütme gücünü ve/veya büyük paylaşılan önbelleğini bir araya getirerek hem temiz hem de artımlı derlemeler için iki olanaktan da en iyi şekilde yararlanmanızı sağlar.

Bu sayfada, dinamik yürütmenin nasıl etkinleştirileceği, ayarlanacağı ve hata ayıklama 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ı düzenlemeye çalışıyorsanız bu sayfa tam size göre. Uzaktan yürütme kurulumunu henüz yapmadı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 derleme yapabiliyor olmanız 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 yürütme stratejisi ekler. Artık bunu --strategy=Javac=dynamic gibi dinamik olarak çalıştırmak istediğiniz anımsatıcılar için stratejiniz 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ığı tüm anımsatıcılar için uzaktan yürütme stratejileri --dynamic_remote_strategy işaretinden, yerel stratejiler de --dynamic_local_strategy işaretinden alınır. --dynamic_local_strategy=worker,sandboxed değerini aktarmak, dinamik yürütmenin yerel şubesi için varsayılan değeri çalışanlarla veya korumalı alana alınmış yürütmeyle deneyecek şekilde ayarlar. --dynamic_local_strategy=Javac=worker değerini geçirmek 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 çok kez belirtilebilir. Yerel olarak yürütülemeyen işlemler normal şekilde uzaktan yürütülür. Bunun tersi de geçerlidir.

Uzak sisteminizde önbellek varsa uzak sistem bir önbellek isabeti gösterdikten sonra --dynamic_local_execution_delay işareti yerel yürütmeye milisaniye cinsinden bir gecikme ekler. Bu sayede, daha fazla önbellek isabeti olasılığı yüksek olduğunda yerel yürütmenin çalıştırılması önlenir. Varsayılan değer 1.000 ms'dir ancak önbellek isabetlerinin genellikle aldığı süreden biraz daha uzun olacak şekilde ayarlanmalıdır. Gerçek süre hem uzaktaki sisteme hem de gidiş dönüşün ne kadar sürdüğüne bağlıdır. Değer, bazıları gidiş dönüş gecikmesi ekleyecek kadar uzakta değilse genellikle 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 profili oluşturma özelliklerini kullanabilirsiniz.

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

Dinamik yürütme, standalone stratejisiyle de çalışabilir. Bununla birlikte, standalone stratejisinin çalışmaya başladığında çıkış kilidini alması gerektiğinden, uzak stratejinin önce bitirmesini etkili bir şekilde engeller. --experimental_local_lockfree_output işareti, yerel yürütmenin doğrudan çıkışa yazmasına izin verir ancak daha önce bittiği takdirde uzaktan yürütme işlemi tarafından iptal edilir. Böylece bu soruna karşı bir çözüm sunar.

Dinamik yürütme dallarından biri ilk olarak biter 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 fark edilmemesini önlemek için kasıtlı olarak yapılan bir seçimdir.

Dinamik yürütme ve kilitlemenin işleyiş şekli hakkında daha fazla bilgi için JulioMerino'nun mükemmel blog yayınları'na bakı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 işlemi başarısız bir işlem olarak kabul edileceğinden şu anda yalnızca önbellek üzerinden çalışan uzak bir sistem kullanılamaz.

Tüm işlem türleri, uzaktan yürütme için uygun değildir. En iyi adaylar, yerel olarak yapısı gereği daha hızlı olan, örneğin kalıcı çalışanların kullandığı veya yürütme süresine uzaktan yürütmenin ek yükünün hakim olduğu kadar hızlı çalışan adaylardır. Yerel olarak gerçekleştirilen her işlem bir miktar CPU ve bellek kaynağını kilitlediğinden bu kategorilere girmeyen işlemlerin çalıştırılması, yalnızca bunu yapan kullanıcıların yürütülmesini 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 zaman dahil, çalışan yürütmeyle ilgili verileri içerir. Dinamik yürütme çalışan iş parçacıklarının kaynak edinmek için önemli ölçüde veya async-worker-finish içinde çok fazla zaman harcadığını görüyorsanız çalışan iş parçacıklarını geciktiren yavaş yerel işlemleriniz olabilir.

Dinamik yürütme performansı zayıf olan verilerin profil oluşturma

8 Javac çalışanının kullanıldığı yukarıdaki profilde, birçok Javac çalışanının yarışları kaybettiğini ve async-worker-finish iş parçacıkları üzerindeki işlerini bitirdiğini görüyoruz. Bunun nedeni, işçi olmayan bir uyarının işçileri geciktirmek için yeterli kaynak alması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ışı kaybediyorlar.

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

Performans

Dinamik yürütme yaklaşımında, genel performansı iyileştirmek için ek kaynak harcamaya değecek kadar yerel ve uzaktan kullanılabilir kaynak olduğu varsayılır. Ancak aşırı kaynak kullanımı, Bazel'ın kendisini veya çalıştığı makineyi yavaşlatabilir ya da uzaktaki bir sistem üzerinde beklenmedik baskı oluşturabilir. Dinamik yürütme davranışını değiştirmek için çeşitli seçenekler vardır:

--dynamic_local_execution_delay, yalnızca geçerli derleme sırasında uzak önbellek isabeti olması durumunda, uzak dal başladıktan sonra yerel dalın başlamasını birkaç milisaniye geciktirir. Bu, çoğu çıkışın önbellekte bulunabileceği durumlarda uzaktan önbelleğe alma işleminden yararlanan derlemelerin yerel kaynakları boşa harcamasını önler. Önbelleğin kalitesine bağlı olarak bu miktarın azaltılması, daha fazla yerel kaynak kullanılmasına pahasına derleme hızlarını iyileştirebilir.

--experimental_dynamic_local_load_factor, deneysel bir gelişmiş kaynak yönetimi seçeneğidir. Bu özellik devre dışı bırakıldığında 0 ile 1, 0 arasında bir değer alır. 0'dan büyük bir değere ayarlandığında Bazel, planlanmayı bekleyen birçok işlem olduğunda yerel olarak planlanmış işlemlerin sayısını ayarlar. Değer 1 olarak ayarlanırsa kullanılabilir CPU'lar olduğu kadar (--local_cpu_resources başına) kadar işlem planlanabilir. Düşük değerler, çalıştırılmak üzere daha yüksek sayıda işlem olacağı için planlanan işlem sayısını da bu doğrultuda daha az olacak şekilde ayarlar. Bu kulağa kulağa mantıksız gelebilir ancak iyi bir uzak sistemde yerel yürütme, pek çok işlem yürütülürken pek faydalı olmaz ve yerel CPU, uzaktan işlemleri yönetmek için daha iyi kullanılır.

--experimental_dynamic_slow_remote_time, uzak dal en az bu kadar süre boyunca çalıştığında yerel şubelerin başlatılmasına öncelik verir. Normalde, yarışı kazanma şansı en yüksek olduğu için en son planlanan eyleme öncelik verilir ancak uzaktaki sistem bazen takılır ya da çok uzun sürerse bu, ilerlemek için bir yapı oluşturabilir. Bu özellik, uzak sistemde çözülmesi gereken sorunları gizleyebileceğinden varsayılan olarak etkin değildir. Bu seçeneği etkinleştirirseniz uzak sistem performansınızı izlemeyi unutmayın.

Bir yerel üretim belirli bir sinyal nedeniyle çıktığında uzak şubenin kontrolü ele geçirmesini sağlamak için --experimental_dynamic_ignore_local_signals kullanılabilir. Bu yöntem çoğunlukla, çok fazla kaynak kullandığında çalışan süreçlerinin sonlandırılmasına yol açabilecek çalışan kaynak sınırları (bkz. --experimental_worker_memory_limit_mb, --experimental_worker_sandbox_hardening ve --experimental_sandbox_memory_limit_mb) olduğunda kullanışlıdır.

JSON iz profili, performans ve kaynak kullanımını azaltmanın 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ında ortaya çıkabileceğinden, belirgin ve hata ayıklaması zor olabilir. --debug_spawn_scheduler, dinamik yürütme sisteminden bu sorunların hatalarını ayıklamaya yardımcı olabilecek ekstra çıktı ekler. Sorunların yeniden oluşturulmasını kolaylaştırmak için --dynamic_local_execution_delay işaretini ve uzaktan veya yerel 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ı alana almayı deneyin. Bu, derlemenizi biraz yavaşlatabilir (Mac veya Windows kullanıyorsanız yukarıya bakın) ancak hataya yol açabilecek bazı nedenleri ortadan kaldırır.