इस पेज पर मल्टीप्लेक्स काम करने वालों के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि ऐसे पेज पर मल्टीप्लेक्स के साथ काम करने के नियम कैसे लिखे जा सकते हैं. इसके अलावा, कुछ सीमाओं को भी हल करने का तरीका बताया गया है.
मल्टीप्लेक्स वर्कर, Bazel का इस्तेमाल करके एक वर्कर प्रोसेस वाले कई अनुरोधों को मैनेज करने की अनुमति देते हैं. कई थ्रेड वाले वर्कर के लिए, Bazel, पहले से ज़्यादा बेहतर या बेहतर परफ़ॉर्मेंस के लिए कम संसाधनों का इस्तेमाल कर सकता है. जैसे, हर वर्कर के लिए एक प्रोसेस होने के बजाय, बज़ेल के चार मल्टीप्लेक्स वर्कर एक ही वर्कर प्रोसेस पर बात कर सकते हैं. इसके बाद, वे एक साथ काम करने वाले सभी अनुरोधों को हैंडल कर सकते हैं. Java और Scala जैसी भाषाओं के लिए, यह JVM का वॉर्म-अप समय और JIT कंपाइलेशन का समय बचाता है और आम तौर पर एक ही तरह के सभी वर्कर के बीच शेयर की गई एक कैश मेमोरी का इस्तेमाल करता है.
खास जानकारी
बेज़ल सर्वर और वर्कर प्रोसेस के बीच दो लेयर होती हैं. उदाहरण के लिए, कुछ शब्दों को एक साथ चलाने के लिए प्रोसेसर को एक साथ WorkerProxy
वर्कर पूल से मिलता है. WorkerProxy
अनुरोधों को प्रोसेस करने के लिए, वर्कर
प्रोसेस के साथ request_id
भेजता है. वर्कर प्रोसेस, अनुरोध को प्रोसेस करती है और WorkerMultiplexer
को जवाब भेजती है. जब WorkerMultiplexer
कोई जवाब मिलता है, तो यह request_id
को पार्स करता है. इसके बाद, जवाबों को सही WorkerProxy
पर फ़ॉरवर्ड कर देता है. मल्टीप्लेक्स नहीं किए गए वर्कर की तरह, कम्यूनिकेशन के लिए भी सामान्य तरीके से या तय किए गए समय के अंदर इनपुट किया जाता है. हालांकि, यह टूल उपयोगकर्ता को दिखने वाले आउटपुट (नीचे देखें) के लिए, सिर्फ़ stderr
का इस्तेमाल नहीं कर सकता.
हर वर्कर के पास एक कुंजी होती है. Bazel, यह तय करने के लिए कुंजी का हैश कोड इस्तेमाल करता है कि परिवेश के वैरिएबल (एक्ज़ीक्यूशन रूट), एक्ज़ीक्यूशन रूट (यानी कि पेज के बाहरी हिस्से में क्या बदलाव होता है), और नाम वाली स्ट्रिंग. WorkerProxy
का इस्तेमाल करने पर, एक ही हैश कोड WorkerMultiplexer
के साथ इंटरैक्ट करता है.WorkerMultiplexer
इसलिए, अगर हम यह मानते हैं कि एनवायरमेंट वैरिएबल और एक्ज़ीक्यूशन रूट, एक ही बेज़ेल इनवोकेशन में एक जैसे हैं, तो हर यूनीक एनमोनिक में सिर्फ़ एक WorkerMultiplexer
और एक वर्कर प्रोसेस हो सकती है. सामान्य कर्मचारियों और
WorkerProxy
के साथ-साथ काम करने वाले लोगों की कुल संख्या अब भी --worker_max_instances
तक सीमित है.
मल्टीप्लेक्स के साथ काम करने वाले नियम लिखना
नियम की वर्कर प्रोसेस को मल्टीप्लेक्स होना चाहिए, ताकि मल्टीप्लेक्स वर्कर को फ़ायदा मिल सके. Protobuf एक नियम को किसी एक अनुरोध को पार्स करने की अनुमति देता है,
भले ही स्ट्रीम में कई अनुरोध हो रहे हों. जब भी वर्कर प्रोसेस, स्ट्रीम के अनुरोध को पार्स करता है, तब उसे नए थ्रेड में अनुरोध हैंडल करना चाहिए. एक ही समय पर अलग-अलग थ्रेड पूरी हो सकती है और स्ट्रीम में लिखी जा सकती है. इसलिए, वर्कर प्रोसेस को यह पक्का करना होता है कि जवाब सोच-समझकर लिखे गए हों (मैसेज ओवरलैप नहीं करते). रिस्पॉन्स में उस अनुरोध का
request_id
होना चाहिए जिसे वे मैनेज कर रहे हैं.
मल्टीप्लेक्स आउटपुट को हैंडल करना
मल्टीप्लेक्स वर्कर को अपने आउटपुट को सिंगलप्लेक्स वर्कर के बजाय
ज़्यादा सावधानी से मैनेज करना होता है. stderr
पर भेजी गई कोई भी चीज़ एक ही लॉग फ़ाइल में जाएगी, जो एक ही तरह के सभी WorkerProxy
में शेयर होगी. साथ ही, एक ही समय पर आने वाले अनुरोधों के बीच रैंडम रूप से अंतर कर दी जाएगी. stdout
को stderr
पर रीडायरेक्ट करना एक बेहतर आइडिया है. हालांकि, उस आउटपुट को WorkResponse
के output
फ़ील्ड में इकट्ठा न करें. ऐसा करने से, उपयोगकर्ता को आउटपुट वाले हिस्सों में उलझना पड़ सकता है.
अगर आपका टूल सिर्फ़ उपयोगकर्ता को दिया गया आउटपुट stdout
या stderr
पर भेजता है, तो मल्टीप्लेक्स वर्कर को चालू करने से पहले आपको उस व्यवहार को बदलना होगा.
मल्टीप्लेक्स वर्कर को चालू करना
मल्टीप्लेक्स वर्कर डिफ़ॉल्ट रूप से चालू नहीं होते हैं. कोई नियम तय करने के लिए किसी कार्रवाई
execution_requirements
की तरह supports-multiplex-workers
टैग का इस्तेमाल करके, मल्टीप्लेक्स
चालू किया जा सकता है. यह ठीक उसी तरह होता है जैसे supports-workers
टैग की वजह से सामान्य कर्मचारी
चालू होते हैं. अगर सामान्य वर्कर (जैसे कि --dynamic_local_strategy=worker,standalone
) को सामान्य वर्कर (उदाहरण के लिए, --strategy=[some_mnemonic]=worker
) या आम तौर पर रणनीति लेवल पर --strategy=[some_mnemonic]=worker
का इस्तेमाल किया जाता है, तो किसी भी फ़्लैग की ज़रूरत नहीं होगी. अगर दोनों की वैल्यू सेट की गई हैं, तो supports-workers
के बजाय अन्य फ़्लैग भी ज़रूरी होंगे.supports-multiplex-workers
आप --noworker_multiplex
पास करके, मल्टीप्लेक्स वर्कर को
दुनिया भर में बंद कर सकते हैं.
नियमों का पालन करने की सलाह दी जाती है. अगर मुमकिन हो, तो मल्टीप्लेक्स वर्कर को मेमोरी का दबाव कम करने और परफ़ॉर्मेंस को बेहतर बनाने के लिए भी इस्तेमाल करें. फ़िलहाल, मल्टीप्लेक्स वर्कर डाइनैमिक एक्ज़ीक्यूशन के साथ काम नहीं करते हैं, बशर्ते वे मल्टीप्लेक्स सैंडबॉक्सिंग लागू न करें. बिना डाइनैमिक सैंडबॉक्स वाले मल्टीप्लेक्स को रनिंग एक्ज़ीक्यूट करने की कोशिश करने पर, उसके बजाय सैंडबॉक्स किए गए सिंगलप्लेक्स कर्मियों को शांत तरीके से इस्तेमाल किया जाएगा.
मल्टीप्लेक्स सैंडबॉक्सिंग
मल्टीप्लेक्स वर्कर को वर्कर लागू करने के लिए, सैंडबॉक्स की सुविधा मिल सकती है. सिंगलप्लेक्स वर्कर सैंडबॉक्स, अपने सैंडबॉक्स में हर वर्कर प्रोसेस को चलाकर किया जा सकता है. हालांकि, मल्टीप्लेक्स वर्कर एक साथ कई अनुरोधों के बीच प्रोसेस वर्किंग डायरेक्ट्री शेयर करते हैं. मल्टीप्लेक्स वर्कर को सैंडबॉक्स करने की अनुमति देने के लिए, वर्कर को हर अनुरोध में बताई गई सबडायरेक्ट्री में से पढ़ने और लिखने की अनुमति होनी चाहिए, न कि सीधे तौर पर काम करने वाली डायरेक्ट्री में.
मल्टीप्लेक्स सैंडबॉक्स की सुविधा इस्तेमाल करने के लिए, वर्कर को WorkRequest
से sandbox_dir
फ़ील्ड का इस्तेमाल करना होगा. साथ ही, उसे सभी फ़ाइल पढ़ने और लिखने के लिए प्रीफ़िक्स के तौर पर इस्तेमाल करना होगा.
सैंडबॉक्स न किए गए अनुरोध से, arguments
और inputs
फ़ील्ड में कोई
बदलाव नहीं होता है. हालांकि, असल इनपुट sandbox_dir
के हिसाब से होते हैं. वर्कर को
इन बदलावों वाले पाथ से पढ़ने के लिए, arguments
और inputs
में मिले फ़ाइल पाथ का अनुवाद करना होगा. साथ ही, उन्हें sandbox_dir
से जुड़े सभी आउटपुट भी लिखने होंगे.
इसमें '.' जैसे पाथ शामिल होते हैं. साथ ही, आर्ग्युमेंट में मौजूद फ़ाइलों के पाथ भी शामिल होते हैं (जैसे कि "argfile" आर्ग्युमेंट).
जब कोई वर्कर मल्टीप्लेक्स सैंडबॉक्स के साथ काम करता है, तो नियमों का पालन करने वाली टीम, इस कार्रवाई की जानकारी, supports-multiplex-sandboxing
को किसी कार्रवाई के execution_requirements
में जोड़कर कर सकती है. अगर --experimental_worker_multiplex_sandboxing
फ़्लैग पास हो जाता है या वर्कर को एक्ज़ीक्यूशन के साथ इस्तेमाल किया जाता है, तो Bazel, मल्टीप्लेक्स सैंडबॉक्स का इस्तेमाल करता है.
सैंडबॉक्स वाले मल्टीप्लेक्स वर्कर की वर्कर फ़ाइलें, अब भी वर्कर प्रोसेस की वर्किंग डायरेक्ट्री से जुड़ी होती हैं. इसलिए, अगर किसी फ़ाइल का इस्तेमाल वर्कर और इनपुट के तौर पर दोनों के लिए किया जाता है, तो इसे फ़्लैगफ़ाइल के आर्ग्युमेंट और tools
, executable
या runfiles
, दोनों में डाला जाना चाहिए.