อัปเดต: โปรดทราบว่าคำตอบด้านล่างนี้ใช้กับ 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และanycpucgroup ตามที่อธิบายไว้ในคำถามของฉัน (ตรวจสอบให้แน่ใจว่าcgconfigได้ตั้งค่าให้เรียกใช้ขณะบู๊ต)
กำหนด* cpuset cpu0onlyกฎตามที่อธิบายไว้ในคำถามของฉัน (และตรวจสอบให้แน่ใจว่าcgredได้ตั้งค่าให้เรียกใช้ตอนบู๊ต)
เริ่มกระบวนการใด ๆ ที่ฉันต้องการไม่ จำกัดcgexec -g cpuset:anycpu --sticky myprocessnameด้วย:
กระบวนการเหล่านั้นจะไม่ถูก จำกัด และกระบวนการลูกทั้งหมดของพวกเขาจะถูก จำกัด เช่นกัน ทุกอย่างอื่นในระบบจะถูก จำกัด ที่ CPU 0 (เมื่อคุณรีบูตเนื่องจากcgredไม่ได้ใช้ cgrules กับกระบวนการที่กำลังทำงานอยู่เว้นแต่ว่าพวกเขาจะเปลี่ยน EUID) นี่ไม่แนะนำให้เลือกอย่างสมบูรณ์ แต่นั่นคือสิ่งที่ฉันขอในตอนแรกและสามารถทำได้กับกลุ่ม cg