ใช้ซีพียูแกนเดียวเท่านั้น


9

ฉันต้องการเรียกใช้การทดสอบประสิทธิภาพสำหรับโปรแกรมที่ทำงานพร้อมกันและความต้องการของฉันคือมันควรจะทำงานบนCPU core เพียงแกนเดียวเท่านั้น (ฉันไม่ต้องการเธรดที่ทำงานร่วมกัน - ฉันต้องการเปลี่ยนบริบทเสมอ)

ดังนั้นฉันมีสองคำถาม:

  1. ทางออกที่ดีที่สุด - วิธีลงชื่อและจองซีพียูแกนเดียวเท่านั้นสำหรับโปรแกรมของฉัน (เพื่อบังคับให้ OS ไม่ใช้ CPU core นี้) ฉันเดาว่ามันเป็นไปไม่ได้ แต่บางทีฉันผิด ...

  2. วิธีตั้งค่า linux (Fedora 24) ให้ใช้ CPU core เพียงอันเดียว?



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

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

แล้วการสร้าง VM และกำหนดหนึ่งคอร์ให้กับมันล่ะ? โอ้ฉันเพิ่งอ่าน "ที่จะไม่ใช้ CPU หลักนี้" จึงไม่เคยคิด ...
sakisk

คำตอบ:


26

บน Linux, สายระบบในการตั้งค่าความสัมพันธ์ของ CPU sched_setaffinityสำหรับกระบวนการคือ จากนั้นมีtasksetเครื่องมือสำหรับทำบนบรรทัดคำสั่ง

หากต้องการให้โปรแกรมเดียวทำงานบน CPU เพียงเครื่องเดียวฉันคิดว่าคุณต้องการอะไร

taskset -c 1 ./myprogram

(ตั้งค่าหมายเลข CPU ใด ๆ เป็นอาร์กิวเมนต์เป็น-cสวิตช์)

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

นั้นผมไม่ทราบวิธีการทำอย่างถูกต้อง คุณต้องตั้งค่าความสัมพันธ์ของตัวประมวลผลinitตั้งแต่ต้นในกระบวนการบู๊ตเพื่อให้แน่ใจว่าได้รับการสืบทอดไปยังกระบวนการทั้งหมดในระบบ คุณสามารถใช้taskset -c -p 0 $PIDสำหรับกระบวนการอื่น ๆ ทั้งหมดเพื่อบังคับให้พวกเขาทำงานบน CPU # 0 เท่านั้น

systemd นอกจากนี้ยังมีCPUAffinity=การควบคุมความสัมพันธ์ในแฟ้มหน่วยและมีคู่ของคำถามเกี่ยวกับการตั้งค่าเริ่มต้นความสัมพันธ์ที่นี่ใน unix.SE แต่ฉันไม่พบใด ๆ กับเป็นทางออกที่ดี

แม้ว่า@Kamil Maciorowski แสดงความคิดเห็นและตอบคำถามอื่นใน superuser.comการตั้งค่าisolcpus=1 บนบรรทัดคำสั่งเคอร์เนลควร "แยก CPU นั้นออกจากอัลกอริทึมการตั้งเวลาทั่วไป" ซึ่งเป็นสิ่งที่คุณอาจต้องการ


มันไม่ตอบคำถามเลย ในขณะที่ชุดงาน (หรือวิธีการอื่น ๆ ของการตั้งค่าความสัมพันธ์ของงาน) จะทำให้แน่ใจว่ากระบวนการทำงานเฉพาะในชุดแกนที่ระบุ แต่จะไม่รับประกันว่าเพียงว่ากระบวนการจะทำงานบนแกนเหล่านั้น กล่าวคือระบบปฏิบัติการสามารถกำหนดเวลากระบวนการอื่น ๆ ให้กับแกนประมวลผลที่คุณตั้งค่าความสัมพันธ์ของกระบวนการของคุณเป็น ในทางปฏิบัตินี่เป็นคำตอบที่มีประโยชน์ที่สุด แต่ระวังข้อ จำกัด และโดยเฉพาะให้ระวังว่ามันไม่ได้ให้สิ่งที่คุณขอใน 1) "จองซีพียูแกนเดียวเท่านั้นสำหรับโปรแกรมของฉัน (เพื่อบังคับให้ระบบปฏิบัติการ ไม่ใช้ซีพียูคอร์นี้) "
James Greenhalgh

@JamesGreenhalgh แต่หาวิธีตั้งค่าความสัมพันธ์ของ CPU สำหรับทุกคนกระบวนการจะตอบคำถาม เป็นไปได้ไหมที่จะตั้งค่าความสัมพันธ์ cpu เริ่มต้นสำหรับกระบวนการใหม่เป็นตัวเลือกเคอร์เนล (บรรทัด cmd)? ซึ่งจะมีผลในช่วงต้นของกระบวนการบู๊ตและมีผลกับกระบวนการทั้งหมด
jpaugh

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

@ jpaugh ฉันคิดว่าถึงอย่างนั้นคุณก็ไม่สามารถแยกตัวเองออกจากความเป็นไปได้ของกระบวนการอื่นในการประมวลผลบนแกน "ของคุณ" ตัวอย่างเช่นสิ่งหนึ่งที่รีเซ็ตความสัมพันธ์ของตัวเองหรือแม้แต่รหัสเคอร์เนลเองใช้เวลานานซึ่งไม่เกี่ยวข้องกับการจัดการกระบวนการของคุณ อีกครั้งฉันยอมรับอย่างเต็มที่ว่าในทางปฏิบัติคำตอบนี้เป็นสิ่งที่คนส่วนใหญ่จะทำเพื่อแก้ปัญหาส่วนใหญ่ แต่ฉันสนใจที่จะอ่านคำตอบสำหรับส่วนสุดท้ายในวงเล็บ!
James Greenhalgh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.