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

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

การแก้ปัญหา

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

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