การดำเนินการแบบไดนามิกเป็นฟีเจอร์ใน Bazel ตั้งแต่เวอร์ชัน 0.21 โดยที่การดำเนินการในเครื่องและระยะไกลของการดำเนินการเดียวกันจะเริ่มต้นพร้อมกัน โดยใช้เอาต์พุตจาก Branch แรกที่เสร็จสิ้นแล้วและยกเลิก Branch อื่น โดยจะรวมความสามารถในการดำเนินการและ/หรือแคชที่ใช้ร่วมกันขนาดใหญ่ของระบบบิลด์ระยะไกลกับเวลาในการตอบสนองที่ต่ำของการดำเนินการภายใน ซึ่งให้ประโยชน์สูงสุดจากทั้ง 2 โลกเพื่อการสร้างบิลด์ที่สะอาดและเพิ่มขึ้น
หน้านี้จะอธิบายวิธีเปิดใช้ ปรับแต่ง และแก้ไขข้อบกพร่องของการดำเนินการแบบไดนามิก หากคุณตั้งค่าการดำเนินการทั้งในเครื่องและระยะไกลและพยายามปรับการตั้งค่า Bazel เพื่อประสิทธิภาพที่ดีขึ้น หน้านี้มีไว้สำหรับคุณ หากยังไม่ได้ตั้งค่าการดำเนินการระยะไกล ให้ไปที่ภาพรวมการดำเนินการระยะไกลของ Bazel ก่อน
กำลังเปิดใช้การดำเนินการแบบไดนามิกใช่ไหม
โมดูลการดำเนินการแบบไดนามิกเป็นส่วนหนึ่งของ Bazel แต่ในการใช้ประโยชน์จากการดำเนินการแบบไดนามิก คุณต้องคอมไพล์ทั้งในเครื่องและระยะไกลได้จากการตั้งค่า Bazel เดียวกันอยู่แล้ว
หากต้องการเปิดใช้โมดูลการดำเนินการแบบไดนามิก ให้ส่งแฟล็ก --internal_spawn_scheduler
ไปยัง Bazel การดำเนินการนี้จะเพิ่มกลยุทธ์การดำเนินการใหม่ที่ชื่อว่า dynamic
ตอนนี้คุณใช้ตัวแปรนี้เป็นกลยุทธ์สําหรับการช่วยจำที่ต้องการเรียกใช้แบบไดนามิก เช่น --strategy=Javac=dynamic
ได้แล้ว โปรดดูส่วนถัดไปสำหรับวิธีเลือกความทรงจำที่จะเปิดใช้การดำเนินการแบบไดนามิก
สำหรับการช่วยจำที่ใช้กลยุทธ์แบบไดนามิก ระบบจะนำกลยุทธ์การดำเนินการระยะไกลมาจากแฟล็ก --dynamic_remote_strategy
และกลยุทธ์ในพื้นที่จากแฟล็ก --dynamic_local_strategy
การส่ง --dynamic_local_strategy=worker,sandboxed
จะกำหนดค่าเริ่มต้นสำหรับสาขาการดำเนินการแบบไดนามิกในท้องถิ่นเพื่อลองใช้กับผู้ปฏิบัติงานหรือการดำเนินการแบบแซนด์บ็อกซ์ตามลำดับนั้น การส่งผ่าน --dynamic_local_strategy=Javac=worker
จะลบล้างค่าเริ่มต้นของระบบช่วยจำ Javac เท่านั้น เวอร์ชันรีโมตจะทำงานในลักษณะเดียวกัน คุณสามารถระบุแฟล็กทั้งสองได้
หลายครั้ง หากดำเนินการภายในเครื่องไม่ได้ การทำงานก็จะทำงานจากระยะไกลตามปกติ หรือในทางกลับกัน
หากระบบระยะไกลมีแคช การตั้งค่าสถานะ --local_execution_delay
จะเพิ่มการหน่วงเวลาให้กับการดำเนินการภายในเครื่องเป็นมิลลิวินาทีหลังจากที่ระบบระยะไกลระบุว่าพบแคช การดำเนินการนี้จะหลีกเลี่ยงการเรียกใช้การดำเนินการในเครื่องเมื่อมีแนวโน้มที่จะพบแคชมากกว่า ค่าเริ่มต้นคือ 1, 000 มิลลิวินาที แต่ควรปรับให้นานกว่าการเข้าชมแคชตามปกติเล็กน้อย เวลาจริงขึ้นอยู่กับระบบระยะไกลและระยะเวลาเดินทางไป-กลับ โดยปกติแล้ว ค่าสำหรับผู้ใช้ทั้งหมดของระบบระยะไกลหนึ่งๆ จะเหมือนกัน เว้นแต่ผู้ใช้บางรายจะอยู่ไกลพอที่จะเพิ่มเวลาในการตอบสนองแบบไป-กลับ คุณใช้ฟีเจอร์การสร้างโปรไฟล์แบบ Bazel เพื่อดูระยะเวลาที่ Hit ของแคชโดยทั่วไปใช้เวลาได้
การดำเนินการแบบไดนามิกใช้ได้กับกลยุทธ์ที่แซนด์บ็อกซ์ในเครื่องและผู้ปฏิบัติงานอย่างต่อเนื่อง ผู้ปฏิบัติงานถาวรจะทำงานด้วยแซนด์บ็อกซ์โดยอัตโนมัติเมื่อใช้ร่วมกับการดำเนินการแบบไดนามิก และจะใช้ผู้ปฏิบัติงาน Multiplex ไม่ได้ กลยุทธ์แซนด์บ็อกซ์ในระบบดาร์วินและ Windows อาจทำงานช้า คุณส่ง --reuse_sandbox_directories
เพื่อลดค่าใช้จ่ายในการสร้างแซนด์บ็อกซ์ในระบบเหล่านี้ได้
การดำเนินการแบบไดนามิกยังเรียกใช้ได้ด้วยกลยุทธ์ standalone
ด้วย เนื่องจากกลยุทธ์ standalone
ต้องมีการล็อกเอาต์พุตเมื่อเริ่มดำเนินการ จึงจะบล็อกกลยุทธ์ระยะไกลไม่ให้เสร็จสิ้นก่อนได้อย่างมีประสิทธิภาพ แฟล็ก --experimental_local_lockfree_output
ช่วยแก้ปัญหานี้โดยการอนุญาตให้การดำเนินการในเครื่องเขียนไปยังเอาต์พุตโดยตรง แต่ควรยกเลิกโดยการดำเนินการระยะไกลหากการดำเนินการดังกล่าวเสร็จสิ้นก่อน
หากสาขาหนึ่งของการดำเนินการแบบไดนามิกดำเนินการเสร็จสิ้นก่อน แต่ไม่สำเร็จ การดำเนินการทั้งหมดจะไม่สำเร็จ นี่เป็นทางเลือกที่มีเจตนาป้องกันไม่ให้เกิดความแตกต่างระหว่างการดำเนินการภายในกับระยะไกล
หากต้องการทราบข้อมูลพื้นฐานเพิ่มเติมเกี่ยวกับวิธีการทำงานของการดำเนินการแบบไดนามิกและการล็อก โปรดดูบล็อกโพสต์ที่ยอดเยี่ยมของ Julio Merino
ฉันควรใช้การดำเนินการแบบไดนามิกเมื่อใด
การดำเนินการแบบไดนามิกต้องใช้ระบบการดำเนินการระยะไกลบางรูปแบบ ปัจจุบันยังใช้ระบบระยะไกลแบบแคชเท่านั้นไม่ได้ เนื่องจากการไม่พบแคชจะถือว่าเป็นการทำงานที่ล้มเหลว
การดำเนินการบางประเภทอาจไม่เหมาะสำหรับการดำเนินการจากระยะไกล ตัวเลือกที่ดีที่สุดคือ ผู้ที่ทำงานได้รวดเร็วในพื้นที่ เช่น ผ่านการใช้ผู้ปฏิบัติงานถาวร หรือที่ทำงานเร็วพอที่โอเวอร์เฮ็ดของการดำเนินการระยะไกลจะใช้เวลามากกว่าในการดำเนินการ เนื่องจากการดำเนินการแต่ละรายการที่ทำในเครื่องจะล็อกทรัพยากร CPU และหน่วยความจำบางส่วน การดำเนินการที่ไม่อยู่ในหมวดหมู่ดังกล่าวจึงเป็นความล่าช้าในการดำเนินการสำหรับการดำเนินการที่ทำไม่ได้
ตั้งแต่รุ่น 5.0.0-pre.20210708.4 การสร้างโปรไฟล์ประสิทธิภาพมีข้อมูลเกี่ยวกับการดำเนินการของผู้ปฏิบัติงาน รวมถึงเวลาที่ใช้ในการทำตามคำของานหลังจากแพ้การแข่งขันการดำเนินการแบบไดนามิก หากเทรดของผู้ปฏิบัติงานการดำเนินการแบบไดนามิกใช้เวลาอย่างมากในการรับทรัพยากร หรือใช้เวลามากใน async-worker-finish
อาจเป็นเพราะการดำเนินการในเครื่องที่ช้าทำให้ชุดข้อความของผู้ปฏิบัติงานล่าช้า
ในโปรไฟล์ด้านบน ซึ่งใช้ผู้ปฏิบัติงาน Javac 8 คน เราพบว่าผู้ปฏิบัติงาน Javac จำนวนมากแพ้การแข่งและทำงานในชุดข้อความ async-worker-finish
ให้เสร็จสิ้น ปัญหานี้เกิดจากการช่วยจำการทำงานของผู้ปฏิบัติงานซึ่งอาศัยทรัพยากรจำนวนมากจนทำให้ผู้ปฏิบัติงานล่าช้า
เมื่อเรียกใช้ Javac โดยใช้การดำเนินการแบบไดนามิกเท่านั้น จะมีเพียงประมาณครึ่งหนึ่งของผู้ปฏิบัติงานที่เริ่มต้นแพ้ที่แข่งหลังจากที่เริ่มทำงาน
เราเลิกใช้งานแฟล็ก --experimental_spawn_scheduler
ที่แนะนำก่อนหน้านี้แล้ว
โดยจะเปิดการดำเนินการแบบไดนามิกและกำหนดให้ dynamic
เป็นกลยุทธ์เริ่มต้นสำหรับการช่วยจำทั้งหมด ซึ่งมักจะทำให้เกิดปัญหาประเภทนี้
การแก้ปัญหา
ปัญหาในการดำเนินการกับแบบไดนามิกนั้นอาจมีความซับซ้อนและแก้ไขข้อบกพร่องยาก เนื่องจากปัญหาเกิดขึ้นได้ภายใต้ชุดค่าผสมบางอย่างระหว่างการดำเนินการในเครื่องและระยะไกลเท่านั้น
--debug_spawn_scheduler
จะเพิ่มเอาต์พุตจากระบบการดำเนินการแบบไดนามิกที่จะช่วยแก้ปัญหาเหล่านี้ได้ นอกจากนี้ คุณยังปรับแฟล็ก --local_execution_delay
และจำนวนงานระยะไกลเทียบกับงานภายในเพื่อให้ทำให้เกิดปัญหาซ้ำได้ง่ายขึ้นด้วย
หากพบปัญหาเกี่ยวกับการดำเนินการแบบไดนามิกโดยใช้กลยุทธ์ standalone
ให้ลองเรียกใช้โดยไม่ใช้ --experimental_local_lockfree_output
หรือเรียกใช้การดำเนินการในเครื่องโดยใช้แซนด์บ็อกซ์ ซึ่งอาจทำให้บิลด์ของคุณช้าลงเล็กน้อย (ดูด้านบนหากคุณใช้ Mac หรือ Windows) แต่จะนำสาเหตุที่เป็นไปได้บางอย่างที่ทำให้การทำงานล้มเหลวออก