การดำเนินการแบบไดนามิก

การดำเนินการแบบไดนามิกเป็นฟีเจอร์ใน Bazel ตั้งแต่เวอร์ชัน 0.21 ซึ่งจะเริ่มการดำเนินการในเครื่องและระยะไกลของการดำเนินการเดียวกันแบบขนาน โดยใช้เอาต์พุตจากกิ่งแรกที่เสร็จสมบูรณ์และยกเลิกกิ่งอื่น โดยจะรวมความสามารถในการดำเนินการและ/หรือแคชที่แชร์ขนาดใหญ่ของระบบบิลด์ระยะไกลเข้ากับเวลาในการตอบสนองที่ต่ำของการดำเนินการในเครื่อง เพื่อให้ได้สิ่งที่ดีที่สุดจากทั้ง 2 อย่างสำหรับการบิลด์ที่สะอาดและแบบเพิ่มทีละรายการ

หน้านี้จะอธิบายวิธีเปิดใช้ ปรับแต่ง และแก้ไขข้อบกพร่องของการดำเนินการแบบไดนามิก หากคุณตั้งค่าการดำเนินการทั้งในเครื่องและระยะไกล และพยายามปรับการตั้งค่า Bazel เพื่อประสิทธิภาพที่ดีขึ้น หน้านี้เหมาะสำหรับคุณ หากยังไม่ได้ตั้งค่าการดำเนินการจากระยะไกล ให้ไปที่ภาพรวมการดำเนินการจากระยะไกลของ Bazel ก่อน

เปิดใช้การดำเนินการแบบไดนามิกไหม

โมดูลการดำเนินการแบบไดนามิกเป็นส่วนหนึ่งของ Bazel แต่หากต้องการใช้การดำเนินการแบบไดนามิก คุณต้องคอมไพล์ทั้งในเครื่องและจากระยะไกลจากการตั้งค่า Bazel เดียวกันได้อยู่แล้ว

หากต้องการเปิดใช้โมดูลการดำเนินการแบบไดนามิก ให้ส่งแฟล็ก --internal_spawn_scheduler ไปยัง Bazel ซึ่งจะเพิ่มกลยุทธ์การดำเนินการใหม่ที่เรียกว่า dynamic ตอนนี้คุณสามารถ ใช้เป็นกลยุทธ์สำหรับมνηนิกส์ที่ต้องการเรียกใช้แบบไดนามิกได้แล้ว เช่น --strategy=Javac=dynamic ดูวิธีเลือกคำช่วยจำ ที่จะเปิดใช้การดำเนินการแบบไดนามิกได้ในส่วนถัดไป

สำหรับตัวช่วยจำที่ใช้กลยุทธ์แบบไดนามิก กลยุทธ์การดำเนินการระยะไกลจะมาจากแฟล็ก --dynamic_remote_strategy และกลยุทธ์ในเครื่องจะมาจากแฟล็ก --dynamic_local_strategy การส่ง --dynamic_local_strategy=worker,sandboxed จะตั้งค่าเริ่มต้นสำหรับสาขาในเครื่องของการดำเนินการแบบไดนามิกเพื่อลองใช้กับ Worker หรือการดำเนินการแบบแซนด์บ็อกซ์ตามลำดับ การส่ง --dynamic_local_strategy=Javac=worker จะลบล้างค่าเริ่มต้นสำหรับ ตัวย่อของ Javac เท่านั้น โดยเวอร์ชันระยะไกลจะทำงานในลักษณะเดียวกัน คุณระบุทั้ง 2 แฟล็กได้หลายครั้ง หากดำเนินการในเครื่องไม่ได้ ระบบจะดำเนินการจากระยะไกลตามปกติ และในทางกลับกัน

หากระบบระยะไกลมีแคช แฟล็ก --local_execution_delay จะเพิ่มการหน่วงเวลาเป็นมิลลิวินาทีในการดำเนินการในเครื่องหลังจากที่ระบบระยะไกล ระบุว่าแคชตรงกัน ซึ่งจะช่วยหลีกเลี่ยงการเรียกใช้การดำเนินการในเครื่องเมื่อมีโอกาสที่จะแคชฮิตมากขึ้น ค่าเริ่มต้นคือ 1, 000 มิลลิวินาที แต่ควรปรับให้ยาวกว่าเวลาที่แคชฮิตใช้เล็กน้อย เวลาจริงจะขึ้นอยู่กับทั้งระบบระยะไกลและระยะเวลาที่ใช้ในการรับส่งข้อมูล โดยปกติ ค่านี้จะเหมือนกันสำหรับผู้ใช้ทั้งหมดของระบบระยะไกลที่กำหนด เว้นแต่ผู้ใช้บางรายจะอยู่ไกลพอที่จะเพิ่มเวลาในการตอบสนองแบบไปกลับ คุณสามารถใช้ ฟีเจอร์การสร้างโปรไฟล์ Bazel เพื่อดูระยะเวลาที่แคชทั่วไปใช้

การดำเนินการแบบไดนามิกสามารถใช้กับกลยุทธ์แซนด์บ็อกซ์ในเครื่องและWorker แบบถาวรได้ ผู้ปฏิบัติงานแบบถาวรจะทำงานโดยอัตโนมัติด้วยแซนด์บ็อกซ์เมื่อใช้กับการดำเนินการแบบไดนามิก และใช้ผู้ปฏิบัติงานแบบมัลติเพล็กซ์ไม่ได้ ในระบบ Darwin และ Windows กลยุทธ์แบบแซนด์บ็อกซ์อาจทำงานช้า คุณสามารถส่ง--reuse_sandbox_directoriesเพื่อลดค่าใช้จ่ายในการสร้างแซนด์บ็อกซ์ในระบบเหล่านี้ได้

การดำเนินการแบบไดนามิกยังสามารถเรียกใช้กับstandaloneได้ด้วย แม้ว่าstandaloneจะต้องล็อกเอาต์พุตเมื่อเริ่มดำเนินการ ซึ่งจะบล็อกไม่ให้กลยุทธ์ระยะไกลเสร็จสิ้นก่อน แฟล็ก --experimental_local_lockfree_outputช่วยแก้ปัญหานี้ได้โดย อนุญาตให้การดำเนินการในเครื่องเขียนไปยังเอาต์พุตได้โดยตรง แต่การดำเนินการระยะไกลจะยกเลิก หากการดำเนินการระยะไกลเสร็จก่อน

หากสาขาใดสาขาหนึ่งของการดำเนินการแบบไดนามิกเสร็จสิ้นก่อน แต่ไม่สำเร็จ การดำเนินการทั้งหมดจะไม่สำเร็จ เราตั้งใจเลือกใช้การดำเนินการนี้เพื่อป้องกันไม่ให้เกิดความแตกต่าง ระหว่างการดำเนินการในเครื่องและการดำเนินการจากระยะไกลโดยที่คุณไม่สังเกต

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของการดำเนินการแบบไดนามิกและการล็อกได้ในบล็อกโพสต์ที่ยอดเยี่ยมของ Julio Merino

ฉันควรใช้การดำเนินการแบบไดนามิกเมื่อใด

การดำเนินการแบบไดนามิกต้องใช้ระบบการดำเนินการระยะไกลรูปแบบใดรูปแบบหนึ่ง ปัจจุบันยังไม่สามารถใช้ระบบระยะไกลที่แคชเท่านั้นได้ เนื่องจากระบบจะถือว่าการไม่พบแคชเป็น การดำเนินการที่ไม่สำเร็จ

การดำเนินการบางประเภทอาจไม่เหมาะกับการดำเนินการจากระยะไกล ตัวเลือกที่ดีที่สุดคือตัวเลือกที่ทำงานได้เร็วกว่าในเครื่อง เช่น ผ่านการใช้Worker แบบถาวร หรือตัวเลือกที่ทำงานได้เร็วพอที่ค่าใช้จ่ายในการดำเนินการจากระยะไกลจะครอบงำเวลาในการดำเนินการ เนื่องจากการดำเนินการที่ดำเนินการในเครื่องแต่ละรายการจะล็อกทรัพยากร CPU และหน่วยความจำจำนวนหนึ่ง การเรียกใช้การดำเนินการที่ไม่ได้อยู่ในหมวดหมู่เหล่านั้นจะเพียงทำให้การดำเนินการสำหรับหมวดหมู่ที่อยู่ในหมวดหมู่เหล่านั้นล่าช้า

ตั้งแต่รีลีส 5.0.0-pre.20210708.4 การสร้างโปรไฟล์ประสิทธิภาพ จะมีข้อมูลเกี่ยวกับการดำเนินการของ Worker รวมถึงเวลาที่ใช้ในการทำงาน หลังจากแพ้การแข่งขันการดำเนินการแบบไดนามิก หากเห็นว่าเธรดของ Worker ที่มีการดำเนินการแบบไดนามิกใช้เวลามากในการรับทรัพยากร หรือใช้เวลามากใน async-worker-finish คุณอาจมีการกระทําเกี่ยวกับสถานที่ที่ช้าซึ่งทำให้เธรดของ Worker ทำงานช้าลง

การสร้างโปรไฟล์ข้อมูลที่มีประสิทธิภาพการดำเนินการแบบไดนามิกต่ำ

ในโปรไฟล์ด้านบนซึ่งใช้ Worker ของ Javac 8 ราย เราเห็น Worker ของ Javac จำนวนมาก ที่แพ้การแข่งขันและทำงานเสร็จในasync-worker-finish เธรด ปัญหานี้เกิดจากมnemonic ที่ไม่ใช่ Worker ใช้ทรัพยากรมากพอที่จะ ทำให้ Worker ทำงานช้าลง

การสร้างโปรไฟล์ข้อมูลที่มีประสิทธิภาพการดำเนินการแบบไดนามิกที่ดีขึ้น

เมื่อเรียกใช้ Javac เท่านั้นด้วยการดำเนินการแบบไดนามิก มีเพียงครึ่งหนึ่งของ Worker ที่เริ่มต้น เท่านั้นที่แพ้การแข่งขันหลังจากเริ่มงาน

ระบบเลิกใช้งานฟีเจอร์--experimental_spawn_schedulerที่แนะนำก่อนหน้านี้แล้ว ซึ่งจะเปิดการดำเนินการแบบไดนามิกและตั้งค่า dynamic เป็นกลยุทธ์เริ่มต้นสำหรับ นิโมนิกทั้งหมด ซึ่งมักจะทำให้เกิดปัญหาในลักษณะนี้

การแก้ปัญหา

ปัญหาเกี่ยวกับการดำเนินการแบบไดนามิกอาจเกิดขึ้นได้โดยไม่ทันสังเกตและแก้ไขข้อบกพร่องได้ยาก เนื่องจากปัญหาอาจ เกิดขึ้นเฉพาะในบางชุดค่าผสมของการดำเนินการในเครื่องและการดำเนินการจากระยะไกล --debug_spawn_scheduler จะเพิ่มเอาต์พุตจากระบบการดำเนินการแบบไดนามิก ซึ่งช่วยในการแก้ไขข้อบกพร่องของปัญหาเหล่านี้ นอกจากนี้ คุณยังปรับ --local_execution_delay แฟล็กและจำนวนงานระยะไกลเทียบกับงานในพื้นที่ เพื่อให้จำลองปัญหาได้ง่ายขึ้นด้วย

หากพบปัญหาเกี่ยวกับการดำเนินการแบบไดนามิกโดยใช้standalone กลยุทธ์ ให้ลองเรียกใช้โดยไม่มี--experimental_local_lockfree_output หรือเรียกใช้ การกระทำเกี่ยวกับสถานที่ในแซนด์บ็อกซ์ ซึ่งอาจทำให้การสร้างช้าลงเล็กน้อย (ดูด้านบนหากคุณใช้ Mac หรือ Windows) แต่จะช่วยขจัดสาเหตุบางอย่างที่อาจทำให้เกิดข้อผิดพลาด