Kararlı Çalışanlar

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

Bu sayfada, kalıcı çalışanların nasıl kullanılacağı, kazanımları, gereksinimleri nasıl etkilediğiyle ilgili daha fazla bilgi edinin.

Kalıcı çalışan, Bazel sunucusu tarafından başlatılan uzun süreli bir işlemdir. gerçek aracın (genellikle bir derleyici) etrafında bir sarmalayıcı işlevi görür veya aracın kendisidir. Aracın kalıcı çalışanlardan yararlanabilmesi için bir derleme dizisini teşvik ediyor ve sarmalayıcının API'si ile aşağıda açıklanan istek/yanıt biçimi arasında değişebilmektedir. Aynı çalışan,--persistent_worker ve projeyi uygun bir şekilde başlatmaktan ve çalışmasının yanı sıra çıkışta çalışanları devre dışı bırakmak da mümkün. Her çalışan örneği atanır altında ayrı bir çalışma dizinine (klasör olmadan) <outputBase>/bazel-workers

Kalıcı çalışanları kullanmak, yürütme stratejisi ile daha fazla JIT derlemesine olanak tanır ve işlemindeki soyut söz dizimi ağaçlarına örnek olarak verilebilir. Bu strateji bu iyileştirmeleri uzun süreli bir bahsedeceğim.

Kalıcı çalışanlar çeşitli dillerde uygulanır. Bu diller arasında Java, Scala, Kotlin ve daha fazlası.

NodeJS çalışma zamanı kullanan programlar @bazel/worker yardımcı kitaplığını kullanarak çalışan protokolüdür.

Kalıcı çalışanları kullanma

Bazel 0.27 ve sonraki sürümler derlemeleri yürütürken varsayılan olarak kalıcı çalışanları kullanır ancak uzaktan çalışır öncelik sırasına koyabilirsiniz. Kalıcı çalışanları desteklemeyen işlemler için Bazel her işlem için bir araç örneği başlatır. Bu kapsamdaki kullanıcıları worker ayarlayarak derlemenizi kalıcı çalışanları kullanacak şekilde ayarlayın geçerli aracın stratejisini anımsatıcılar. En iyi uygulama olarak, bu örnekte local öğesinin bir worker stratejisinden yararlanın:

bazel build //my:target --strategy=Javac=worker,local

Yerel strateji yerine çalışan stratejisini kullanmak derlemeyi hızlandırabilir uygulamaya bağlı olarak, hızı önemli ölçüde artırır. Java için derlemeler 2-4 olabilir kat daha hızlı, bazen de artımlı derlemeler için daha fazla çözüm sunar. Bazel derleniyor: yaklaşık 2,5 kat daha hızlıdır. Daha fazla bilgi için "Çalışan sayısını seçme" bölümüne ekleyin.

Yerel derlemenizle eşleşen bir uzak derleme ortamınız da varsa isterseniz, deneysel ortamı kullanmak için dinamik strateji, Böylece hem uzaktan yürütme hem de işçi yürütme. Dinamik gezinmeyi etkinleştirmek için strateji, proje yönetimi --experimental_spawn_scheduler tıklayın. Bu strateji, çalışanları otomatik olarak etkinleştirir. Dolayısıyla, worker stratejisini belirtebilir ancak local veya sandboxed öğesini, kullanabilirsiniz.

Çalışan sayısını seçme

Anımsatıcı başına varsayılan çalışan örneği sayısı 4'tür, ancak ayarlanabilir şununla: worker_max_instances tıklayın. Mevcut CPU'lardan iyi bir şekilde yararlanmak ile elde ettiğiniz JIT derlemesi ve önbellek isabeti oranıdır. Daha fazla çalışanla, hedefler, JIT uygulanmamış kod çalıştırmanın ve baştan başlatmanın başlangıç maliyetlerini öder. önbellek. Oluşturulacak az sayıda hedefiniz varsa tek bir çalışan size en iyi dengeyi bulmaya çalışın (örneğin, 8586 numaralı sorunu inceleyin. worker_max_instances işareti, her bir işlem için maksimum çalışan örneği sayısını belirler anımsatıcılar ve işaret grubu (aşağıya bakın). Bu nedenle, karma bir sistemde varsayılan değeri koruyarak çok fazla bellek kullanabilirsiniz. Artımlı derlemeler için daha az avantaj sunar.

Bu grafik, Bazel (hedef) için sıfırdan derleme sürelerini göstermektedir //src:bazel), 6 çekirdekli hiper iş parçacıklı Intel Xeon 3,5 GHz Linux iş istasyonunda 64 GB RAM'e sahip. Her çalışan yapılandırması için beş tane temiz derleme çalıştırılıyor ve ortalaması alınır.

Temiz derlemelerin performans iyileştirmeleri grafiği

Şekil 1. Temiz derlemelerin performans iyileştirmeleri grafiği.

Bu yapılandırmada, yalnızca %14 ile en hızlı derlemeyi iki çalışan verir. ne kadar büyük bir iyileşme olduğunu gösteriyor. Bir çalışan dahil olmak üzere daha az bellek kullanır.

Artımlı derleme genellikle daha da fazla fayda sağlar. Temiz derlemeler nispeten nadirdir ancak tek bir dosyanın derlemeler arasında değiştirilmesi, teste dayalı geliştirmede pek çok yöntem mevcut. Yukarıdaki örnekte ayrıca, ek derleme süresini gölgede bırakabilecek paketleme işlemleri içerir.

Yalnızca Java kaynaklarını yeniden derleme (//src/main/java/com/google/devtools/build/lib/bazel:BazelServer_deploy.jar) dahili dize sabit değerini değiştirdikten sonra AbstractContainerizingSandboxedSpawn.java 3 kat hızlanma sağlar (bir ısınma derlemesi ile ortalama 20 artımlı derleme) silindi):

Artımlı derlemelerin performans iyileştirmeleri grafiği

Şekil 2. Artımlı derlemelerin performans iyileştirmelerinin grafiği.

Bu hız, yapılan değişikliğe bağlıdır. Faktör 6’nın hızlanması yaygın olarak kullanılan bir sabit değer değiştirildiğinde yukarıdaki durumda ölçülür.

Kalıcı çalışanları değiştirme

Hedeflerinize ulaşmadan önce --worker_extra_flag işareti ile başlayan, çalışanlara başlatma bayraklarını belirtir. Örneğin, --worker_extra_flag=javac=--debug geçmek, yalnızca Javac için hata ayıklamayı etkinleştirir. Bu işaretin kullanımı başına ve yalnızca bir anımsatıcı için yalnızca bir çalışan işareti ayarlanabilir. İşçiler her anımsatıcı için ayrı ayrı değil, aynı zamanda ve bunların başlangıç bayraklarındaki farklılıklar. Anımsatıcı ve başlatmanın her kombinasyonu bayraklar bir WorkerKey olarak birleştirilir ve her WorkerKey için worker_max_instances çalışan oluşturulabilir. işlem yapılandırması, kurulum bayraklarını da belirtebilir.

URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için --high_priority_workers normal öncelikli öncelikli olarak çalıştırılması gereken bir anımsatıcıyı belirtmek için işaret anımsatıcılar. Bu sayede her zaman kritik önemde olan işlemlere öncelik verebilirsiniz yol'a dokunun. İstekleri yürüten iki veya daha fazla yüksek öncelikli çalışan varsa diğer çalışanların çalışması engellenir. Bu işaret birden fazla kez kullanılabilir.

Başarılı --worker_sandboxing flag, her çalışan isteğinin tüm istekleri için ayrı bir korumalı alan dizini kullanmasını sağlar. giriş değerleridir. Korumalı alanın oluşturulması biraz zaman alır. özellikle macOS'te çalışır, ancak daha iyi doğruluk garantisi verir.

İlgili içeriği oluşturmak için kullanılan --worker_quit_after_build flag, özellikle hata ayıklama ve profil çıkarma için faydalıdır. Bu işaret, tüm çalışanları zorluyor birçok farklı yolu vardır. Ayrıca --worker_verbose - hakkında daha fazla çıktı almak için bir fırsattır. Bu işaret, WorkRequest içinde verbosity alanı, çalışan uygulamalarının da kullanılmasına izin verir anlatabilmişimdir.

Çalışanlar, günlüklerini <outputBase>/bazel-workers dizininde depolar. örnek /tmp/_bazel_larsrc/191013354bebe14fdddae77f2679c3ef/bazel-workers/worker-1-Javac.log. Dosya adı, çalışan kimliğini ve anımsatıcıyı içerir. Daha fazla birden fazla WorkerKey varsa worker_max_instances günlük dosyalarından yararlanma olanağı sağlar.

Android derlemeleriyle ilgili ayrıntılar için Android Derleme Performansı sayfası.

Kalıcı çalışanları hayata geçirme

Daha fazla bilgi için kalıcı çalışanlar oluşturma sayfasına bakın bilgi almalısınız.

Bu örnekte, JSON kullanan bir çalışan için Starlark yapılandırması gösterilmektedir:

args_file = ctx.actions.declare_file(ctx.label.name + "_args_file")
ctx.actions.write(
    output = args_file,
    content = "\n".join(["-g", "-source", "1.5"] + ctx.files.srcs),
)
ctx.actions.run(
    mnemonic = "SomeCompiler",
    executable = "bin/some_compiler_wrapper",
    inputs = inputs,
    outputs = outputs,
    arguments = [ "-max_mem=4G",  "@%s" % args_file.path],
    execution_requirements = {
        "supports-workers" : "1", "requires-worker-protocol" : "json" }
)

Bu tanıma göre, bu eylemin ilk kullanımı komut satırından /bin/some_compiler -max_mem=4G --persistent_worker. İstek işlevi şu şekilde görünür: Foo.java

NOT: Protokol arabellek spesifikasyonunda "yılan büyük/küçük harf" kullanılmasına rağmen (request_id), JSON protokolünde "deve büyük/küçük harf" kullanılır. (requestId). Bu belgede, JSON örneklerinde büyük harf, alan hakkında konuşurken yılan durumu veya protokolden bağımsız olarak.

{
  "arguments": [ "-g", "-source", "1.5", "Foo.java" ]
  "inputs": [
    { "path": "symlinkfarm/input1", "digest": "d49a..." },
    { "path": "symlinkfarm/input2", "digest": "093d..." },
  ],
}

Çalışan, bunu stdin üzerinde yeni satırlarla ayrılmış JSON biçiminde (çünkü requires-worker-protocol, JSON değerine ayarlanır). Ardından çalışan eylemi gerçekleştirir. ve stdout'unda Bazel'e JSON biçimli bir WorkResponse gönderir. Bazel, ardından bu yanıtı ayrıştırıp manuel olarak WorkResponse protosuna dönüştürür. Alıcı: yerine ikili kodlanmış protobuf kullanarak ilişkili çalışanla iletişim kurmak JSON, requires-worker-protocol şu şekilde proto olarak ayarlanır:

  execution_requirements = {
    "supports-workers" : "1" ,
    "requires-worker-protocol" : "proto"
  }

Yürütme şartlarına requires-worker-protocol dahil etmezseniz Bazel, çalışan iletişimini varsayılan olarak protobuf kullanacak şekilde ayarlar.

Bazel, WorkerKey öğesini hafızalardan ve paylaşılan işaretlerden türetir; dolayısıyla bu yapılandırmaya göre max_mem parametresinin değiştirilmesine izin verilirken ayrı bir çalışan ortaya çıkmasını sağlar. Bu durum, aşağıdaki durumlarda aşırı bellek tüketimine neden olabilir çok fazla sayıda varyasyon kullanılıyor.

Her çalışan şu anda bir seferde yalnızca bir isteği işleyebilir. Deneysel Multiplex çalışanları özelliği, birden fazla çalışan iş parçacıkları; temel araç çok iş parçacıklıysa ve sarmalayıcı anlayamıyorum.

İçinde bu GitHub deposunu Python'un yanı sıra Java'da da yazılmış örnek çalışan sarmalayıcılar görebilirsiniz. Şu durumda: JavaScript veya TypeScript'te çalışıyorsanız @bazel/worker paketi ve nodejs çalışanı örneği yardımcı olabilir.

Çalışanlar korumalı alanı nasıl etkiler?

worker stratejisinin varsayılan olarak kullanılması, işlemi korumalı alan, local stratejisine benzer. Bu ayarı, Tüm çalışanları korumalı alan içinde çalıştırmak için --worker_sandboxing işareti. yalnızca olması gereken giriş dosyalarını görür. Araç yine de istekler arasında dahili olarak bilgi sızdırabilir (örneğin, önbellek. dynamic stratejisi kullanılıyor çalışanların korumalı alana alınmasını gerektirir.

Derleyici önbelleklerinin çalışanlarla doğru şekilde kullanılmasına olanak tanımak için bir özet aktarılır her giriş dosyasıyla birlikte dönüştürmenizi sağlar. Böylece derleyici veya sarmalayıcı, girişin yapılıp yapılmadığını hale getirebilirsiniz.

İstenmeyen önbelleğe almayı önlemek için giriş özetleri kullanılırken bile korumalı alana alınır çalışanlar saf korumalı alana göre daha az katı bir korumalı alan sunar, çünkü araç önceki isteklerden etkilenen diğer dahili durumları koruma

Multiplex çalışanları, yalnızca çalışan uygulaması destekliyorsa korumalı alana alınabilir. Bu korumalı alan, --experimental_worker_multiplex_sandboxing işareti. Ayrıntılı bilgi için: tasarım dokümanına göz atın).

Daha fazla bilgi

Kalıcı çalışanlar hakkında daha fazla bilgi için bkz: