天天看點

Cgroups----限制kvm虛拟機

                      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,如需轉載請自行聯系原作者

繼續閱讀