หากงานของคุณเป็นกระบวนการเดียวที่ร้องขอเวลาบน CPU เฉพาะจะไม่มีการสลับบริบทระหว่างงาน :-) แต่ CPU อาจยังคงถูกขัดจังหวะทำให้บริบทเปลี่ยนเป็นเคอร์เนลและย้อนกลับ และสาเหตุหนึ่งที่เป็นไปได้คือตัวจับเวลาล่วงหน้าตรวจสอบว่ามีงานอื่นให้ทำงานบน CPU นี้ ...
ลินุกซ์ สามารถหลีกเลี่ยงการสร้างตัวจับเวลา pre-emption ใด ๆ ขัดจังหวะบน cpu เมื่อไม่มีเหตุผลที่จะทำเช่นนั้น CONFIG_NO_HZ_FULL
ดู ในการใช้คุณสมบัตินี้จะต้องเปิดใช้งานเมื่อสร้างเคอร์เนลและต้องเปิดใช้งานโดยใช้ตัวเลือกการบูต
โดยค่าเริ่มต้นจะไม่มีซีพียูใด ๆ พารามิเตอร์การบูต "nohz_full =" ระบุ CPU ที่ปรับตัวได้ ตัวอย่างเช่น "nohz_full = 1,6-8" กล่าวว่า CPU 1, 6, 7 และ 8 ต้องปรับเปลี่ยน -s ticks CPUs โปรดทราบว่าคุณไม่ได้รับอนุญาตให้ทำเครื่องหมาย CPU ทั้งหมดว่าเป็น CPU ที่ปรับตัวได้ [... ]
LWN.net กล่าวว่า "อ้างอิงจาก Ingo Molnar มากถึง 1% ของเวลา CPU จะถูกบันทึกไว้" สำหรับซีพียูที่ปรับได้ เอกสารเคอร์เนลบอกว่าสิ่งนี้มีค่าใช้จ่ายที่แตกต่างกันหกค่าและยังมีรายการ "ปัญหาที่ทราบ"
อัตราขยายนี้ค่อนข้างเล็กโดยเฉพาะอย่างยิ่งเมื่อเทียบกับอัตราความเร็วของการรับส่งข้อมูลที่อาจเกิดขึ้นจากการลดความถี่ของการสลับบริบทระหว่างหลายงานตามที่อ้างอิงในคำตอบนี้: จะเปลี่ยนความยาวของการแบ่งเวลาตามเวลา
พิมพ์ขนาดเล็ก: การวัดเหล่านี้รองรับ Spectre, Meltdown, KPTI และ x86 ASID ล่วงหน้า :-( และฉันเดาว่าพวกเขายังใช้กับฮาร์ดแวร์ที่ค่อนข้างเก่าด้วยถามผู้เชี่ยวชาญเคอร์เนลหรือทำการวัดด้วยตัวคุณเองว่าค่าใช้จ่ายของสวิทช์บริบทมีเท่าใด เปลี่ยนแปลงในรุ่นเคอร์เนลและฮาร์ดแวร์เฉพาะของคุณ ... PTI ส่วนใหญ่ควรจะถูกบรรเทาโดย ASID ยกเว้นซอฟต์แวร์ที่เรียกใช้เคอร์เนลบ่อยครั้งมากตัวอย่างหลักคือฐานข้อมูล แต่ฉันไม่ค่อยเข้าใจตัวเลข .
ความหวังของ Molnar ในแพทช์ RFC ดั้งเดิมคือเมื่อเวลาผ่านไปมัน "น่าจะถูกเปิดใช้งานโดย distros Linux ส่วนใหญ่" ฉันสังเกตเห็นว่า Fedora 28 ให้เคอร์เนลเริ่มต้นที่สร้างขึ้นด้วยNO_HZ_FULL
การสนับสนุน เดเบียน 9 ไม่ได้อย่างไรก็ตาม
เมื่อเร็ว ๆ นี้ลินุกซ์ v4.17 เอาเหลือ 1 Hz จับเวลาเห็บจากnohz_full
ซีพียู ฉันคิดว่าผลกระทบต่อปริมาณงานมีน้อยมาก :-) แต่ฉันพยายามติดตามสถานะของNO_HZ_FULL
ผลประโยชน์เมื่อมีกระบวนการที่รันได้หลายอย่างบน CPU -
เมื่อเราไปถึง 0 Hz เราสามารถ [แล้ว] ลบการทำเครื่องหมายสัญญาเป็นระยะออกจาก nr_running> = 2 เช่นกันโดยการขัดจังหวะงานที่ยุ่งเป็นหลักเพียงบ่อยเท่าที่ข้อ จำกัด sched_latency ต้องการให้เราทำ - ทุกๆ 4-40 มิลลิวินาทีขึ้นอยู่กับ nr_running .
นี้เป็นบิตสับสนเป็นใบจองเริ่มต้นแล้วใช้แยกกลับเห็บที่แม่นยำยิ่งขึ้นใน v2.6.25-RC1, กระทำ 8f4d37ec073c "sched: res สูงใบจองเห็บ" พบได้ผ่านความคิดเห็นนี้ในบทความ LWN.net เดียวกัน: https://lwn.net/Articles/549754/ )