Multiplex Çalışanları (Deneysel Özellik)

Sorun bildir Kaynağı göster Nightly · 8.0 · 7.4 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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. stdoutstderr'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. --noexperimental_worker_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.