ใช้ cgroup เพื่อ จำกัด การใช้หน่วยความจำของ virtualbox


9

ฉันกำลังพยายามใช้cgroup(กลุ่มควบคุม) เพื่อ จำกัด การใช้งานหน่วยความจำของ Virtualbox แต่ดูเหมือนจะไม่ทำงาน

เครื่องของฉันคือ:

$ uname -a
Linux fc.bgi 2.6.40-4.fc15.i686 #1 SMP Fri Jul 29 18:54:39 UTC 2011 i686 i686 i386 GNU/Linux

ฉันพยายามทำให้มันเป็นเช่นนี้:

  1. การสร้างกลุ่มใหม่ภายใต้ลำดับชั้นของหน่วยความจำ:

    $ cgcreate -g memory:vbox
    
  2. การตั้งค่า memory.limit_in_bytes สำหรับ vbox:

    $ cgset -r memory.limit_in_bytes=512M vbox
    
  3. การจัดกลุ่ม vbox ที่รัน pid เป็น vbox:

    $ cgclassify -g memory:vbox 20015
    

บางคนสามารถอธิบายได้ว่าทำไมสิ่งนี้ถึงไม่ทำงาน

คำตอบ:


3

คุณสามารถ จำกัด หน่วยความจำ usege ด้วย /etc/security/limits.conf ในไฟล์นี้ที่คุณใส่:

domain type item value

โดยที่ the domainคือ@groupname, typeis hardหรือsoftที่ไหนhardlimt ที่ไม่สามารถเกินได้ภายใต้สถานการณ์ใด ๆ

itemฟิลด์รายการจะระบุประเภทรายการที่จะถูก จำกัด ตัวอย่าง ได้แก่ core (ขนาดของไฟล์ core), data (ขนาดของพื้นที่ข้อมูลของโปรแกรม), fsize (ขนาดของไฟล์ที่สร้างโดยผู้ใช้), nofile (จำนวนไฟล์ข้อมูลที่เปิด), rss (ชุดถิ่นที่อยู่ ขนาด), สแต็ก (ขนาดสแต็ค), cpu (เวลา CPU ของกระบวนการเดียวในไม่กี่นาที), nproc (จำนวนกระบวนการที่เกิดขึ้นพร้อมกัน), maxlogins (จำนวนการล็อกอินพร้อมกัน) และลำดับความสำคัญ (ลำดับความสำคัญของกระบวนการ) รายการข้อมูล rss และสแต็กทั้งหมดเกี่ยวข้องกับหน่วยความจำที่ใช้โดยโปรแกรม การวัดความจุข้อมูลเหล่านี้และอื่น ๆ วัดเป็นกิโลไบต์

และvalueเป็นที่เกี่ยวข้องกับitemข้อมูลที่คุณต้องเลือกตัวอย่างเช่นถ้าคุณมีเลือกcpuในitemภาคสนามและใส่2ในvalueแล้วในกรณีที่domain(คุณกลุ่ม VirtualBox) เป็นเวลามากกว่า2เวลาซีพียูก็จะถูกยกเลิก

คุณสามารถใช้ได้ulimitเช่นกัน แต่ จำกัด เฉพาะเชลล์ bash เท่านั้น

หวังว่าสิ่งนี้จะช่วยให้คุณบรรลุเป้าหมายแม้ว่าจะไม่ได้ทำตามวิธีที่คุณถาม


1

ฉันเดาว่ามีบางอย่างผิดปกติกับ/etc/cgconfig.confไฟล์ของคุณ การตั้งค่านี้ใช้ได้สำหรับฉัน:

[root@localhost cgroup]# cat /etc/cgconfig.conf
mount {
    memory  = /cgroup/memory;
}

[root@localhost cgroup]# service cgconfig start
Starting cgconfig service:                                 [  OK  ]
[root@localhost cgroup]# ls
memory
[root@localhost cgroup]# ls memory/
cgroup.event_control  memory.limit_in_bytes        memory.memsw.max_usage_in_bytes  memory.soft_limit_in_bytes  memory.use_hierarchy
cgroup.procs          memory.max_usage_in_bytes    memory.memsw.usage_in_bytes      memory.stat                 notify_on_release
memory.failcnt        memory.memsw.failcnt         memory.move_charge_at_immigrate  memory.swappiness           release_agent
memory.force_empty    memory.memsw.limit_in_bytes  memory.oom_control               memory.usage_in_bytes       tasks
[root@localhost cgroup]# cgcreate -g memory:vbox
[root@localhost cgroup]# cgset -r memory.limit_in_bytes=512M vbox
[root@localhost cgroup]# cgclassify -g memory:vbox 11727
[root@localhost cgroup]# cat memory/vbox/tasks 
11727

แม้ว่าแทนที่จะใช้คำสั่งcgreateและcgsetฉันอยากแนะนำให้คุณสร้าง/etc/cgconfig.confไฟล์ที่จะรวมการตั้งค่าเหล่านี้เพื่อที่คุณจะได้ไม่ต้องทำขั้นตอนนี้ซ้ำหลังจากรีบูตทุกครั้ง ในกรณีของคุณไฟล์จะมีลักษณะดังนี้:

[root@localhost cgroup]# cat /etc/cgconfig.conf
mount {
    memory  = /cgroup/memory;
}

group vbox {
    memory {
        memory.limit_in_bytes="536870912";
    }
}

ตอนนี้ทุกครั้งที่คุณเริ่มcgconfigบริการคุณจะมี vbox cgroup ของคุณพร้อม สิ่งที่จำเป็นทั้งหมดคือการย้าย PID ของ virtualbox ไปยัง/cgroups/memory/vbox/tasksไฟล์โดยใช้cgclassifyเพียงแค่echoหมายเลขในไฟล์นั้น

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