อัปเดต: โปรดทราบว่าคำตอบด้านล่างนี้ใช้กับ RHEL 6 ใน RHEL 7 กลุ่ม cg ส่วนใหญ่ได้รับการจัดการโดย systemd และ libcgroup เลิกใช้แล้ว
ตั้งแต่โพสต์คำถามนี้ผมได้ศึกษาคู่มือทั้งหมดที่ฉันเชื่อมโยงกับข้างต้นเช่นเดียวกับส่วนใหญ่ของcgroups.txtเอกสารและcpusets.txt ตอนนี้ฉันรู้มากกว่าที่ฉันคาดว่าจะได้เรียนรู้เกี่ยวกับกลุ่ม cg ดังนั้นฉันจะตอบคำถามของฉันเองที่นี่
มีหลายวิธีที่คุณสามารถทำได้ การติดต่อ บริษัท ของเราที่ Red Hat (สถาปนิกด้านเทคนิค) แนะนำให้ จำกัด การครอบคลุมของกระบวนการทั้งหมดในการตั้งค่าวิธีการประกาศเพิ่มเติม - จำกัด เฉพาะกระบวนการที่เราต้องการ จำกัด เฉพาะ เหตุผลสำหรับสิ่งนี้ตามคำแถลงของเขาเกี่ยวกับเรื่องนี้ก็คือมันเป็นไปได้ที่การเรียกของระบบจะขึ้นอยู่กับรหัสพื้นที่ผู้ใช้ (เช่นกระบวนการ LVM) ซึ่งหากถูก จำกัด อาจทำให้ระบบช้าลง - ตรงกันข้ามกับผลที่ตั้งใจ ดังนั้นฉันสิ้นสุดการ จำกัด กระบวนการที่มีชื่อเฉพาะจำนวนมาก
นอกจากนี้ฉันต้องการพูดถึงข้อมูลพื้นฐานของ cgroupที่ฉันหายไปเมื่อฉันโพสต์คำถามของฉัน
กลุ่ม Cg ไม่ได้ขึ้นอยู่กับlibcgroup
การติดตั้ง อย่างไรก็ตามนั่นเป็นชุดเครื่องมือสำหรับการจัดการการกำหนดค่า cgroup โดยอัตโนมัติและการกำหนดกระบวนการให้กับกลุ่ม cg และจะมีประโยชน์มาก
ผมพบว่าเครื่องมือ libcgroup นอกจากนี้ยังสามารถทำให้เข้าใจผิดเพราะแพคเกจ libcgroup ถูกสร้างขึ้นในตัวของมันเองชุดของแนวคิดและการตั้งสมมติฐานเกี่ยวกับการใช้งานของ cgroups ซึ่งจะแตกต่างจากการดำเนินงานในระดับเคอร์เนลที่แท้จริงของ cgroups เล็กน้อย (ฉันสามารถใส่ตัวอย่างได้ แต่ต้องใช้เวลาบ้างแสดงความคิดเห็นหากคุณสนใจ)
ดังนั้นก่อนที่จะใช้เครื่องมือ libcgroup (เช่น/etc/cgconfig.conf
, /etc/cgrules.conf
, cgexec
, cgcreate
, cgclassify
ฯลฯ ) ผมขอแนะนำการคุ้นเคยกับ/cgroup
ระบบแฟ้มเสมือนตัวเองและสร้างตนเอง cgroups ลำดับชั้น cgroup (รวมทั้งลำดับชั้นกับระบบย่อยหลายที่แนบมาซึ่ง libcgroup ลอบและบทคัดย่อ leakily ออกไป) กำหนดกระบวนการให้กับกลุ่ม cg ที่แตกต่างกันโดยการวิ่งecho $the_pid > /cgroup/some_cgroup_hierarchy/a_cgroup_within_that_hierarchy/tasks
และงานมหัศจรรย์อื่น ๆ ที่libcgroup
ดำเนินการภายใต้ประทุน
อีกแนวคิดพื้นฐานฉันถูกหายไปก็คือว่าถ้า/cgroup
ระบบแฟ้มเสมือนติดตั้งบนระบบของคุณที่ทุกคน (หรือมากกว่าถูกต้องถ้าใด ๆ ของระบบย่อย cgroup อาคา "ควบคุม" ที่ติดตั้งทั้งหมด) แล้วทุกกระบวนการในระบบทั้งหมดของคุณอยู่ใน cgroup ไม่มีสิ่งเช่น "กระบวนการบางอย่างอยู่ใน cgroup และบางกระบวนการไม่ได้"
มีสิ่งที่เรียกว่าราก cgroup สำหรับลำดับชั้นได้รับซึ่งเป็นเจ้าของทั้งหมดทรัพยากรระบบสำหรับระบบย่อยที่แนบมา ตัวอย่างเช่นลำดับชั้นของ cgroup ที่มีระบบย่อย cpuset และ blkio ติดอยู่จะมีรูท cgroup ซึ่งจะเป็นเจ้าของcpus ทั้งหมดบนระบบและ blkio ทั้งหมดบนระบบและสามารถแบ่งใช้ทรัพยากรเหล่านั้นกับchild cgroup ได้ คุณไม่สามารถ จำกัด รูต cgroup ได้เนื่องจากเป็นเจ้าของทรัพยากรระบบทั้งหมดของคุณดังนั้นการ จำกัด ว่าจะไม่สมเหตุสมผล
ข้อมูลทั่วไปอื่น ๆ ที่ฉันหายไปเกี่ยวกับ libcgroup:
หากคุณใช้/etc/cgconfig.conf
คุณควรตรวจสอบให้แน่ใจว่าchkconfig --list cgconfig
รายการนั้นได้cgconfig
รับการตั้งค่าให้ทำงานเมื่อระบบบูต
หากคุณเปลี่ยน/etc/cgconfig.conf
คุณต้องเรียกใช้service cgconfig restart
เพื่อโหลดในการเปลี่ยนแปลง (และปัญหาเกี่ยวกับการหยุดบริการหรือการทำงานcgclear
เป็นเรื่องธรรมดามากเมื่อหลอกการทดสอบสำหรับการดีบักฉันขอแนะนำเช่นlsof /cgroup/cpuset
ถ้าcpuset
เป็นชื่อของลำดับชั้น cgroup ที่คุณใช้)
หากคุณต้องการที่จะใช้/etc/cgrules.conf
คุณจะต้องให้แน่ใจว่า "เครื่องยนต์กฎ cgroup ภูต" ( cgrulesengd
) กำลังทำงาน: และservice cgred start
chkconfig cgred on
(และคุณควรทราบถึงสภาพการแข่งขันที่เป็นไปได้ แต่ไม่น่าเป็นไปได้เกี่ยวกับบริการนี้ตามที่อธิบายไว้ในคู่มือการจัดการทรัพยากร Red Hatในหัวข้อ 2.8.1 ที่ด้านล่างของหน้า)
หากคุณต้องการหลอกด้วยตนเองและตั้งค่ากลุ่มของคุณโดยใช้ระบบไฟล์เสมือน (ซึ่งฉันแนะนำสำหรับการใช้งานครั้งแรก) คุณสามารถทำเช่นนั้นแล้วสร้างcgconfig.conf
ไฟล์เพื่อสะท้อนการตั้งค่าของคุณโดยใช้cgsnapshot
กับตัวเลือกต่างๆ
และในที่สุดข้อมูลชิ้นสำคัญที่ฉันขาดหายไปเมื่อฉันเขียนข้อความต่อไปนี้:
อย่างไรก็ตามข้อแม้เกี่ยวกับเรื่องนี้ดูเหมือนจะเป็น ... ว่าลูก ๆ ของชื่อกระบวนการของฉันจะถูกกำหนดใหม่ให้กับ cpu0only cgroup
ฉันถูกต้อง แต่มีตัวเลือกที่ฉันไม่ทราบ
cgexec
เป็นคำสั่งให้เริ่มกระบวนการ / เรียกใช้คำสั่งและกำหนดให้กับกลุ่ม cgroup
cgclassify
เป็นคำสั่งในการกำหนดกระบวนการที่กำลังทำงานอยู่ให้ cgroup
ทั้งสองคนนี้ยังจะป้องกันไม่ให้cgred
( cgrulesengd
) จาก reassigning กระบวนการที่ระบุไปยัง cgroup /etc/cgrules.conf
ที่แตกต่างกันขึ้นอยู่กับ
ทั้งสองcgexec
และcgclassify
สนับสนุน--sticky
ธงซึ่งนอกจากนี้ยังช่วยป้องกันcgred
จาก reassigning เด็ก/etc/cgrules.conf
กระบวนการขึ้นอยู่กับ
ดังนั้นคำตอบของคำถามตามที่ฉันเขียนไว้ (แม้ว่าจะไม่ใช่การตั้งค่าที่ฉันได้ลงมือปฏิบัติเนื่องจากคำแนะนำจากสถาปนิกด้านเทคนิคของ Red Hat ที่กล่าวถึงข้างต้น) คือ:
สร้างcpu0only
และanycpu
cgroup ตามที่อธิบายไว้ในคำถามของฉัน (ตรวจสอบให้แน่ใจว่าcgconfig
ได้ตั้งค่าให้เรียกใช้ขณะบู๊ต)
กำหนด* cpuset cpu0only
กฎตามที่อธิบายไว้ในคำถามของฉัน (และตรวจสอบให้แน่ใจว่าcgred
ได้ตั้งค่าให้เรียกใช้ตอนบู๊ต)
เริ่มกระบวนการใด ๆ ที่ฉันต้องการไม่ จำกัดcgexec -g cpuset:anycpu --sticky myprocessname
ด้วย:
กระบวนการเหล่านั้นจะไม่ถูก จำกัด และกระบวนการลูกทั้งหมดของพวกเขาจะถูก จำกัด เช่นกัน ทุกอย่างอื่นในระบบจะถูก จำกัด ที่ CPU 0 (เมื่อคุณรีบูตเนื่องจากcgred
ไม่ได้ใช้ cgrules กับกระบวนการที่กำลังทำงานอยู่เว้นแต่ว่าพวกเขาจะเปลี่ยน EUID) นี่ไม่แนะนำให้เลือกอย่างสมบูรณ์ แต่นั่นคือสิ่งที่ฉันขอในตอนแรกและสามารถทำได้กับกลุ่ม cg