ผู้ดูแลระบบคนอื่น ๆ จัดการทรัพยากรของ CPU บนโฮสต์หลายคอร์ที่ใช้งานคุกได้อย่างไรเช่นการจัดสรรจำนวนคอร์ที่เหมาะสมสำหรับการใช้งานแบบเอกสิทธิ์เฉพาะโดยคุกเฉพาะและการจองจำนวนคอร์ที่เหมาะสมสำหรับการใช้งานพิเศษโดยระบบโฮสต์
TL; DR
ฉันเรียนรู้วิธีการจัดการโดยใช้ซีพียูrctl(8)
, /etc/rctl.conf
, cpuset(1)
และเครื่องมือที่เกี่ยวข้อง
ในการออกกำลังกายฉันกำลังทำงานกับระบบ 8-core ฉันต้องการอุทิศ CPUs 0-3 สำหรับการใช้งานโดยกระบวนการของระบบโฮสต์เท่านั้นและทำให้ CPUs 4-7 พร้อมใช้งานสำหรับกระบวนการที่ถูกจำคุกเพียงอย่างเดียว
ฉันกำลังเผชิญหน้ากับปัญหาพื้นฐานสองประการในภูมิทัศน์จิตของปัญหานี้ อย่างแรกคือเนื่องจากcpuset
สามารถใช้ CPU mask เฉพาะกับเป้าหมายที่มีอยู่ (กระบวนการ, คุก, อะไรก็ตาม), ปัจจุบันฉันต้องเริ่มต้นคุกก่อนและจากนั้น จำกัด ชุด CPU ของมัน ซึ่งหมายความว่ากระบวนการที่ถูกจำคุกซึ่งวางไข่ก่อนสร้างcpuset
ข้อ จำกัด จะทำงานนอกชุด CPU หากกระบวนการที่ถูกจำคุกนั้นยาวนานกระบวนการเหล่านั้นจะต้องเริ่มต้นใหม่หลังจากที่cpuset
ถูกเรียกใช้เพื่อให้แน่ใจว่าคุกนั้นอยู่ภายในข้อ จำกัด
ประการที่สองด้วยเหตุผลที่คล้ายกันเป็น # 1 มันไม่ชัดเจนสำหรับฉันที่จะได้รับระบบโฮสต์เพื่อ จำกัด การใช้งาน CPU ของตัวเองเพื่อที่จะไม่ใช้ CPU ใด ๆ อีกครั้งเนื่องจากข้อ จำกัด ของชุด CPU จะต้องมีการสร้างขึ้นก่อนที่กระบวนการจะเกิดขึ้นดูเหมือนว่าinit(8)
ตัวเองจะต้องเปิดตัวด้วยชุด CPU ที่ถูก จำกัด ฉันไม่พบกลไกใด ๆ ที่จะทำสิ่งนี้
เพื่อแก้ปัญหาแรกที่สามารถเริ่มต้นคุกด้วยcpuset
ข้อ จำกัดได้ทันทีไวยากรณ์นี้ไม่ทำงานใน/etc/jail.conf
:
path = "/jail/$name";
test {
jid = 42;
# This is the default value before tweaking:
# exec.start = "/bin/sh /etc/rc";
# restrict this jail to CPU7 only:
exec.start = "/usr/bin/cpuset -c -l 7 /bin/sh /etc/rc";
host.hostname = "test";
ip4.addr = "public|10.160.161.162";
mount.devfs = true;
allow.raw_sockets = true;
allow.sysvipc = true;
}
แนวทางที่ไม่สำเร็จอีกวิธีหนึ่งคือการคืนค่าเริ่มต้นexec.start
และเริ่มต้นคุกด้วย
# cpuset -c -l 7 service jail start test
เกี่ยวกับปัญหาที่สองคือการ จำกัด ระบบโฮสต์เพื่อป้องกันกระบวนการที่ไม่ถูกจำคุก (jail id = 0) จากการใช้ CPU ที่สงวนไว้สำหรับกระบวนการที่ถูกจำคุก (รหัสคุกของ> 0 ฉันไม่แน่ใจว่าจะเริ่มต้นที่ไหน ดูเหมือนว่าจะมีการ จำกัดinit(8)
ตั้งแต่เริ่มแรกดังนั้นกระบวนการใดก็ตามที่เกิดขึ้นจะสืบทอดข้อ จำกัด ของ CPU เดียวกันแฮ็คที่สง่างามน้อยกว่าอาจใช้rctl.conf
เพื่อสร้างข้อ จำกัด ของ CPU ตามคลาสล็อกอินเฉพาะและกำหนดผู้ใช้ทั้งหมดให้ คลาสล็อกอินดูเหมือนว่าจะยังไม่สามารถ จำกัด daemons ของระบบที่เปิดใช้init
ก่อนที่จะrctl
เริ่มต้นดูไร้เดียงสาrcorder(8)
แสดงให้เห็นว่า rctl ทำงานค่อนข้างช้าในกระบวนการเริ่มทำงาน rc ที่ 127 จาก 166 ในระบบของฉัน:
# cd /etc/rc.d
# rcorder * | grep -xn rctl
127:rctl
# rcorder * | wc -l
166
แนวทางและแนวทางปฏิบัติที่ดีที่สุดที่ได้รับการพัฒนาเพื่อแก้ไขปัญหาประเภทนี้คืออะไร ตอนนี้ฉันกำลังอ่านการสนทนาประวัติศาสตร์จาก 2014เกี่ยวกับปัญหาของการเริ่มต้นinit(8)
ด้วย cpuset ที่เฉพาะเจาะจง น่าเสียดายที่โปรแกรมปะแก้ที่เสนอโดย OP ของเธรดนั้นไม่สามารถเข้าถึงได้อีกต่อไป