Dinamik Yürütme

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Dinamik yürütme Bazel'de bulunan ve yerel ve uzaktan İlk daldaki çıktı kullanılarak aynı eylem paralel olarak başlatılır. diğer şube iptal edilir. Uygulama gücünü birleştirir düşük gecikmeli yerel derleme ile uzak derleme sisteminin büyük paylaşılan önbelleği Böylece hem temiz hem de artımlı derlemeler için iki tarafın da en iyisini sunar. kullanabilirsiniz.

Bu sayfada, dinamik yürütmenin nasıl etkinleştirileceği, ayarlanacağı ve hata ayıklama yapılacağı açıklanmaktadır. Şu durumda: hem yerel hem de uzaktan yürütme ayarlanmış olmalı ve Bazel'ı nasıl kullanacağınızı öğreneceksiniz. 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 çalıştırmadan hem yerel olarak hem de uzaktan derleyebilmeniz gerekir. emin olmanız gerekir.

Dinamik yürütme modülünü etkinleştirmek için --internal_spawn_scheduler komutunu iletin Bazel'a bildirin. Bu işlem, dynamic adlı yeni bir yürütme 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ın nasıl seçileceğini öğrenmek için sonraki bölüme bakın. dinamik yürütmeyi etkinleştirin.

Dinamik stratejiyi kullanan her anımsatıcı için uzaktan yürütme stratejileri, --dynamic_remote_strategy işaretinden ve yerel stratejilerden --dynamic_local_strategy işareti. Pas --dynamic_local_strategy=worker,sandboxed, yerel için varsayılanı ayarlar veya korumalı alana alınmış yürütmeyle deneyebileceğiniz dinamik yürütme sipariş. --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ı. Uzak sürüm de aynı şekilde çalışır. Her iki işaret de birden fazla kez belirtilmelidir. Bir işlem yerel olarak yürütülemiyorsa normal şekilde uzaktan yürütülür veya 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 bunun için biraz daha ayarlanması gerekir daha uzun sürdüğünü görebilirsiniz. Gerçek süre hem uzaktan kumandaya bağlıdır ne kadar sürdüğünü kontrol edin. Değer genellikle bazıları yeterince uzakta değilse, belirli bir uzak sistemin tüm kullanıcıları için ekleyin. Google Ads'deki Bazel profili çıkarma özellikleri kullanarak standart bir aldığına dikkat edin.

Dinamik yürütme, yerel korumalı alana alınmış stratejinin yanı sıra kalıcı çalışanlar. 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ı alana alınan strateji yavaş olabilir. azaltmak için --reuse_sandbox_directories bu sistemlerde korumalı alan oluşturma zorlukları ortadan kalkar.

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, farklılıkları önlemek için bilinçli bir seçimdir arasındaki farkları konuşacağız.

Dinamik yürütme ve kilitlemenin nasıl çalıştığı hakkında daha fazla bilgi için bkz. Julio Merino'nun mükemmel blog'u yayı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 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. kaybetmeyi başardık. 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.

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

8 Javac çalışanının kullanıldığı yukarıdaki profilde çok sayıda Javac çalışanının yarışları kaybetmiş ve async-worker-finish üzerinde çalışmasını tamamlamış olmalıdır. ileti dizileri. 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 verilerin profilini oluşturma

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ılmıştır. 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ında, yeterli düzeyde kaynak olduğunu varsayar yerel olarak ve uzaktan, hizmeti geliştirmek için ekstra kaynak harcamaya değeceğini yardımcı olabilir. 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 Bunun azaltılması derleme hızlarını artırabilir ve daha yerel kaynaklar.

--experimental_dynamic_local_load_factor, deneysel, gelişmiş bir kaynaktır yönetim seçeneği sunar. 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 bekleyen birçok işlem olduğunda yerel olarak planlanmış işlemler planlayabilirsiniz. Seçeneği 1 olarak ayarlamak, tüm işlemlerin planlanmasına olanak tanır kullanılabilir CPU'lardır (--local_cpu_resources uyarınca). Küçük değerler sayıyı belirler işlem sayısı daha yüksek olduğundan, bu sayıya karşılık gelen şekilde daha az olacak şekilde programlanan işlem yüzdesi: çalıştırılabilir. Kulağa klişe gelebilir ama iyi bir uzaktan kumandalı birçok işlem gerçekleşiyorken yerel yürütmenin pek bir yardımı olmaz ve yerel CPU, uzaktan işlemleri yönetmek için daha iyi harcanır.

--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 özellik, varsayılan olarak etkin değildir. uzak sistemle ilgili çözülmesi gereken sorunları gizleyebilir. Ş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 genellikle çalışan kaynak sınırlarıyla birlikte yararlıdır (bkz. --experimental_worker_memory_limit_mb --experimental_worker_sandbox_hardening, ve --experimental_sandbox_memory_limit_mb)), işçi süreçleri çok fazla kaynak kullandığında sonlandırılabilir.

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ütmeden ekstra çıkış ekler yardımcı olabilecek yeni bir sistem geliştirebilirsiniz. Ayrıca --dynamic_local_execution_delay flag'lerini ve sayısını uzaktan ve yerel işlerde bu da sorunların yeniden üretilmesini kolaylaştırır.

standalone kullanarak dinamik yürütmeyle ilgili sorun yaşıyorsanız stratejisi, --experimental_local_lockfree_output olmadan çalıştırmayı deneyin veya yerel işlemleriniz korumalı alana alındı. Bu, derlemenizi biraz yavaşlatabilir (daha fazla bilgi edinmek için Mac veya Windows'daysanız) ancak hatanın olası bazı nedenlerini ortadan kaldırır.