Taskset ไม่ทำงานในช่วงของคอร์ในไอโซ


13

เพื่อนำหน้าฉันใช้ Debian Wheezy พร้อมเคอร์เนล 3.2 บนชิปเซ็ต AMD64 เครื่องของฉันมีสองแกน Xeon E5-2690 ฉันตั้งค่าพารามิเตอร์การบู๊ตเพื่อให้แกนประมวลผลทั้งหมดใน CPU ตัวเดียวทุ่มเทให้กับกระบวนการเดียว เมื่อต้องการทำสิ่งนี้ฉันได้ตั้ง isolcpus = 8,9,10,11,12,13,14,15 ในด้วง

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

$ tasket -c 8-15 bash -c 'โดยจริง; ทำเสียงสะท้อนสวัสดี> / dev / null; เสร็จแล้ว &

จนถึงตอนนี้ยอดเยี่ยมแสดงให้เห็นว่าคอร์ 8 หมุนถึงการใช้ประโยชน์เกือบ 100% ตอนนี้สมมติว่าฉันเปิดใช้คำสั่งนั้นอีกครั้ง:

$ tasket -c 8-15 bash -c 'โดยจริง; ทำเสียงสะท้อนสวัสดี> / dev / null; เสร็จแล้ว &

ตอนนี้แสดงให้เห็นว่าด้านบนแกน 9-15 ยังคงว่างและทั้งสองกระบวนการแบ่งปันแกน 8 ถ้าฉันทำเช่นนี้:

$ tasket -c 8 bash -c 'โดยจริง; ทำเสียงสะท้อนสวัสดี> / dev / null; เสร็จแล้ว &

$ tasket -c 9 bash -c 'โดยจริง; ทำเสียงสะท้อนสวัสดี> / dev / null; เสร็จแล้ว &

Cores 8 และ 9 แต่ละคนจะได้รับการใช้ประโยชน์ 100% เท่าที่ควร สิ่งนี้ใช้ได้กับไอโซคอร์ปัสเท่านั้นเพราะชุดงานเดียวกันกับแกน 1-7 จะแพร่กระจายกระบวนการอย่างทั่วถึงในแกนที่เกี่ยวข้อง นอกจากนี้ "tasket -p" ยังแสดงให้เห็นว่ามาสก์ความสัมพันธ์สำหรับกระบวนการ 8-15 ถูกตั้งค่าอย่างถูกต้อง ดูเหมือนว่าตัวกำหนดตารางเวลาเคอร์เนลปฏิเสธที่จะใช้สิ่งใดนอกจากแกนกลางที่น้อยที่สุดที่ระบุไว้ในมาสก์ affinity

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

ไม่มีใครมีความคิดใด ๆ ที่จะได้รับตารางเวลาเพื่อให้ฉันมากกว่าหนึ่งแกนจากชุด isolcpu หรือไม่?


ลองใช้โปรแกรมมัลติเธรดหรือไม่? bash ไม่ใช่มัลติเธรด
c4f4t0r

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

อ่านlinuxtopia.org/online_books/linux_kernel/kernel_configuration/นี้สิ่งนี้จะแยกซีพียูออกจากตัวกำหนดเวลาเคอร์เนล แต่หลังจากที่คุณแยกซีพียูที่คุณต้องการเรียกใช้โปรเซสบนซีพียูที่แยกออกมานั้น
c4f4t0r

1
เคอร์เนลจะไม่กำหนดเวลาเธรดหรือกระบวนการบน isolcpu เว้นแต่ว่าตัวพรางความสัมพันธ์ของตัวประมวลผลบ่งชี้ว่าควรใช้ มิฉะนั้นจะเป็นเช่นเดียวกับการแยกคอร์ปิดเมื่อจุดประสงค์คือการสำรองแกนสำหรับเหตุผลที่ผู้ใช้ระบุและตรวจสอบให้แน่ใจว่าไม่มีกระบวนการที่ไม่พึงประสงค์ใช้ Taskset ตั้งค่า affinity mask เพื่อใช้แกนประมวลผลทั้งหมดในช่วง 8-15 (ซึ่งถูกตั้งค่าอย่างถูกต้องเมื่อตรวจสอบใน / proc) ดังนั้นเคอร์เนลควรกำหนดเวลากระบวนการบนแกนว่าง
user79126

คำตอบ:


10

หลังจากวันแห่งความขุ่นมัวฉันได้หาทางแก้ปัญหา พฤติกรรมนี้ดูเหมือนจะเป็นสิ่งประดิษฐ์ของอัลกอริทึมตัวจัดกำหนดการเคอร์เนลเริ่มต้น (SCHED_OTHER สำหรับ distro / kernel นี้) การเปลี่ยนกระบวนการเป็นอัลกอริธึมที่แตกต่างกันจะช่วยขจัดปัญหานี้ได้มีการใช้เชื้อ isolcpus อย่างเพียงพอทั่วทั้งกระบวนการ / เธรด

ฉันลงเอยด้วยการใช้ SCHED_RR แต่ฉันได้ทดสอบ SCHED_FIFO และ SCHED_IDLE ทั้งสองอย่างซึ่งดูเหมือนจะใช้งานได้ กระบวนการสามารถเปิดใช้งานด้วยอัลกอริธึมทางเลือกโดยใช้ยูทิลิตี chrt:

$ sudo chrt -r 1 [คำสั่ง]

(หากคุณต้องการเรียกใช้ในฐานะที่ไม่ใช่รูทคุณสามารถใช้ยูทิลิตี setcap เพื่อเปิดใช้งาน CAP_SYS_NICE ในไฟล์ไบนารีที่เกี่ยวข้องกับคำสั่ง)


1
แม้ว่างานการตั้งค่าความสัมพันธ์กับแกน 0,1 แอปพลิเคชันของฉันจาวาใช้แกนแรกเท่านั้น 'sudo chrt -r 1 [command]' แก้ปัญหาของฉันด้วย
Barry NL
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.