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

Sorun bildirin Kaynağı göster

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'in tek bir çalışan işlemiyle birden fazla isteği ele almasına olanak tanır. Çok iş parçacıklı çalışanlarda Bazel, aynı veya daha iyi performans elde etmek için daha az kaynak kullanabilir. Örneğin, çalışan başına bir çalışan sürecine sahip olmak yerine Bazel'de birden çok çalışana aynı çalışan süreciyle iletişim kurulabilir. Bu çalışan, istekleri paralel olarak ele alabilir. Bu, Java ve Scala gibi dillerde JVM ısınma ve JIT derleme süresinden tasarruf sağlar ve genel olarak aynı türden tüm çalışanlar arasında paylaşılan tek bir önbellek kullanılmasına olanak tanır.

Genel bakış

Bazel sunucusu ve çalışan işlemi arasında iki katman vardır. İşlemleri paralel olarak çalıştırabilen belirli anımsatıcılar için Bazel, çalışan havuzundan bir WorkerProxy alır. WorkerProxy, istekleri çalışan işlemine request_id ile birlikte sırayla yönlendirir, çalışan işlemi isteği işler ve yanıtları WorkerMultiplexer öğesine gönderir. WorkerMultiplexer bir yanıt aldığında request_id öğesini ayrıştırır ve ardından yanıtları tekrar doğru WorkerProxy öğesine yönlendirir. Multiplex özelliği olmayan çalışanlarda olduğu gibi, tüm iletişim standart giriş/çıkış üzerinden yapılır ancak araç, kullanıcıların görebileceği çıkışlar için yalnızca stderr öğesini 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. Aynı karma koduna sahip olan WorkerProxy öğeleri aynı WorkerMultiplexer ile iletişim kurar. Dolayısıyla, 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 dahil olmak üzere toplam çalışan sayısı --worker_max_instances ile sınırlandırılmaya devam ediyor.

Multiplex ile uyumlu kurallar yazma

Multiplex çalışanlarından yararlanabilmek için kuralın çalışma işlemi çok iş parçacıklı olmalıdır. Protobuf, akışta birden fazla istek birikse bile kural kümesinin tek bir isteği ayrıştırmasına olanak tanır. Çalışan 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 akışı tamamlayıp akışa yazabildiğinden, çalışan sürecin, yanıtların atomik olarak yazıldığından emin olmalıdır (mesajlar çakışmaz). Yanıtlar, işledikleri isteğin request_id kısmını içermelidir.

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

Multiplex çalışanlarının, çıktılarını işlerken singleplex çalışanlarına göre daha dikkatli olması gerekir. stderr öğesine gönderilen her şey, aynı türdeki tüm WorkerProxy'ler arasında paylaşılan tek bir günlük dosyasına aktarılır ve eşzamanlı istekler arasına rastgele yerleştirilir. stdout öğesini stderr öğesine yönlendirmek iyi bir fikirdir ancak bu çıkışı WorkResponse öğesinin output alanında toplamayın. Aksi halde, kullanıcının karıştırdığı çıktı parçaları gösterilebilir. Aracınız stdout veya stderr iş ortaklarına yalnızca kullanıcı odaklı çıktılar gönderiyorsa Multiplex çalışanları etkinleştirmeden önce bu davranışı değiştirmeniz gerekir.

Multiplex çalışanlarını etkinleştirme

Multiplex çalışanları varsayılan olarak etkin değildir. Kural grubu, bir işlemin execution_requirements öğesinde supports-multiplex-workers etiketini kullanarak Multiplex çalışanlarını etkinleştirebilir (supports-workers etiketinin normal çalışanları etkinleştirmesi gibi). Normal çalışanları kullanırken olduğu gibi, bir çalışma stratejisinin kural grubu düzeyinde (örneğin, --strategy=[some_mnemonic]=worker) veya genel olarak strateji düzeyinde (örneğin, --dynamic_local_strategy=worker,standalone) belirtilmesi gerekir. Ek flag'lere gerek yoktur ve her ikisi de ayarlanırsa supports-multiplex-workers, supports-workers öğesine göre önceliklidir. --noexperimental_worker_multiplex öğesini ileterek Multiplex çalışanlarını küresel olarak kapatabilirsiniz.

Bellek baskısını azaltmak ve performansı iyileştirmek için mümkün olduğunda Multiplex çalışanları kullanılması önerilir. Bununla birlikte, Multiplex çalışanları, Multiplex korumalı alan oluşturmadıkları sürece şu anda dinamik yürütme ile uyumlu değildir. Korumalı alanda olmayan Multiplex çalışanları, dinamik yürütmeyle çalıştırılmaya çalışıldığında sessizce korumalı alana alınan singleplex çalışanları kullanılır.

Multiplex korumalı alanı

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ı, işlem çalışma dizinini birden fazla paralel istek arasında paylaşır. Multiplex çalışanlarının korumalı alana alınmasına izin vermek için çalışan, doğrudan kendi çalışma dizini yerine her istekte belirtilen bir alt dizinden okumayı ve bu alt dizinde yazmayı desteklemelidir.

Çalışanın, Multiplex korumalı alanını desteklemek için WorkRequest öğesindeki 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ınmamış bir istekten değişmese de gerçek girişler, sandbox_dir ile görelidir. Çalışanın, bu değiştirilmiş yoldan okumak için arguments ve inputs içinde bulunan dosya yollarını çevirmesi ve ayrıca sandbox_dir ile göreli olarak tüm çıkışları yazması gerekir. Buna, "." gibi yolların yanı sıra bağımsız değişkenlerde belirtilen dosyalarda bulunan yollar (ör. "argfile" bağımsız değişkenleri) dahildir.

Bir çalışan, Multiplex korumalı alan kullanımını desteklediğinde kural grubu, işlemin execution_requirements öğesine supports-multiplex-sandboxing ekleyerek bu desteği bildirebilir. Daha sonra, --experimental_worker_multiplex_sandboxing işareti geçilirse veya çalışan dinamik yürütme ile kullanılıyorsa Bazel, Multiplex korumalı alanını kullanır.

Korumalı alana sahip bir Multiplex çalışanının çalışan dosyaları, çalışan işleminin çalışma dizinine göre belirlenir. Bu nedenle, bir dosya hem çalışanı çalıştırmak hem de giriş olarak kullanılıyorsa hem işaret dosyası bağımsız değişkeninde hem de tools, executable veya runfiles içinde giriş olarak belirtilmelidir.