วิธีใช้ cgroups เพื่อ จำกัด กระบวนการทั้งหมดยกเว้นรายการที่อนุญาตให้ใช้กับ CPU ตัวเดียว


26

มีคำแนะนำเกี่ยวกับกลุ่ม cg จาก Red Hatซึ่งอาจเป็นประเภทที่มีประโยชน์ (แต่ไม่ตอบคำถามนี้)

ฉันรู้วิธี จำกัด กระบวนการเฉพาะกับ CPU เฉพาะในระหว่างคำสั่งเพื่อเริ่มกระบวนการนั้นโดย:

ก่อนอื่นให้ใส่ * ต่อไปนี้ใน/etc/cgconfig.conf:

mount {
  cpuset =  /cgroup/cpuset;
  cpu =     /cgroup/cpu;
  cpuacct = /cgroup/cpuacct;
  memory =  /cgroup/memory;
  devices = /cgroup/devices;
  freezer = /cgroup/freezer;
  net_cls = /cgroup/net_cls;
  blkio =   /cgroup/blkio;
}

group cpu0only {
  cpuset {
    cpuset.cpus = 0;
    cpuset.mems = 0;
  }
}

จากนั้นเริ่มต้นกระบวนการและกำหนดให้กับกลุ่ม cg โดยเฉพาะโดยใช้

cgexec -g cpuset:cpu0only myprocessname

ฉันสามารถ จำกัด กรณีของชื่อกระบวนการที่เฉพาะเจาะจงโดยอัตโนมัติ (ผมคิดว่านี้ถูกต้อง) วางต่อไปนี้ใน/etc/cgrules.conf:

# user:process  controller  destination
*:myprocessname cpuset      cpu0only

คำถามของฉันคือฉันจะทำสิ่งที่ตรงกันข้ามได้อย่างไร

กล่าวอีกนัยหนึ่งฉันจะกำหนดกระบวนการทั้งหมดยกเว้นชุดของกระบวนการที่อนุญาตพิเศษและลูก ๆ ของพวกเขาไปยังกลุ่ม cgroup ที่ จำกัด


จากสิ่งที่ฉันศึกษา แต่ยังไม่ได้ทดสอบฉันเชื่อว่าวิธีแก้ปัญหาบางส่วนจะเป็น:

เพิ่มกลุ่ม cg "ไม่ จำกัด ":

group anycpu {
  cpuset {
    cpuset.cpus = 0-31;
    cpuset.mems = 0;  # Not sure about this param but it seems to be required
  }
}

กำหนดกระบวนการของฉันอย่างชัดเจนให้กับกลุ่มที่ไม่ จำกัด และทุกอย่างอื่นไปยังกลุ่มที่ถูก จำกัด :

# user:process  controller  destination
*:myprocessname cpuset      anycpu
*               cpuset      cpu0only

อย่างไรก็ตามข้อแม้เกี่ยวกับเรื่องนี้ดูเหมือนว่าจะเป็น (จากการอ่านเอกสารไม่ใช่จากการทดสอบดังนั้นเม็ดเกลือ) ที่ลูกของmyprocessnameจะถูกกำหนดใหม่ให้กลุ่มcpu0onlycgroup ที่จำกัด

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

ฉันจะทำสิ่งนี้ให้สำเร็จด้วย cgroups ได้อย่างไร


หากเป็นไปไม่ได้กับกลุ่ม cg (ซึ่งตอนนี้ฉันสงสัยว่าเป็นจริง) ความคิดของฉันเกี่ยวกับการแก้ปัญหาบางส่วนนั้นถูกต้องและพวกเขาจะทำงานอย่างที่ฉันคิดหรือไม่?

* ข้อจำกัดความรับผิดชอบ: นี่อาจไม่ใช่ตัวอย่างรหัสขั้นต่ำฉันไม่เข้าใจทุกส่วนดังนั้นฉันจึงไม่ทราบว่าไม่จำเป็น

คำตอบ:


30

อัปเดต: โปรดทราบว่าคำตอบด้านล่างนี้ใช้กับ 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


ว้าว. เย็น. สิ่งนี้มี 0 คะแนนอย่างไร
mikeserv

@mikeserv ขอบคุณ :) ตอบคำถามของคุณ: ตรวจสอบวันที่; ฉันเพิ่งเขียนคำตอบนี้เมื่อวาน
สัญลักษณ์แทน

1
ผมเห็นว่า. แต่เมื่อ 24 ชั่วโมงก่อน อาจเป็นสาเหตุของความยาว สิ่งที่ดีบางครั้งก็ถูกมองข้ามเช่นนั้น และอย่างไรก็ตามคำตอบที่มีการโหวตจำนวนมากในไม่ช้าก็เป็นคำตอบที่ดีมาก - ข้อมูลไม่สามารถเป็นประโยชน์ได้ถ้าคนจำนวนมากรู้อยู่แล้ว นี่เป็นหนึ่งในสิ่งที่ดีแม้ว่า กลุ่ม cg friggin ลึกลับ
mikeserv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.