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

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.0 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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

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

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

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

หากระบบระยะไกลมีแคช Flag --local_execution_delay จะเพิ่มการหน่วงเวลาเป็นมิลลิวินาทีในการเรียกใช้แบบภายในหลังจากที่ระบบระยะไกลระบุว่าพบข้อมูลในแคช วิธีนี้จะช่วยหลีกเลี่ยงการเรียกใช้ในเครื่องเมื่อมีโอกาสที่ระบบจะพบรายการที่ตรงกันในแคชมากขึ้น ค่าเริ่มต้นคือ 1000ms แต่ควรปรับให้นานกว่าเวลาในการ Hit แคชปกติเพียงเล็กน้อย เวลาจริงจะขึ้นอยู่กับทั้งระบบระยะไกลและระยะเวลาในการรับส่งข้อมูล โดยปกติแล้ว ค่านี้จะเหมือนกันสำหรับผู้ใช้ทั้งหมดของระบบระยะไกลหนึ่งๆ เว้นแต่ว่าผู้ใช้บางรายอยู่ไกลพอที่จะเพิ่มเวลาในการตอบสนองในการรับส่งข้อมูล คุณสามารถใช้ฟีเจอร์การโปรไฟล์ของ Bazel เพื่อดูระยะเวลาที่การตีข้อมูลแคชตามปกติใช้เวลา

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

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

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

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

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

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

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

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

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

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

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

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

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

การแก้ปัญหา

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

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