Cgroup和Namespace在测试中的使用(上)
来源:互联网 发布:淘宝开店头像 编辑:程序博客网 时间:2024/05/17 16:56
http://www.cnblogs.com/opama/p/4712139.html
很多时候需要测试程序在资源受限情况下的表现,普通的做法可能是不断对系统加压使能够分配给目标程序的资源变少,换另一个思路思考,可以尝试限制分配给目标程序的资源总数,使得机器状态健康的情况下让程序资源使用达到饱和。
作为一个正在做着容器项目的人,知道容器技术是依靠Cgroup和Namespace来实现的。在容器中,cpu和内存资源是使用Cgroup来控制,PID、IPC、网络等资源是通过Namespace来划分。在程序没有部署在容器的情况下,我们仍可以利用Cgoup和Namespace来构造场景完成一些异常测试,如利用Cgroup的资源控制功能做资源满载的测试;利用Namespace的资源隔离特性做一些网络异常测试而不影响其他程序的运行。
Cgroup介绍
Cgroup是进行分组化管理的Linux内核功能,具体的资源管理是通过子系统来完成的。可以理解为子系统就是资源控制器,每种子系统就是一个资源的分配器,比如cpu子系统是控制cpu时间分配的,使用方式如下
安装(ubuntu)
基本命令
子系统说明
可以使用lssubsys -a来列出系统支持多少种子系统,和:比如cpu是控制cpu时间片的,memory是控制内存使用的
主要的几种子系统说明如下:
要为Cgroup分配限制的资源,首先要挂载子系统,然后才有控制组,比如想要对目标程序进行内存限制,那就需要挂载memory子系统
使用lssubsys -am来显示已经挂载的子系统
可以手动挂载或者卸载子系统,如执行umount /sys/fs/cgroup/memory
,memory子系统就被卸载了,这时候手动执行# mount -t cgroup -o memory memory /sys/fs/cgroup/memory
就又挂载上了。
要确保需要的子系统都挂上了,不然创建控制组的时候会报错 is not mounted
如何创建control group(即需要资源管理的组)呢, 这里用cgcreate命令,当然也有其他方法, 如cgconfig.conf等
这里有个重要特性:一个组可以同时做多个资源的限制,如这里我同时限制了memory和cpu,然后memory和cpu子系统目录下会自动生成这个组的目录和些文件,如memory
文件很多,选几个重要的讲下:
- tasks 可以将想要限制资源的进程都加到这个文件中
- memory.max_usage_in_bytes内存的最大使用量,用来限制资源
-memory.soft_limit_in_bytes 和 memory.limit_in_bytes 的差异是,这个限制并不会阻止进程使用超过限额的内存,只是在系统内存不足时,会优先回收超过限额的进程占用的内存,使之向限定值靠拢。 - memory.oom_control
包含一个标志(0或1)来开启或者关闭cgroup的OOM killer。如果开启(1),任务如果尝试申请内存超过允许,就会被系统OOM killer终止。OOM killer在每个使用cgroup内存子系统中都是默认开启的。如果需要关闭,则可以向memory.oom_control文件写入1:
# echo 1 > /sys/fs/cgroup/memory.oom_control
如果OOM killer关闭,那么进程尝试申请的内存超过允许,那么它就会被暂停,直到额外的内存被释放
- memory.mem.usage_in_bytes 当前进程内存用量,因为现在还没有进程加到组里,就是0了
- memory.mem.failcnt显示内存达到限制值的次数
Cgroup文档
Cgroup的使用细节,子系统和参数设置都可以可以在https://www.kernel.org/doc/Documentation/cgroups/中找到,继承等特性由于篇幅所限,可以看下文档
Cgroup实战
内存限制测试
用控制组限制目标程序内存使用为1000000 byte,当然,需要root执行 echo "1000000" >memory.limit_in_bytes
一般更推荐用cgset来设置数值
然后构造一个吃内存的程序,每运行一次内存使用就大幅增加
然后运行程序,并将进程pid写入mem下面控制组的tasks中
使用cgclassify 可以将运行中的进程加到task中,如果控制组有多个资源的控制,使用命令会比echo方便很多
然后这货就在不断占内存,由于没有设置disable oom killing,所以最后会oom被kill掉
CPU限制测试
我的机器上有2个核
写个死循环脚本cpu_test.sh跑一下
如果我不想把机器跑死,这里想要限制组里的进程的CPU使用,有2种做法
1.在cpu子系统中控制cpu调度的配额
先看下当前cpu分配情况
-1表示无限制,这里改为50000,即相对于cpu.cfs_period_us 来说为50000/100000约占1个核50%的cpu时间
或者直接使用命令cgexec执行
top了下基本上就是在50%的cpu占用
2.在cpuset控制物理cpu的分配
当前使用了上面的方法后,我们发现进程的CPU使用都在Cpu0上,这次希望只用Cpu1来跑这个小程序
所以把控制组也加到cpuset
看一下现在使用的cpu的设置
改为只用Cpu1,输入以下命令
或用命令
top一下,内存的使用从CPU0到CPU1了
IO限制测试
用dd对硬盘进行写操作
打开iotop看下IO速度
为了控制IO速度,在blkio上创建控制组
查看下硬盘号
设置硬盘号和对应的读取速度限制,然后执行同样的命令
用iotop查看下,速度果然就降到1M以下
- Cgroup和Namespace在测试中的使用(上)
- Cgroup和Namespace在测试中的使用(上)
- Cgroup和Namespace在测试中的使用(下)
- Cgroup和Namespace在测试中的使用(下)
- linux namespace 和cgroup lxc
- 5.1 linux namespace 和cgroup lxc
- 容器Cgroup和Namespace特性简介
- namespace在大型项目中的使用
- cgroup--cgroup 测试
- CGroup-Namespace-Container
- IT--cgroup--cgroup使用
- docker lxc cgroup namespace入门
- docker lxc cgroup namespace简述
- docker lxc cgroup namespace入门
- Linux PID namespace cgroup namespace container
- cgroup在Linux/Android几篇文章(主要关注cgroup在Android、Linux上的应用)
- C++中的命令空间NameSpace定义和使用
- fiddler在测试中的使用
- Shell命令之终端打开网页
- php笔记-2
- Android之基于OpenCV的Puzzle拼图
- 如何处理CSDN博客主页404问题
- Android编程权威指南(第2版)—第10章挑战练习
- Cgroup和Namespace在测试中的使用(上)
- 进程间通信的几种方式
- linux免费视频究竟应该怎么找?该怎么看呢?
- 关于angular的$state.include()方法与ui-sref和ui-sref-active的使用或者关于angular激活状态的判断
- linux常用基础命令
- linux解压文件命令
- 欢迎使用CSDN-markdown编辑器
- 关押罪犯
- 3个新开源项目让Kubernetes“如虎添翼”