博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RH442 - 通过cgroup来限制kvm虚拟机只使用host的某个cpu和内存大小
阅读量:4178 次
发布时间:2019-05-26

本文共 5875 字,大约阅读时间需要 19 分钟。

测试使用的系统版本

[root@desktop2 ~]# cat /proc/version

Linux version 2.6.32-220.el6.x86_64 (mockbuild@x86-004.build.bos.redhat.com) (gcc version 4.4.5 20110214 (Red Hat 4.4.5-6) (GCC) ) #1 SMP Wed Nov 9 08:03:13 EST 2011
You have new mail in /var/spool/mail/root
[root@desktop2 ~]#

安装libcgroup和libvirt两个包

[root@desktop2 ~]# yum list libcgroup

Loaded plugins: product-id, refresh-packagekit, security, subscription-manager
Updating certificate-based repositories.
Installed Packages
libcgroup.x86_64 0.37-3.el6 @anaconda-RedHatEnterpriseLinux-201111171049.x86_64/6.2
Available Packages
libcgroup.i686   0.37-3.el6 base                                                
[root@desktop2 ~]# yum list libvirt
Loaded plugins: product-id, refresh-packagekit, security, subscription-manager
Updating certificate-based repositories.
Installed Packages
libvirt.x86_64 0.9.4-23.el6     @anaconda-RedHatEnterpriseLinux-201111171049.x86_64/6.2
Available Packages
libvirt.x86_64 0.9.4-23.el6_2.1 Updates                                         
[root@desktop2 ~]#

启动cgconfig和libvirtd服务

[root@desktop2 ~]# service cgconfig restart
Stopping cgconfig service:                                 [  OK  ]
Starting cgconfig service:                                 [  OK  ]
[root@desktop2 ~]# service libvirtd restart
Stopping libvirtd daemon:                                  [  OK  ]
Starting libvirtd daemon:                                  [  OK  ]
[root@desktop2 ~]#

至此已经可以在cgroup目录下看到libvirt目录了,但是还看不到kvm虚拟机的目录(即使虚拟机已经启动)

[root@desktop2 ~]# ls /cgroup/cpuset/libvirt/qemu/

cgroup.procs            cpuset.memory_spread_page
cpuset.cpu_exclusive    cpuset.memory_spread_slab
cpuset.cpus             cpuset.mems
cpuset.mem_exclusive    cpuset.sched_load_balance
cpuset.mem_hardwall     cpuset.sched_relax_domain_level
cpuset.memory_migrate   notify_on_release
cpuset.memory_pressure  tasks
You have new mail in /var/spool/mail/root
[root@desktop2 ~]#

启动虚拟机(必须在重启cgconfig和libvirtd服务后,再重启虚拟机才会在cgroup目录下生成虚拟机目录)

[root@desktop2 ~]# virsh list

 Id Name                 State
----------------------------------
[root@desktop2 ~]# virsh start vserver
Domain vserver started
[root@desktop2 ~]# virsh list
 Id Name                 State
----------------------------------
  1 vserver              running
[root@desktop2 ~]#

现在可以看到虚拟机vserver目录了

[root@desktop2 ~]# ls /cgroup/cpuset/libvirt/qemu/

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     vserver
cpuset.memory_spread_page
[root@desktop2 ~]# ls /cgroup/cpuset/libvirt/qemu/vserver/
cgroup.procs            cpuset.memory_spread_page
cpuset.cpu_exclusive    cpuset.memory_spread_slab
cpuset.cpus             cpuset.mems
cpuset.mem_exclusive    cpuset.sched_load_balance
cpuset.mem_hardwall     cpuset.sched_relax_domain_level
cpuset.memory_migrate   notify_on_release
cpuset.memory_pressure  tasks
[root@desktop2 ~]#
现在看到虚拟机使用host上的cpu0和cpu1
[root@desktop2 ~]# watch -n .1 "virsh vcpuinfo vserver" #为方便观察,建议新起一个终端后执行此命令
You have new mail in /var/spool/mail/root
[root@desktop2 ~]# virsh vcpuinfo vserver
VCPU:           0
CPU:            1
State:          running
CPU time:       23.7s
CPU Affinity:   -y
VCPU:           1
CPU:            0
State:          running
CPU time:       13.5s
CPU Affinity:   yy
[root@desktop2 ~]#

限制虚拟机只能使用host的cpu0

[root@desktop2 ~]# cgset -r cpuset.cpus=0 libvirt/qemu/vserver

[root@desktop2 ~]# virsh vcpuinfo vserver
VCPU:           0
CPU:            0
State:          running
CPU time:       24.1s
CPU Affinity:   y-
VCPU:           1
CPU:            0
State:          running
CPU time:       13.9s
CPU Affinity:   y-
[root@desktop2 ~]#

限制虚拟机只能使用512M内存

[root@desktop2 ~]# cgset -r memory.limit_in_bytes=512M libvirt/qemu/vserver

[root@desktop2 ~]# cat /cgroup/memory/libvirt/qemu/vserver/memory.limit_in_bytes
536870912
[root@desktop2 ~]#

限制内存的配置文件写法

[root@desktop2 etc]# vim /etc/cgconfig.conf

.....

group libvirt/qemu/vserver {
memory{
memory.limit_in_bytes=512M;
}
}

但是限制只使用某个物理cpu时,采用写配置文件的方法一直出错

这样写可以(语法是正确的)

group vserver {

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

下面这样就不行(以下配置会让cgconfig服务无法启动,删除后cgconfig服务可以正常启动):

group libvirt/qemu/vserver {
cpuset{
cpuset.cpus=0;
cpuset.mems=0;
}
}

错误信息如下:

[root@desktop2 init.d]# service cgconfig  restart
Stopping cgconfig service:                                 [  OK  ]
Starting cgconfig service: Loading configuration file /etc/cgconfig.conf failed
Value setting does not succeed
Failed to parse /etc/cgconfig.conf                         [FAILED]
[root@desktop2 init.d]#
再翻了翻书,发现对于有些controllers来说(如cpuset),光限制nested cgroup还不够,还应限制其所有父亲controllers(不包括根controller),要想通过配置文件cgconfig.conf限制虚拟机只使用某个cpu,需按照如下写法:

* PAGE247: With Some controllers just placing limits on a nested cgroup is not enough. The cpuset controller for instance requires you to at least set cpuset.cpus and cpuset.mems on all parents leading up to (but not including) root.

... ...

group libvirt {
cpuset{
cpuset.cpus=0;
cpuset.mems=0;
}
}
group libvirt/qemu {
cpuset{
cpuset.cpus=0;
cpuset.mems=0;
}
}
group libvirt/qemu/vserver {
cpuset{
cpuset.cpus=0;
cpuset.mems=0;
}
}

查看结果:

[root@desktop2 init.d]# service cgconfig  restart
Stopping cgconfig service:                                 [  OK  ]
Starting cgconfig service:                                 [  OK  ]
[root@desktop2 init.d]# cat /cgroup/cpuset/libvirt/qemu/vserver/cpuset.cpus
0
[root@desktop2 init.d]#

当我们对虚拟机的内存进行限制后,如果虚拟机使用的内存大于限制值,kvm进程将会直接被内核杀掉

[root@desktop2 ~]# tail /var/log/messages

Jan 17 00:25:24 desktop2 kernel: Total swap = 524280kB
Jan 17 00:25:24 desktop2 kernel: 1048560 pages RAM
Jan 17 00:25:24 desktop2 kernel: 69242 pages reserved
Jan 17 00:25:24 desktop2 kernel: 82826 pages shared
Jan 17 00:25:24 desktop2 kernel: 270283 pages non-shared
Jan 17 00:25:24 desktop2 kernel: [ pid ]   uid  tgid total_vm      rss cpu oom_adj oom_score_adj name
Jan 17 00:25:24 desktop2 kernel: [27532]   107 27532   347618   100566   0       0             0 qemu-kvm
Jan 17 00:25:24 desktop2 kernel: Memory cgroup out of memory: Kill process 27532 (qemu-kvm) score 1000 or sacrifice child
Jan 17 00:25:24 desktop2 kernel: Killed process 27532, UID 107, (qemu-kvm) total-vm:1390472kB, anon-rss:398708kB, file-rss:3556kB
Jan 17 00:25:24 desktop2 kernel: Kill process 27552 (vhost-27532) sharing same memory
[root@desktop2 ~]# virsh list
 Id Name                 State
----------------------------------
[root@desktop2 ~]#

转载地址:http://xntai.baihongyu.com/

你可能感兴趣的文章
Yocto tips (6): Yocto中如何共享已经下载的文件
查看>>
Yocto tips (1): Yocto 编译后文件放在了哪里 输出文件位置
查看>>
Yocto tips (2): Yocto Linux内核编译目录在哪?
查看>>
Yocto tips (3): Yocto 如何重新编译Linux内核与dtb,并放到deploy目录?
查看>>
Yocto tips (4): Yocto 如何确定(找到)一个包的名字
查看>>
start kernel 之后没有任何输出与uboot无法将bootargs传入内核的调查方法与解决之道
查看>>
Yocto tips (5): Yocto如何更改source code的下载与git clone地址
查看>>
Yocto tips (7): Yocto Bitbake的clean与cleanall以及cleansstate的区别
查看>>
Yocto tips (19): Yocto SDK Toolchian的使用
查看>>
Yocto i.MX6 (TQIMX6) (04) : 使用mjpg-streamer做一个WebCam Server
查看>>
Nexus 7 Cyanogenmod OS Compile and errors
查看>>
Yocto tips (20): Yocto中qemu模拟器的使用,以zynq Cortex-A9为例
查看>>
打造嵌入式ARM Linux防火墙:1. iptables基础
查看>>
4G模块SIMCOM7100 LTE在ARM Linux下使用PPPD上网
查看>>
为小米4与小米3 Mi3 Mi4编译Cyanogenmod 12.1与13.0 (CM12与CM13) 的步骤以及错误解决
查看>>
原生Android系统的第一次开机google验证的解决
查看>>
S5P4418与S5P6618的Android boot.img的解压与压缩, Sparse ext4文件系统
查看>>
【EVB-335X-II试用体验】 u-boot与kernel的编译以及本地repo的建立
查看>>
【EVB-335X-II试用体验】 上手试用与资源使用
查看>>
【EVB-335X-II试用体验】 Yocto环境的建立及Rootfs的构建与使用
查看>>