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

Sorun bildir 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'ı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. --noworker_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.