Dinamik Yürütme

Sorun bildirme Kaynağı görüntüleme Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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.

Düşük dinamik yürütme performansına sahip verileri profilleme

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.

Daha iyi dinamik yürütme performansıyla verileri profilleme

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.