การดำเนินการแบบไดนามิกเป็นฟีเจอร์ใน 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) แต่นำสาเหตุที่อาจทำให้เกิดความล้มเหลวออก