Cgroups----限制kvm虛拟機
Cgroups相關概念及其關系
相關概念
1.任務(task)。在cgroups中,任務就是系統的一個程序。
2.控制族群(control group)。控制族群就是一組按照某種标準劃分的程序。Cgroups中的資源控制都是以控制族群為機關實作。一個程序可以加入到某個控制族群,也從一個程序組遷移到另一個控制族群。一個程序組的程序可以使用cgroups以控制族群為機關配置設定的資源,同時受到cgroups以控制族群為機關設定的限制。
3.層級(hierarchy)。控制族群可以組織成hierarchical的形式,既一顆控制族群樹。控制族群樹上的子節點控制族群是父節點控制族群的孩子,繼承父控制族群的特定的屬性。
4.子系統(subsytem)。一個子系統就是一個資源控制器,比如cpu子系統就是控制cpu時間配置設定的一個控制器。子系統必須附加(attach)到一個層級上才能起作用,一個子系統附加到某個層級以後,這個層級上的所有控制族群都受到這個子系統的控制。
互相關系
1.每次在系統中建立新層級時,該系統中的所有任務都是那個層級的預設 cgroup(我們稱之為 root cgroup ,此cgroup在建立層級時自動建立,後面在該層級中建立的cgroup都是此cgroup的後代)的初始成員。
2.一個子系統最多隻能附加到一個層級。
3.一個層級可以附加多個子系統
4.一個任務可以是多個cgroup的成員,但是這些cgroup必須在不同的層級。
5.系統中的程序(任務)建立子程序(任務)時,該子任務自動成為其父程序所在 cgroup 的成員。然後可根據需要将該子任務移動到不同的 cgroup 中,但開始時它總是繼承其父任務的cgroup。
Cgroups子系統介紹
blkio 這個子系統為塊裝置設定輸入/輸出限制,比如實體裝置(磁盤,固态硬碟,USB 等等)。
cpu 這個子系統使用排程程式提供對 CPU 的 cgroup 任務通路。
cpuacct 這個子系統自動生成 cgroup 中任務所使用的 CPU 報告。
cpuset 這個子系統為 cgroup 中的任務配置設定獨立 CPU(在多核系統)和記憶體節點。
devices 這個子系統可允許或者拒絕 cgroup 中的任務通路裝置。
freezer 這個子系統挂起或者恢複 cgroup 中的任務。
memory 這個子系統設定 cgroup 中任務使用的記憶體限制,并自動生成由那些任務使用的記憶體資源報告。
net_cls 這個子系統使用等級識别符(classid)标記網絡資料包,可允許 Linux 流量控制程式(tc)識别從具體 cgroup 中生成的資料包。
ns 名稱空間子系統。
安裝kernel-doc檢視幫助
# ls/usr/share/doc/kernel-doc-2.6.32/Documentation/cgroups/
00-INDEX cpuacct.txt freezer-subsystem.txt net_prio.txt
blkio-controller.txt cpusets.txt memcg_test.txt resource_counter.txt
cgroups.txt devices.txt memory.txt
通過cgroup來限制KVM虛拟機使用的cpu和記憶體
啟動cgconfig服務
# service cgconfig start
在 /cgroup 目錄下可以看到libvirt目錄
# ls /cgroup/cpuset/libvirt/qemu/
cgroup.event_control puset.memory_spread_page
cgroup.procs cpuset.memory_spread_slab
cpuset.cpu_exclusive cpuset.mems
cpuset.cpus cpuset.sched_load_balance
cpuset.mem_exclusive cpuset.sched_relax_domain_level
cpuset.mem_hardwall notify_on_release
cpuset.memory_migrate tasks
cpuset.memory_pressure
啟動虛拟機
# virsh start rhel6u4-6
Domain rhel6u4-6 started
現在可以看到虛拟機rhel6u4-6目錄了
# virsh list
Id Name State
----------------------------------------------------
1 rhel6u4-6 running
cgroup.event_control cpuset.memory_spread_page
cpuset.memory_migrate rhel6u4-6
cpuset.memory_pressure tasks
# ls /cgroup/cpuset/libvirt/qemu/rhel6u4-6/
cgroup.event_control cpuset.memory_spread_slab
cgroup.procs cpuset.mems
cpuset.cpu_exclusive cpuset.sched_load_balance
cpuset.cpus cpuset.sched_relax_domain_level
cpuset.mem_exclusive emulator
cpuset.mem_hardwall notify_on_release
cpuset.memory_migrate tasks
cpuset.memory_pressure vcpu0
cpuset.memory_spread_page vcpu1
檢視虛拟機使用的cpu
# watch -n 1 virsh vcpuinfo rhel6u4-6
VCPU: 0
CPU: 1
State: running
CPU time: 12.9s
CPU Affinity: yyyy
VCPU: 1
CPU: 0
CPU time: 7.0s
限制虛拟機隻能使用CPU0
# cat/cgroup/cpuset/libvirt/qemu/rhel6u4-6/vcpu0/cpuset.cpus
0-3
# cat/cgroup/cpuset/libvirt/qemu/rhel6u4-6/vcpu1/cpuset.cpus
# echo 0 > /cgroup/cpuset/libvirt/qemu/rhel6u4-6/vcpu0/cpuset.cpus
# echo 0 > /cgroup/cpuset/libvirt/qemu/rhel6u4-6/vcpu1/cpuset.cpus
Every 1.0s: virsh vcpuinfo rhel6u4-6 Wed Sep 4 21:16:27 2013
CPU time: 13.4s
CPU Affinity: y---
CPU time: 7.5s
限制虛拟機使用的記憶體
# cat/cgroup/memory/libvirt/qemu/rhel6u4-6/memory.limit_in_bytes
1935147008
# cgset -r memory.limit_in_bytes=64Mlibvirt/qemu/rhel6u4-6
67108864
如果虛拟機使用的記憶體大于限制值,kvm程序将會被核心殺掉
# tail -f /var/log/messages
...
Sep 4 21:44:27 localhost kernel: Memory cgroup out of memory: Kill process9705 (qemu-kvm) score 1000 or sacrifice child
Sep 4 21:44:27 localhost kernel: Killed process 9705, UID 107, (qemu-kvm)total-vm:1471536kB, anon-rss:32708kB, file-rss:4776kB
....
配置檔案配置方法
# vim /etc/cgconfig.conf
group libvirt/qemu/rhel6u4-6 {
memory{
memory.limit_in_bytes=512M;
}
}
group libvirt {
cpuset{
cpuset.cpus=0;
group libvirt/qemu {
# service cgconfig restart
Stopping cgconfig service: [ OK ]
Starting cgconfig service: [ OK ]
536870912
# cat/cgroup/cpuset/libvirt/qemu/rhel6u4-6/cpuset.cpus
本文轉自潘闊 51CTO部落格,原文連結:http://blog.51cto.com/pankuo/1392506,如需轉載請自行聯系原作者