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

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Bu sayfada, çoklu görevli çalışanlar, çoklu görevli çalışanlarla uyumlu kuralların nasıl yazılacağı ve belirli sınırlamalar için geçici çözümler açıklanmaktadır.

Çoklu görevli çalışanlar, Bazel'in tek bir çalışan süreciyle birden fazla isteği işlemesine olanak tanır. Çok iş parçacıklı çalışanlar için Bazel, aynı veya daha iyi performansı elde etmek üzere daha az kaynak kullanabilir. Örneğin, Bazel, çalışan başına bir çalışan işlemi yerine aynı çalışan işlemiyle iletişim kuran dört çoklu çalışan kullanabilir. Bu çalışanlar, istekleri paralel olarak işleyebilir. Java ve Scala gibi dillerde bu, JVM başlatma süresini ve JIT derleme süresini kısaltır. Ayrıca, aynı türdeki tüm çalışanlar arasında paylaşılan tek bir önbelleğin kullanılmasına olanak tanır.

Genel Bakış

Bazel sunucusu ile çalışan işlemi arasında iki katman vardır. Bazı işlemlerin paralel olarak çalıştırılabildiği belirli anımsatıcılar için Bazel, çalışan havuzundan WorkerProxy alır. WorkerProxy, istekleri request_id ile birlikte sırayla çalışan sürecine yönlendirir. Çalışan süreci, isteği işler ve yanıtları WorkerMultiplexer'ye gönderir. WorkerMultiplexer yanıt aldığında request_id öğesini ayrıştırır ve yanıtları doğru WorkerProxy öğesine geri yönlendirir. Çoklu olmayan çalışanlarda 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 öğesinin kullanılacağını belirlemek için anahtarın karma kodunu (ortam değişkenleri, yürütme kökü ve anımsatıcıdan oluşur) kullanır. WorkerProxy öğeleri, aynı karma koda sahipse 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ı yalnızca bir WorkerMultiplexer ve bir çalışan işlemine sahip olabilir. Normal çalışanlar ve WorkerProxy dahil olmak üzere toplam çalışan sayısı --worker_max_instances ile sınırlıdır.

Çoklu yayın uyumlu kurallar yazma

Kuralın çalışan işlemi, çoklu işleme çalışanlarından yararlanmak için çok iş parçacıklı olmalıdır. Protobuf, akışta birden fazla istek birikmiş olsa bile bir kurallar kümesinin tek bir isteği ayrıştırmasına olanak tanır. Çalışan süreci, akıştan gelen bir isteği her ayrıştırdığında isteği yeni bir iş parçacığında işlemelidir. Farklı iş parçacıkları aynı anda akışı tamamlayıp akışa yazabildiğinden, çalışan işlemin yanıtların atomik olarak yazıldığından (iletişimin çakışmadığından) emin olması gerekir. Yanıtlar, işledikleri isteğin request_id değerini içermelidir.

Multiplex çıkışını işleme

Çoklu görev çalışanları, tekli görev çalışanlarına kıyasla çıktılarını ele alma konusunda daha dikkatli olmalıdır. stderr adresine gönderilen her şey, aynı türdeki tüm WorkerProxy'ler arasında paylaşılan tek bir günlük dosyasına gider ve eşzamanlı istekler arasında rastgele yerleştirilir. stdout alanını stderr alanına yönlendirmek iyi bir fikir olsa da bu çıkışı output alanında toplamayın. Aksi takdirde, kullanıcıya bozuk çıkış parçaları gösterilebilir.WorkResponse Aracınız yalnızca stdout veya stderr'ye kullanıcı odaklı çıkış gönderiyorsa çoklu görevli çalışanları etkinleştirebilmek için bu davranışı değiştirmeniz gerekir.

Çoklu görevli çalışanları etkinleştirme

Multiplex çalışanları varsayılan olarak etkinleştirilmez. Bir kural grubu, bir işlemin execution_requirements bölümünde supports-multiplex-workers etiketini kullanarak çoklu görevli işçileri etkinleştirebilir (tıpkı supports-workers etiketinin normal işçileri etkinleştirmesi gibi). Normal çalışanlar kullanılırken olduğu gibi, kurallar 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 gerekmez ve her ikisi de ayarlanmışsa supports-multiplex-workers, supports-workers'e göre önceliklidir. --noworker_multiplex ileterek çoklu görev işçilerini genel olarak devre dışı bırakabilirsiniz.

Mümkünse bellek baskısını azaltmak ve performansı artırmak için bir kural grubunun çoklu görevli çalışanlar kullanması önerilir. Ancak, çoklu görevli çalışanlar çoklu görevli sanal alan oluşturma uygulanmadığı sürece şu anda dinamik yürütme ile uyumlu değildir. Dinamik yürütme ile korumalı alan içermeyen çoklu görevli çalışanları çalıştırma girişimleri, bunun yerine korumalı alan içeren tek görevli çalışanları sessizce kullanır.

Multiplex'i korumalı alana alma

Çalışan uygulamalarına açıkça destek eklenerek çoklu görev çalışanları korumalı alana alınabilir. Tek görevli çalışanların sanal ortamı, her çalışan süreci kendi sanal ortamında çalıştırılarak oluşturulabilir. Çok görevli çalışanlar ise süreç çalışma dizinini birden fazla paralel istek arasında paylaşır. Çoklu görevli çalışanların korumalı alanda çalışmasına izin vermek için çalışanın, doğrudan çalışma dizininde değil, her istekte belirtilen bir alt dizinden okumayı ve bu alt dizine yazmayı desteklemesi gerekir.

Çoklu sanal alan oluşturmayı desteklemek için çalışan, WorkRequest alanındaki sandbox_dir alanını kullanmalı ve bunu tüm dosya okuma ve yazma işlemleri için önek olarak kullanmalıdır. arguments ve inputs alanları, korumalı alan içermeyen bir istekte olduğu gibi kalırken gerçek girişler sandbox_dir ile ilgilidir. Çalışan, arguments ve inputs içinde bulunan dosya yollarını bu değiştirilmiş yoldan okuyacak şekilde çevirmeli ve tüm çıkışları sandbox_dir'a göreli olarak yazmalıdır. Buna, bağımsız değişkenlerde belirtilen dosyalarda bulunan yolların yanı sıra "." gibi yollar da dahildir (ör. "argfile" bağımsız değişkenleri).

Bir çalışan çoklu sanal alan oluşturmayı desteklediğinde, kural kümesi bir işlemin supports-multiplex-sandboxing kısmına execution_requirements ekleyerek bu desteği bildirebilir. Ardından, --experimental_worker_multiplex_sandboxing işareti iletilirse veya çalışan dinamik yürütmeyle kullanılırsa Bazel, çoklu sanal alan oluşturmayı kullanır.

Bir sanal alanlı çoklu görev işçisinin çalışan dosyaları, çalışan işleminin çalışma dizinine göreli olmaya devam eder. Bu nedenle, hem çalışanı çalıştırmak hem de giriş olarak kullanılan bir dosya, hem flagfile bağımsız değişkeninde giriş olarak hem de tools, executable veya runfiles içinde belirtilmelidir.