Bu sayfada Multiplex çalışanları, multiplex uyumlu kuralların nasıl yazılacağı ve belirli sınırlamalara yönelik çözümler açıklanmaktadır.
Multiplex çalışanlar, Bazel'ın tek bir çalışan işlemiyle birden fazla isteği işlemesine olanak tanır. Çok iş parçacıklı çalışanlar söz konusu olduğunda Bazel aynı performansı veya daha iyi performansı elde etmek için daha az kaynak kullanabilir. Örneğin, Bazel'in çalışan başına bir çalışan süreci olması yerine, aynı çalışan süreciyle konuşan dört tane çok yönlü çalışan olabilir ve bunlar da daha sonra istekleri paralel olarak işleyebilir. Java ve Scala gibi diller için bu, JVM ısınma süresinden ve JIT derleme zamanından tasarruf edilmesini sağlar ve genel olarak aynı türden tüm çalışanlar arasında tek bir paylaşılan önbellek kullanılmasına olanak tanır.
Genel bakış
Bazel sunucusu ve çalışan işlem arasında iki katman bulunur. İşlemleri paralel olarak çalıştırabilen belirli anımsatıcılar için Bazel, çalışan havuzundan bir WorkerProxy
alır. WorkerProxy
, istekleri bir request_id
ile birlikte çalışan işlemine sırayla yönlendirir, çalışan işlem isteği işler ve yanıtları WorkerMultiplexer
'a gönderir. WorkerMultiplexer
bir yanıt aldığında request_id
öğesini ayrıştırır ve daha sonra, yanıtları tekrar doğru WorkerProxy
koduna yönlendirir. Çoğunlukla alınmamış çalışanlarda olduğu gibi, tüm iletişim standart giriş/çıkış üzerinden yapılır, ancak araç, kullanıcının görebileceği çıkış için yalnızca stderr
'i kullanamaz (aşağıya bakın).
Her çalışanın bir anahtarı vardır. Bazel, hangi WorkerMultiplexer
kullanılacağını belirlemek için anahtarın karma kodunu (ortam değişkenleri, yürütme kökü ve anımsatıcılardan oluşur) kullanır. Aynı karma koduna sahip WorkerProxy
'ler, aynı WorkerMultiplexer
ile iletişim kurar. Bu nedenle, ortam değişkenlerinin ve yürütme kökünün tek bir Bazel çağrısında aynı olduğu varsayıldığında, her benzersiz anımsatıcı yalnızca bir WorkerMultiplexer
ve bir çalışan işlemine sahip olabilir. Normal çalışanlar ve WorkerProxy
'ler dahil toplam çalışan sayısı hâlâ --worker_max_instances
ile sınırlıdır.
Multiplex uyumlu kurallar yazma
Multiplex çalışanlardan yararlanmak için kuralın çalışma süreci çok iş parçacıklı olmalıdır. Protobuf, akışta birden fazla istek toplanıyor olsa bile kural grubunun tek bir isteği ayrıştırmasına olanak tanır. Çalışan işlem, akıştan bir isteği ayrıştırdığında isteği yeni bir iş parçacığında işlemelidir. Farklı iş parçacığı aynı anda tamamlayıp akışa yazabileceğinden, çalışan sürecin yanıtların anatomik olarak yazıldığından (mesajlar çakışmaz) emin olması gerekir. Yanıtlar, işlediği isteğin request_id
özelliğini içermelidir.
Multiplex çıkışı yönetme
Multiplex çalışanlarının, çıktılarını kontrol etme konusunda tekli çalışanlardan daha dikkatli olması gerekir. stderr
öğesine gönderilen her şey, aynı türdeki tüm WorkerProxy
öğeleri arasında paylaşılan ve eşzamanlı istekler arasında rastgele aralıklı olarak eklenen tek bir günlük dosyasına gider. stdout
öğesini stderr
içine yönlendirmek iyi bir fikir olsa da bu çıktıyı WorkResponse
öğesinin output
alanında toplamayın. Bu durum, kullanıcıya karışmış çıktı parçalarını gösterebilir.
Aracınız stdout
veya stderr
hizmetine yalnızca kullanıcı odaklı çıkış gönderiyorsa Multiplex çalışanları etkinleştirmeden önce bu davranışı değiştirmeniz gerekir.
Multiplex çalışanları etkinleştirme
Multiplex çalışanları varsayılan olarak etkin değildir. Kural kümesi, bir işlemin execution_requirements
içinde supports-multiplex-workers
etiketini kullanarak Multiplex çalışanları etkinleştirebilir (supports-workers
etiketinin normal çalışanları etkinleştirmesi gibi). Normal çalışanlar kullanılırken olduğu gibi, bir çalışan stratejisinin kural grubu düzeyinde (örneğin, --strategy=[some_mnemonic]=worker
) veya genel olarak strateji düzeyinde (ör. --dynamic_local_strategy=worker,standalone
) belirtilmesi gerekir. Ek işaret gerekmez ve her ikisi de ayarlanmışsa supports-multiplex-workers
supports-workers
üzerinde öncelikli olur. --noexperimental_worker_multiplex
işlemini ileterek Multiplex çalışanları global olarak devre dışı bırakabilirsiniz.
Bir kural grubunun, bellek baskısını azaltmak ve performansı artırmak için mümkünse multiplex çalışanlar kullanması önerilir. Bununla birlikte, multiplex çalışanlar, Multiplex korumalı alana alma işlemi uygulamadıkları sürece şu anda dinamik yürütme ile uyumlu değildir. Korumalı alana alınmayan multiplex çalışanları, dinamik yürütmeyle çalıştırılmaya çalışılırsa bunun yerine sessizce korumalı alana alınmış tekli çalışanlar kullanılır.
Multiplex korumalı alanı oluşturma
Multiplex çalışanlar, çalışan uygulamalarına açık destek eklenerek korumalı alana alınabilir. Tek yönlü çalışan korumalı alana alma işlemi, her çalışan işlemi kendi korumalı alanında çalıştırılarak yapılabilir. Multiplex çalışanlar ise işlem çalışma dizinini birden fazla paralel istek arasında paylaşır. Multiplex çalışanların korumalı alana alınması için, çalışan, doğrudan çalışma dizininde belirtilen bir alt dizin yerine her istekte belirtilen alt dizinden okumayı ve bu alt dizine yazmayı desteklemelidir.
Multiplex korumalı alanı desteklemek için çalışanın WorkRequest
alanındaki sandbox_dir
alanını kullanması ve bunu tüm dosya okuma ve yazma işlemlerinde önek olarak kullanması gerekir.
arguments
ve inputs
alanları, korumalı alana alınmayan isteklerden bağımsız olarak kalır ancak gerçek girişler sandbox_dir
ile görelidir. Çalışan, bu değiştirilmiş yoldan okumak için arguments
ve inputs
içinde bulunan dosya yollarını çevirmeli ve tüm çıkışları sandbox_dir
ile göreli olarak yazmalıdır.
"." gibi yolların yanı sıra, bağımsız değişkenlerde belirtilen dosyalarda bulunan yollar da ("argfile" bağımsız değişkenleri gibi) buna dahildir.
Bir çalışan, Multiplex korumalı alanı desteklediğinde, kural kümesi bir işlemin execution_requirements
öğesine supports-multiplex-sandboxing
ekleyerek bu desteği beyan edebilir. Daha sonra Bazel, --experimental_worker_multiplex_sandboxing
işareti iletilirse veya çalışan dinamik yürütmeyle kullanılırsa Multiplex korumalı alanı kullanır.
Korumalı alana alınan bir multiplex çalışanın çalışan dosyaları, çalışan işleminin çalışma dizinine göre değişmeden kalır. Bu nedenle, bir dosya hem çalışanı çalıştırmak hem de giriş olarak kullanılıyorsa bu dosya hem işaretleme dosyası bağımsız değişkeninde hem de tools
, executable
veya runfiles
içinde giriş olarak belirtilmelidir.