满意的回答
hhl117
2016.09.11
合格率: 44%等级: 10
帮助: 1173人
在测试中使用Cgroup和Namespace (
在许多情况下,需要测试程序在资源受限的情况下的行为。 常见的方法可能是继续向系统施加压力,以减少可以分配给目标程序的资源。 换句话说,您可以尝试限制分配给目标程序的资源总数,以便在计算机运行状况良好时使程序资源使用饱和。
作为做容器项目的人,我知道容器技术是通过Cgroup和Namespace实现的。 在容器中,cpu和内存资源由Cgroup控制,PID、IPC和网络等资源由Namespace分隔。 即使没有将程序部署到容器中,也可以完成一些异常测试,包括使用Cgoup和Namespace构建场景,并使用Cgroup的资源控制功能进行资源满载测试。 利用Namespace的资源隔离特性,在不影响其他程序运行的情况下进行一些网络异常测试。
小组介绍
Cgroup是进行分组管理的Linux内核功能,具体资源管理通过子系统进行。 子系统可以理解为资源控制器,各种子系统是资源的分配器。 例如,cpu子系统控制cpu时间的分配,并如下使用
安装(ubuntu )
#apt-get install cgroup-bin
基本命令
cgclassify -- cgclassify命令用于将正在运行的任务移动到一个或多个cgroup。
cgclear -- cgclear命令用于删除层次结构中的所有cgroup。
CG config.conf--在CG config.conf文件中定义cgroup。
cgconfigparser -- cgconfigparser命令分析cgconfig.conf文件并挂载级别。
cgcreate -- cgcreate在层次中创建新的cgroup。
cgdelete -- cgdelete命令删除指定的cgroup。
cgexec -- cgexec命令在指定的cgroup上执行任务。
cgget -- cgget命令显示cgroup参数。
cgred.conf -- cgred.conf是cgred服务的配置文件。
cgrules.conf -- cgrules.conf包含用于确定何时使用特定cgroup的任务术语的规则。
cgrulesengd -- cgrulesengd在cgroup上公开任务。
cgset -- cgset命令设置cgroup的参数。
LSC组--LSC组命令列出层次结构中的cgroup。
lssubsys -- lssubsys命令列出包含指定子系统的级别
子系统说明
使用lssubsys -a,系统所支持的种子系统的数目和例如cpu控制cpu的时间片,而存储器控制存储器的使用
#lssubsys -a
cpuset
cpu,cpuacct
埃默里
戴维斯
freezer
net_cls,net_prio
blkio
perf_event
hugetlb
的主要子系统如下所示。
名为blkio的子系统设置限制每个块设备的输入和输出控制。 例如:盘、CD、usb等。
名为cpu的子系统使用调度程序为cgroup任务提供cpu的访问。
cpuacct生成cgroup任务的cpu资源报告。
对于cpuset多核cpu,此子系统为cgroup任务分配单独的cpu和内存。
允许或拒绝cgroup任务对设备的访问。
freezer暂停并重新开始cgroup任务。
内存设置每个cgroup的内存限制并生成内存资源报告。
net_cls标记每个网络数据包以方便cgroup使用。
ns名称空间子系统
perf_event:添加了按组监视和跟踪功能,以便可以监视属于特定组的所有线程和在特定CPU上运行的线程
要为Cgroup分配受限制的资源,必须先装载子系统,然后才能拥有控制组。 例如,如果要对目标程序施加内存限制,则需要挂载内存子系统
使用lssubsys -am查看已装载的子系统
#lssubsys -am
cpuset /sys/fs/cgroup/cpuset
cpu、cpuacct /sys/fs/cgroup/cpu、cpuacct
memory /sys/fs/cgroup/memory
戴维斯
s /sys/fs/cgroup/devicesfreezer /sys/fs/cgroup/freezer
net_cls,net_prio /sys/fs/cgroup/net_cls,net_prio
blkio /sys/fs/cgroup/blkio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb
可以手动挂载或者卸载子系统,如执行umount /sys/fs/cgroup/memory,memory子系统就被卸载了,这时候手动执行# mount -t cgroup -o memory memory /sys/fs/cgroup/memory就又挂载上了。
要确保需要的子系统都挂上了,不然创建控制组的时候会报错 is not mounted
#cgcreate -g memory,cpu:/hzmali_test
cgcreate: can't create cgroup /hzmali_test: Cgroup one of theneeded subsystems is not mounted
如何创建control group(即需要资源管理的组)呢, 这里用cgcreate命令,当然也有其他方法, 如cgconfig.conf等
#cgcreate -g memory,cpu:/hzmali_test
这里有个重要特性:一个组可以同时做多个资源的限制,如这里我同时限制了memory和cpu,然后memory和cpu子系统目录下会自动生成这个组的目录和些文件,如memory
#/sys/fs/cgroup/memory/hzmali_test$ ls -lrt
-rw-r--r-- 1 root root 0 Jul 26 20:56 tasks
-rw-r--r-- 1 root root 0 Jul 26 20:56 notify_on_release
-rw-r--r-- 1 root root 0 Jul 26 20:56 memory.use_hierarchy
-r--r--r-- 1 root root 0 Jul 26 20:56 memory.usage_in_bytes
-rw-r--r-- 1 root root 0 Jul 26 20:56 memory.swappiness
-r--r--r-- 1 root root 0 Jul 26 20:56 memory.stat
-rw-r--r-- 1 root root 0 Jul 26 20:56 memory.soft_limit_in_bytes
---------- 1 root root 0 Jul 26 20:56 memory.pressure_level
-rw-r--r-- 1 root root 0 Jul 26 20:56 memory.oom_control
-r--r--r-- 1 root root 0 Jul 26 20:56 memory.numa_stat
-rw-r--r-- 1 root root 0 Jul 26 20:56memory.move_charge_at_immigrate
-rw-r--r-- 1 root root 0 Jul 26 20:56 memory.max_usage_in_bytes
-rw-r--r-- 1 root root 0 Jul 26 20:56 memory.limit_in_bytes
-r--r--r-- 1 root root 0 Jul 26 20:56 memory.kmem.usage_in_bytes
-r--r--r-- 1 root root 0 Jul 26 20:56memory.kmem.tcp.usage_in_bytes
-rw-r--r-- 1 root root 0 Jul 26 20:56memory.kmem.tcp.max_usage_in_bytes
-rw-r--r-- 1 root root 0 Jul 26 20:56memory.kmem.tcp.limit_in_bytes
-rw-r--r-- 1 root root 0 Jul 26 20:56 memory.kmem.tcp.failcnt
-r--r--r-- 1 root root 0 Jul 26 20:56 memory.kmem.slabinfo
-rw-r--r-- 1 root root 0 Jul 26 20:56memory.kmem.max_usage_in_bytes
-rw-r--r-- 1 root root 0 Jul 26 20:56 memory.kmem.limit_in_bytes
-rw-r--r-- 1 root root 0 Jul 26 20:56 memory.kmem.failcnt
--w------- 1 root root 0 Jul 26 20:56 memory.force_empty
-rw-r--r-- 1 root root 0 Jul 26 20:56 memory.failcnt
-rw-r--r-- 1 root root 0 Jul 26 20:56 cgroup.procs
--w--w--w- 1 root root 0 Jul 26 20:56 cgroup.event_control
-rw-r--r-- 1 root root 0 Jul 26 20:56 cgroup.clone_children
文件很多,选几个重要的讲下:
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显示内存达到限制值的次数
00分享举报