Bu sayfada çoklu çalışanlar, çoklu uyumlu kuralların nasıl yazılacağı ve belirli sınırlamalar için geçici çözümler açıklanmaktadır.
Çoklu çalışanlar, Bazel'in tek bir çalışan işlemiyle birden fazla isteği işlemesine olanak tanır. Bazel, çok iş parçacıklı çalışanlar için aynı veya daha iyi performans elde etmek amacıyla daha az kaynak kullanabilir. Örneğin, Bazel'de çalışan başına bir çalışan işlemi yerine, aynı çalışan işlemiyle iletişim kuran dört çoklu çalışan olabilir. Bu çalışan işlemi, istekleri paralel olarak işleyebilir. Java ve Scala gibi diller için bu, JVM ısıtma süresinden ve JIT derleme süresinden tasarruf sağlar ve genel olarak aynı türdeki tüm çalışanlar arasında tek bir paylaşılan önbelleğin kullanılmasına olanak tanır.
Genel Bakış
Bazel sunucusu ile çalışan işlemi arasında iki katman vardır. Bazel, işlemleri paralel olarak çalıştırabilen belirli anımsatıcılar için çalışan havuzundan bir WorkerProxy
alır. WorkerProxy
, istekleri request_id
ile birlikte sırayla işçi işlemine yönlendirir. İşçi işlemi, isteği işler ve yanıtları WorkerMultiplexer
'ye gönderir. WorkerMultiplexer
bir yanıt aldığında request_id
'yi ayrıştırır ve yanıtları doğru WorkerProxy
'ye iletir. Çoklu olmayan işleyicilerde olduğu gibi, tüm iletişim standart giriş/çıkış üzerinden yapılır ancak araç, kullanıcı tarafından görülebilen çıkış için yalnızca stderr
kullanamaz (Aşağıya bakın).
Her çalışanın bir anahtarı vardır. Bazel, hangi WorkerMultiplexer
'nin kullanılacağını belirlemek için anahtarın karma kodunu (ortam değişkenlerinden, yürütme kökünden ve anımsatıcıdan oluşur) kullanır. Aynı karma koduna sahip WorkerProxy
'ler aynı WorkerMultiplexer
ile iletişim kurar. Bu nedenle, tek bir Bazel çağrısında ortam değişkenlerinin ve yürütme kökünün aynı olduğu varsayıldığında, her benzersiz anımsatıcının yalnızca bir WorkerMultiplexer
ve bir işleyici işlemi olabilir. Normal çalışanlar ve WorkerProxy
'ler dahil olmak üzere toplam çalışan sayısı --worker_max_instances
ile sınırlı olmaya devam etmektedir.
Çoklu yayın uyumlu kuralları yazma
Çoklu çalışanlardan yararlanmak için kuralın çalışan işlemi çok iş parçacıklı olmalıdır. Protobuf, akışta birden fazla istek birikmiş olsa bile kural kümesinin tek bir isteği ayrıştırmasına olanak tanır. İşçi işlemi, akıştan bir isteği ayrıştırdığında isteği yeni bir iş parçacığında işlemelidir. Farklı iş parçacıkları aynı anda tamamlanıp akışa yazabileceğinden, işleyici işleminin yanıtların atomik olarak yazılmasını (iletiler çakışmamalıdır) sağlaması gerekir. Yanıtlar, ele aldıkları isteğin request_id
değerini içermelidir.
Çoklu yayın çıkışını işleme
Çoklu kanallı çalışanların, çıktılarını işleme konusunda tek kanallı çalışanlara kıyasla daha dikkatli olmaları gerekir. stderr
adresine gönderilen her şey, aynı türdeki tüm WorkerProxy
'lar arasında paylaşılan tek bir günlük dosyasına gider ve eşzamanlı istekler arasında rastgele olarak yerleştirilir. stdout
'ü stderr
'a yönlendirmek iyi bir fikir olsa da bu çıktıyı WorkResponse
'ın output
alanına toplamayın. Aksi takdirde, kullanıcıya bozuk çıktı parçaları gösterilebilir.
Aracınız yalnızca stdout
veya stderr
'e kullanıcı odaklı çıkış gönderiyorsa çoklu işleyicileri etkinleştirebilmek için bu davranışı değiştirmeniz gerekir.
Çoklu çalışanları etkinleştirme
Multiplex çalışanları varsayılan olarak etkin değildir. Bir kural kümesi, bir işlemin execution_requirements
alanında supports-multiplex-workers
etiketini kullanarak çoklu işleyicileri etkinleştirebilir (tıpkı supports-workers
etiketinin normal işleyicileri etkinleştirmesi gibi). Normal çalışanlar kullanılırken olduğu gibi, kural kümesi düzeyinde (örneğin, --strategy=[some_mnemonic]=worker
) veya genel olarak strateji düzeyinde (örneğin, --dynamic_local_strategy=worker,standalone
) bir çalışan stratejisi belirtilmesi gerekir. Ek işaret gerekli değildir ve her ikisi de ayarlanmışsa supports-multiplex-workers
, supports-workers
'a göre önceliklidir. --noworker_multiplex
parametresini ileterek çoklu işleyicileri dünya genelinde devre dışı bırakabilirsiniz.
Bellek baskısını azaltmak ve performansı artırmak için mümkünse kural kümelerinde çoklu çalışan kullanılması önerilir. Ancak çoklu işleyiciler, çoklu korumalı alan uygulamadıkları sürece şu anda dinamik yürütme ile uyumlu değildir. Dinamik yürütmeyle korumalı olmayan çoklu işleyicileri çalıştırmaya çalışmak, bunun yerine korumalı tek işleyicileri sessizce kullanır.
Multiplex korumalı alana alma
Çoklu işleyiciler, işleyici uygulamalarına açık destek ekleyerek korumalı alana alınabilir. Tekplex çalışan korumalı alanı, her çalışan sürecini kendi korumalı alanında çalıştırarak yapılabilir. Çoklu çalışanlar ise işlem çalışma dizinlerini birden fazla paralel istek arasında paylaşır. Çoklu çalışanların korumalı alana alınmasına izin vermek için çalışanın, doğrudan çalışma dizininde değil, her isteğinde belirtilen bir alt dizinde okuma ve yazma işlemlerini desteklemesi gerekir.
Çoklu korumalı alan desteği için işleyicinin, WorkRequest
alanındaki sandbox_dir
alanını kullanması ve bunu tüm dosya okuma ve yazma işlemleri için ön ek olarak kullanması gerekir.
arguments
ve inputs
alanları, korumalı alan dışındaki bir istekle aynı kalsa da gerçek girişler sandbox_dir
ile ilgilidir. İşçi, arguments
ve inputs
'te bulunan dosya yollarını bu değiştirilmiş yoldan okumak için çevirmeli ve tüm çıkışları sandbox_dir
'ye göre yazmalıdır.
Buna, "." gibi yollar ve bağımsız değişkenlerde belirtilen dosyalarda bulunan yollar (ör. "argfile" bağımsız değişkenleri) dahildir.
Bir işleyici çoklu korumalı alan desteğini desteklediğinde kural kümesi, bir işlemin execution_requirements
alanına supports-multiplex-sandboxing
ekleyerek bu desteği belirtebilir. Bazel, --experimental_worker_multiplex_sandboxing
işareti iletilirse veya işleyici dinamik yürütmeyle kullanılırsa çoklu korumalı alan kullanır.
Korumalı alan içeren çoklu çalışanın çalışan dosyaları, çalışan işleminin çalışma dizine göredir. Bu nedenle, bir dosya hem işleyiciyi çalıştırmak hem de giriş olarak kullanılıyorsa hem flagfile bağımsız değişkeninde hem de tools
, executable
veya runfiles
içinde giriş olarak belirtilmelidir.