Dinamik yürütme, Bazel'deki bir özelliktir. Bu özellikte, aynı işlemin yerel ve uzaktan yürütmesi paralel olarak başlatılır. İlk dalın tamamlanmasıyla elde edilen çıkış kullanılır ve diğer dal iptal edilir. Uzak 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 bir uzaktan yürütme kurulumunu öğrenmek için Bazel Uzaktan Yürütme Önce Genel Bakış'ı inceleyin.
Dinamik yürütme etkinleştirilsin mi?
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 şunları yapabilirsiniz:
Dinamik olarak çalıştırmak istediğiniz anımsatıcılar için stratejiniz olarak bunu kullanın.
--strategy=Javac=dynamic
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
geçildiğinde, şunun için varsayılan değer geçersiz kılınır:
yalnızca Javac anımsatıcısı. 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.
Uzak sisteminizde önbellek varsa --dynamic_local_execution_delay
işareti
uzak sistem tarafından çalıştırıldıktan sonra yerel yürütmeye milisaniye cinsinden
olduğunu göstermiştir. Bu, daha fazla önbellek isabeti olduğunda yerel yürütmenin çalıştırılmasını önler
daha iyidir. Varsayılan değer 1000 ms'dir ancak bu değer, ö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 otomatik olarak
dinamik yürütmeyle birlikte kullanıldığında korumalı alan ile çalışmalı ve Multiplex kullanamaz
sağlar. 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
parametresini iletebilirsiniz.
Dinamik yürütme, standalone
stratejisiyle de çalıştırılabilir ancak
standalone
stratejisi, çalışmaya başladığında çıkış kilidini almalıdır.
etkili bir şekilde önce uzaktaki stratejinin
tamamlanmasını engeller. İlgili içeriği oluşturmak için kullanılan
--experimental_local_lockfree_output
işareti,
yerel yürütmenin doğrudan çıkışa yazmasına izin verir ancak
proje başlatma belgesini kullanacaksınız.
Dinamik yürütme dallarından biri ilk olarak biter ancak başarısız olursa 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 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. Önbellekte bulunmama nedeniyle yalnızca önbelleklerden oluşan uzak bir sistem şu anda kullanılamaz bir başarısız işlem olarak değerlendirilir.
Tüm işlem türleri uzaktan yürütme için uygun değildir. En iyi yerel olarak daha hızlı işlemler yapan adaylardır (örneğin, kalıcı çalışanların veya hızlı çalışan yürütme süresi boyunca uzaktan yürütmenin ek yükünün önüne geçecek kadar önemlidir. Başlangıç yerel olarak yürütülen her işlem bir miktar CPU ve bellek kaynağını kilitler. Bu kategorilere girmeyen işlemlerin yapılması, yalnızca uygulamanın yürütülmesini geciktirir. teşvik edebilirsiniz.
Yayın tarihi itibarıyla
5.0.0-pre.20210708.4,
performans profili oluşturma özelliği veri içerir
hakkında bilgi edinin. Buna, iş talebini bitirdikten sonra harcanan süre de dahildir.
kaybetmemek zorlanıyor. Dinamik yürütme çalışan iş parçacıkları görüyorsanız
kaynak edinmek için çok fazla zaman harcamanıza
async-worker-finish
, çalışanın gecikmesine neden olan bazı yerel işlemleriniz yavaş olabilir
ileti dizileri.
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. Bunun nedeni, işçi dışı bir hafızada çalışmak için yeterli kaynak
gecikmeli olarak da
işçileri geciktirir.
Yalnızca Javac dinamik yürütmeyle çalıştırıldığında çalıştırılanların sadece yarısı işçiler işe başladıktan sonra yarışı kaybederler.
Daha önce önerilen --experimental_spawn_scheduler
işareti kullanımdan kaldırıldı.
Dinamik yürütmeyi etkinleştirir ve dynamic
tüm reklamverenler için varsayılan strateji olarak ayarlanır.
yol açabiliyor. Bu da genellikle bu tür sorunlara
Performans
Dinamik yürütme yaklaşımı, yerel ve uzak kaynaklarda genel performansı iyileştirmek için ek kaynaklar harcamaya değer olacak kadar yeterli kaynak olduğunu varsayar. Ancak aşırı kaynak kullanımı Bazel'in kendisini yavaşlatabilir veya veya uzaktaki bir sisteme beklenmedik bir baskı uygulayarak. Her biri 100'den az gösterim alan dinamik yürütme davranışını değiştirmek için çeşitli seçenekler vardır:
--dynamic_local_execution_delay
, yerel şubenin başlangıcını bir sayı kadar geciktirir
milisaniye cinsinden ayarlanır, ancak yalnızca
uzak bir önbellek isabeti olabilir. Bu sayede, dönüşüm hunisinin
uzaktan önbelleğe almanın
yerel kaynakları boşa harcamasını önler.
çıktıları önbellekte bulabilirsiniz. Önbelleğin kalitesine bağlı olarak, bu değeri düşürmek, daha fazla yerel kaynak kullanılması pahasına derleme hızlarını artırabilir.
--experimental_dynamic_local_load_factor
, deneysel bir gelişmiş kaynak yönetimi seçeneğidir. 0 ile 1 arasında bir değer alır. 0 değeri bu özelliği devre dışı bırakır.
0'dan büyük bir değere ayarlandığında, Bazel
bekleyen birçok işlem olduğunda yerel olarak planlanmış işlemler
planlayabilirsiniz. Bu değeri 1 olarak ayarlamak, kullanılabilir CPU sayısı kadar işlem (--local_cpu_resources
'e göre) planlanmasına olanak tanır. Daha düşük değerler, daha fazla işlem çalıştırılabilir olduğundan planlanan işlem sayısını buna göre daha az ayarlandırır. Bu, mantık dışı gelebilir ancak iyi bir uzak sistemde, birçok işlem yürütüldüğünde yerel yürütme pek yardımcı olmaz ve yerel CPU'nun uzak işlemleri yönetmesi daha iyidir.
--experimental_dynamic_slow_remote_time
, yerel şube kurmaya öncelik verir
uzak dal en az bu kadar süredir çalışıyorsa. Normalde
en son planlanan işleme öncelik verilir çünkü
yarışı kazanmasına rağmen uzaktaki sistem bazen kilitlenir ya da çok uzun sürerse
Bu sayede ilerleyecek bir yapı oluşturabilirsiniz. Bu seçenek, uzak sistemde düzeltilmesi gereken sorunları gizleyebileceği için varsayılan olarak etkin değildir. Şunlardan emin olun:
uzaktan sisteminizin performansını izleyebilirsiniz.
--experimental_dynamic_ignore_local_signals
, uzaktan kumandanın şunları yapmasını sağlamak için kullanılabilir:
belirli bir sinyal nedeniyle bir yerel yumurtanın ortaya çıktığında dalı devralması. Bu özellik, özellikle çok fazla kaynak kullandığında işçi işlemlerinin sonlandırılabileceği işçi kaynağı sınırlarıyla (--experimental_worker_memory_limit_mb
, --experimental_worker_sandbox_hardening
ve --experimental_sandbox_memory_limit_mb
) birlikte kullanışlıdır.
JSON izleme profili şunu içerir: geliştirme yöntemlerini belirlemenize yardımcı olabilecek performansla ilgili grafik sayısı ödün vermek zorunda kalmazsınız.
Sorun giderme
Dinamik yürütmeyle ilgili sorunlar fark edilebilir düzeydedir ve hata ayıklaması zordur.
bazı yerel yürütme ve uzaktan yürütme kombinasyonlarında uygulanır.
--debug_spawn_scheduler
, dinamik yürütme sisteminden bu sorunların giderilmesine yardımcı olabilecek ek çıkışlar ekler. Ayrıca, sorunların yeniden oluşturulmasını kolaylaştırmak için --dynamic_local_execution_delay
işaretini ve uzak ile 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ı 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 olası bazı nedenlerini ortadan kaldırır.