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.
Şekil 1. Temiz derlemelerin performans iyileştirmeleri grafiği.
Bu yapılandırmada, yalnızca 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):
Ş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.
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:
- Orijinal kalıcı çalışanlar blog yayını
- Haskell uygulama açıklaması
- Blog yayını: Mike Morearty
- Bazel ile Kullanıcı Arabirimi Geliştirme: Angular/TypeScript ve Kalıcı Çalışanlar Asana eşliğinde
- Bazel stratejileri hakkında bilgi
- bazel-tartışma posta listesinde bilgilendirici çalışan stratejisi tartışması