centos6 cgroup及cgred简介和简单使用
一、cgroup简介
Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为cgroup,并且被合并到2..24版的内核中去。然后,其它开始了他的发展。 Linux CGroupCgroup 可让您为系统中所运行任务(进程)的用户定义组群分配资源 — 比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。您可以监控您配置的 cgroup,拒绝 cgroup 访问某些资源,甚至在运行的系统中动态配置您的 cgroup。
主要功能:
限制资源使用,比如内存使用上限以及文件系统的缓存限制。
优先级控制,CPU利用和磁盘IO吞吐。
一些审计或一些统计,主要目的是为了计费。
挂起进程,恢复执行进程。
cgroups子系统:
cpu 子系统,主要限制进程的 cpu 使用率。
cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
memory 子系统,可以限制进程的 memory 使用量。
blkio 子系统,可以限制进程的块设备 io。
devices 子系统,可以控制进程能够访问某些设备。
net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
net_prio — 这个子系统用来设计网络流量的优先级
freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace
hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。
cgred简介
Cgred 是一个守护进程,它可根据在 /etc/cgrules.conf 文件中设定的参数将任务移动到 cgroup 中。/etc/cgrules.conf 文件中的条目可以使用以下两个格式之一:
user hierarchies control_group
user:command hierarchies control_group
例如:
maria devices /usergroup/staff
这个条目指定任何属于名为 maria 用户的进程根据在 /usergroup/staff cgroup 中指定的参数访问设备子系统。要将具体命令与具体 cgroup 关联,请添加 command 参数,如下:
maria:ftp devices /usergroup/staff/ftp
该条目现在指定何时名为 maria 的用户使用 ftp 命令,自动将该进程移动到包含 devices 子系统的层级中的 /usergroup/staff/ftp cgroup 中。请注意:该守护进程只有在符合适当的条件后才可将该进程移动到该 cgroup 中。因此,ftp 可能会在错误的组群中短暂运行。再有,如果该进程在错误组群中迅速生出子进程,则不会移动这些子进程。
/etc/cgrules.conf 文件中的条目可包括以下额外符号:
@ - 当在 user 使用前缀时,代表是一个组群而不是单独用户。例如:@admins 是 admins 组群中的所有用户。
* - 代表“所有”。例如:subsystem 字段中的 * 代表所有子系统。
% - 代表与以上行中项目相同的项目。例如:
@adminstaff devices /admingroup
@labstaff % %
小结:通过cgroup设置我们想要的规则,通过cgred将规则应用到进程之上
二、CPU限制
1.查看已经使用的子系统
[root@reddhat6_155_200 ~]# lssubsys -m
cpuset /cgroup/cpuset
cpu /cgroup/cpu
cpuacct /cgroup/cpuacct
memory /cgroup/memory
devices /cgroup/devices
freezer /cgroup/freezer
net_cls /cgroup/net_cls
blkio /cgroup/blkio
2.编辑cgroup配置文件,添加两个group对CPU使用率的限制
[root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf #添加以下两段
group lesscpu{
cpu{ }
} group morecpu{
cpu{
}
}
3.重启并查看CPU子系统目录
[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [确定]
Starting cgconfig service: [确定]
[root@reddhat6_155_200 ~]# ll /cgroup/cpu
总用量
--w--w--w-. root root -- : cgroup.event_control
-rw-r--r--. root root -- : cgroup.procs
-rw-r--r--. root root -- : cpu.cfs_period_us
-rw-r--r--. root root -- : cpu.cfs_quota_us
-rw-r--r--. root root -- : cpu.rt_period_us
-rw-r--r--. root root -- : cpu.rt_runtime_us
-rw-r--r--. root root -- : cpu.shares
-r--r--r--. root root -- : cpu.stat
drwxr-xr-x. root root -- : lesscpu #多出两个目录,和我们定义的group名称是一至的
drwxr-xr-x. root root -- : morecpu
-rw-r--r--. root root -- : notify_on_release
-rw-r--r--. root root -- : release_agent
-rw-r--r--. root root -- : tasks
4.查看目录内容
[root@reddhat6_155_200 ~]# ll /cgroup/cpu 仔细观察可以发现每个目录中的文件都是相同的,也就是默认情况下group会继承该子系统的所有规则
[root@reddhat6_155_200 ~]# ll /cgroup/cpu/morecpu/
[root@reddhat6_155_200 ~]# ll /cgroup/cpu/morecpu/
5.添加group规则
[root@reddhat6_155_200 ~]# cat /cgroup/cpu/cpu.shares #cpu.shares表示程序可以在 cgroup 中的任务可用的相对共享 CPU 时间的整数值,默认为1024
[root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf
group lesscpu{
cpu{
cpu.shares=; #该值不可以超过总大小(1024)
}
} group morecpu{
cpu{
cpu.shares=;
}
}
[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [确定]
Starting cgconfig service: [确定]
[root@reddhat6_155_200 ~]# cat /cgroup/cpu/lesscpu/cpu.shares
100
[root@reddhat6_155_200 ~]# cat /cgroup/cpu/morecpu/cpu.shares
200
6.为了减少演示的复杂度,我们下线其他CPU,只保留一个CPU
[root@reddhat6_155_200 ~]# lscpu |grep -A "^CPU\(s\):" #查看当前CPU个数及在线个数
CPU(s):
On-line CPU(s) list: ,
[root@reddhat6_155_200 ~]# echo > /sys/devices/system/cpu/cpu1/online #将cpu1下线,cpu0为主cpu无法下线
[root@reddhat6_155_200 ~]# lscpu |grep -A "^CPU\(s\):" #查看在线状态,目前只有cpu0在线
CPU(s):
On-line CPU(s) list:
7.新开一个窗口,同时执行dd命令,分别选择lesscpu和morecpu
[root@reddhat6_155_200 ~]# cgexec -g cpu:lesscpu time dd if=/dev/zero of=/dev/null bs=1M count= #窗口1 分配少的先执行
[root@reddhat6_155_200 ~]# cgexec -g cpu:morecpu time dd if=/dev/zero of=/dev/null bs=1M count= #窗口2
[root@reddhat6_155_200 ~]# top #窗口3 使用top命令监控命令状态
注意观察两个dd命令CPU使用率
lesscpu结果:
[root@reddhat6_155_200 ~]# cgexec -g cpu:lesscpu time dd if=/dev/zero of=/dev/null bs=1M count=
记录了200000+ 的读入
记录了200000+ 的写出
209715200000字节( GB)已复制,21.7357 秒,9.6 GB/秒 #注意CPU使用时间
.01user .83system :.73elapsed %CPU (0avgtext+0avgdata 7776maxresident)k #注意CPU使用率
0inputs+0outputs (0major+521minor)pagefaults 0swaps
morecpu结果:
[root@reddhat6_155_200 ~]# cgexec -g cpu:morecpu time dd if=/dev/zero of=/dev/null bs=1M count=
记录了200000+ 的读入
记录了200000+ 的写出
209715200000字节( GB)已复制,16.26 秒,12.9 GB/秒
.02user .77system :.26elapsed %CPU (0avgtext+0avgdata 7744maxresident)k
0inputs+0outputs (0major+519minor)pagefaults 0swaps
三、MEM限制
1.编辑cgroup配置文件,添加一个mem限制
[root@reddhat6_155_200 ~]# cat /cgroup/memory/memory.limit_in_bytes #查看MEM(物理内存)默认限制大小 单位为字节 以目前机器配置,等同于无限制
[root@reddhat6_155_200 ~]# cat /cgroup/memory/memory.memsw.limit_in_bytes #查看MEM(物理内存)+Swap总的大小 此值必须大于等于 memory.limit_in_bytes [root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf #添加一个MEM 限制
group poormem{
memory{
memory.limit_in_bytes=; #限制可以使用内存大小为256M
}
[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [确定]
Starting cgconfig service: [确定]
[root@reddhat6_155_200 ~]# cat /cgroup/memory/poormem/memory.limit_in_bytes
268435456
2.创建一个内存盘
[root@reddhat6_155_200 ~]# mkdir /mnt/tmpfs
[root@reddhat6_155_200 ~]# mount -t tmpfs none /mnt/tmpfs #注意没有挂载源 使用none
[root@reddhat6_155_200 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_redhat6demo01-lv_root
50G .4G 42G % /
tmpfs .0G 224K .0G % /dev/shm
/dev/vda1 477M 33M 419M % /boot
/dev/mapper/vg_redhat6demo01-lv_home
.5G 12M .2G % /home
none .0G .0G % /mnt/tmpfs #大小2G,具体大小和系统剩余内存大小有关
3.测试tmpfs特性
[root@reddhat6_155_200 ~]# free -m #查看当前内存大小
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:
[root@reddhat6_155_200 ~]# dd if=/dev/zero of=/mnt/tmpfs/test bs=1M count=1000 #向 tmpfs 挂载点写入1G内存
记录了1000+ 的读入
记录了1000+ 的写出
1048576000字节(1.0 GB)已复制,0.466811 秒,2.2 GB/秒
[root@reddhat6_155_200 ~]# free -m #查看系统内存 少了1G
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:
[root@reddhat6_155_200 ~]# rm -f /mnt/tmpfs/test #删除刚刚创建的文件
[root@reddhat6_155_200 ~]# free -m #查看当前剩余内存
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:
4.测试
[root@reddhat6_155_200 ~]# cgexec -g memory:poormem dd if=/dev/zero of=/mnt/tmpfs/test bs=1M count=200 #配置的为256M 先创建一个200M 测试文件
记录了200+ 的读入
记录了200+ 的写出
209715200字节( MB)已复制,0.097221 秒,2.2 GB/秒
[root@reddhat6_155_200 ~]# rm -f /mnt/tmpfs/test
[root@reddhat6_155_200 ~]# cgexec -g memory:poormem dd if=/dev/zero of=/mnt/tmpfs/test bs=1M count=300 #创建一个300M测试文件 挂了 很奇怪,按照文档说明此处不应该挂的,应该不够的会从Swap中读取 只有 memory.memsw.limit_in_bytes 也设置了才会限制从Swap中读取 不知道为啥??????
已杀死 [root@reddhat6_155_200 ~]# ll -h /mnt/tmpfs/test #查看大小只有
255M -rw-r--r--. root root 255M -- : /mnt/tmpfs/test
四、磁盘IO限制 #使用IO限制时当前系统调度算法必须为cfq算法
[root@reddhat6_155_200 ~]# cat /sys/block/vda/queue/scheduler #查看下当前系统磁盘调度算法 vda表示磁盘名称
noop anticipatory deadline [cfq]
[root@reddhat6_155_200 ~]# cat /cgroup/blkio/blkio.weight #查看磁盘io权重默认值
[root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf #创建io限制规则
group lowio{
blkio{
blkio.weight=; #设置io优先级 一个低 一个高
}
} group highio{
blkio{
blkio.weight=;
}
} group ddio{
blkio{
blkio.throttle.read_bps_device="252:0 1000000";
#限制程序读取磁盘的速度 252表示当前主盘符号 0表示副盘符号 1000000表示读取速率 单位为字节 即1M 需要注意的是,如果是物理设备 SCSI设备重启后主副盘符会发生变化 可以通过设置逻辑卷
}
}
[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [确定]
Starting cgconfig service: [确定]
测试
[root@reddhat6_155_200 ~]# dd if=/dev/zero of=/root/bigfile1 bs=1M count=10000 #创建两个大的文件用于实验
[root@reddhat6_155_200 ~]# dd if=/dev/zero of=/root/bigfile2 bs=1M count=
[root@reddhat6_155_200 ~]# echo > /proc/sys/vm/drop_caches #情况缓存 避免影响结果
[root@reddhat6_155_200 ~]# iotop #使用iotop命令监控io状态
新开两个窗口,分别使用lowio和highio
[root@reddhat6_155_200 ~]# cgexec -g blkio:lowio time cat /root/bigfile1 > /dev/null
[root@reddhat6_155_200 ~]# cgexec -g blkio:highio time cat /root/bigfile2 > /dev/null
结果:当两个cat命令都读取时,使用highio磁盘速度大约是lowio的两倍
当highio执行完成后lowio开始独占磁盘io
[root@reddhat6_155_200 ~]# cgexec -g blkio:lowio time cat /root/bigfile1 > /dev/null
.08user .52system :.54elapsed %CPU (0avgtext+0avgdata 2416maxresident)k
20480360inputs+0outputs (1major+182minor)pagefaults 0swaps [root@reddhat6_155_200 ~]# cgexec -g blkio:highio time cat /root/bigfile2 > /dev/null
.08user .16system :.64elapsed %CPU (0avgtext+0avgdata 2432maxresident)k
20480072inputs+0outputs (1major+183minor)pagefaults 0swaps
限制指定用户执行指定命令
[root@reddhat6_155_200 ~]# vim /etc/cgrules.conf
admin:dd blkio ddio/ #此行配置表示 admin用户执行dd命令时 使用 blkio子系统下ddio group进行限制 此处不仅可以现在命令也可以现在程序 添加程序的启动命令即可 例 nginx java等
[root@reddhat6_155_200 ~]# /etc/init.d/cgred restart
正在停止 CGroup Rules Engine 守护进程...... [确定]
Starting CGroup Rules Engine Daemon: [确定]
使用root用户测试dd命令
[root@reddhat6_155_200 ~]# dd if=/tmp/bigfile1 of=/dev/null
记录了20480000+ 的读入
记录了20480000+ 的写出
10485760000字节( GB)已复制,18.5243 秒, MB/秒 #速度正常
切换至admin用户执行dd命令
[root@reddhat6_155_200 ~]# mv /root/bigfile1 /tmp/
[root@reddhat6_155_200 ~]# su - admin
[admin@reddhat6_155_200 ~]$ dd if=/tmp/bigfile1 of=/dev/null
新开一个窗口,使用iotop命令监控
[admin@reddhat6_155_200 ~]$ dd if=/tmp/bigfile1 of=/dev/null
记录了210657+ 的读入
记录了210656+ 的写出
107855872字节( MB)已复制,107.986 秒, kB/秒 #注意此处的速率 时间是因为我提前中断了程序
我们发现,无论怎样,IO读取不会大于1M
注意事项:
磁盘IO调度算法必须为cfq
测试前需要先清空磁盘缓存
不要使用SSD硬盘
读取速率注意SCSI物理硬盘盘符会随机更改
五、创建两个及以上资源控制子系统(默认每种资源只能单独控制)
1.修改配置文件,配置一个多控制项的子系统
[root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf
mount {
cpuset = /cgroup/cpuset;
# cpu = /cgroup/cpu; #以CPU内存为例,注释cpu、memory字段
cpuacct = /cgroup/cpuacct;
# memory = /cgroup/memory;
cpu = /cgroup/cpumem; #新添加cpu、memory字段将其路径指向同一路径
memory = /cgroup/cpumem;
devices = /cgroup/devices;
freezer = /cgroup/freezer;
net_cls = /cgroup/net_cls;
blkio = /cgroup/blkio;
}
2.重启服务(注意:重启时需要退出/cgroup目录,否则会重启失败)
[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [确定]
Starting cgconfig service: [确定]
3.检查目录
[root@reddhat6_155_200 ~]# ll /cgroup/
总用量
drwxr-xr-x. root root -- : blkio
drwxr-xr-x. root root -- : cpu
drwxr-xr-x. root root -- : cpuacct
drwxr-xr-x. root root -- : cpumem #我们自定义的
drwxr-xr-x. root root -- : cpuset
drwxr-xr-x. root root -- : devices
drwxr-xr-x. root root -- : freezer
drwxr-xr-x. root root -- : memory
drwxr-xr-x. root root -- : net_cls
[root@reddhat6_155_200 ~]# ll /cgroup/cpu #原先的cpu及memory已经失效了
总用量
[root@reddhat6_155_200 ~]# ll /cgroup/memory/
总用量
[root@reddhat6_155_200 ~]# ll /cgroup/cpumem/ #所有mem和cpu配置都在cpumem目录下
总用量
--w--w--w-. root root -- : cgroup.event_control
-rw-r--r--. root root -- : cgroup.procs
-rw-r--r--. root root -- : cpu.cfs_period_us
-rw-r--r--. root root -- : cpu.cfs_quota_us
-rw-r--r--. root root -- : cpu.rt_period_us
-rw-r--r--. root root -- : cpu.rt_runtime_us
-rw-r--r--. root root -- : cpu.shares
-r--r--r--. root root -- : cpu.stat
-rw-r--r--. root root -- : memory.failcnt
--w-------. root root -- : memory.force_empty
......
centos6 cgroup及cgred简介和简单使用的更多相关文章
- C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo
在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架 ...
- knockout.js的简介和简单使用
1.knockout简介knockout是一个轻量级的UI类库,通过MVVM模式使JavaScript前端UI简单化knockout有四大重要概念:1)声明式绑定:使用简明移读的语法很容易地将模型(m ...
- MEF简介及简单的Demo
MEF简介及简单的Demo 文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门 ...
- Redis简介与简单安装
Redis简介与简单安装 一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类 ...
- gtest简介及简单使用
本文摘自 gtest简介及简单使用 ,在此感谢作者的分享. 具体使用教程 _______________________________________________________________ ...
- webUI框架miniUI,easyUI,extJS,Bootstrap简介及简单部署
本文为大家讲解的是webUI框架miniUI,easyUI,extJS,Bootstrap简介及简单部属,感兴趣的同学参考下 ExtJS是一种主要用于创建前端用户界面,是一个基本与后台技术无关的前端a ...
- Cgroup与LXC简介
原文地址: https://blog.51cto.com/speakingbaicai/1359825 一.Docker.LXC.Cgroup的结构关系 根据Docker布道师Jerome Petaz ...
- (转)Web Service入门简介(一个简单的WebService示例)
Web Service入门简介 一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从I ...
- Web Service入门简介(一个简单的WebService示例)
Web Service入门简介 一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从I ...
随机推荐
- C# convert between Image and Base64string
static void ImageMSDemo(string picPath) { byte[] imageArray = System.IO.File.ReadAllBytes(picPath); ...
- CSS3 过渡---transition
过渡(transition)是CSS3中具有颠覆性的特征之一,我们可以在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果. 过渡动画: 是从 ...
- hadoop mapreduce求解有序TopN
利用hadoop的map和reduce排序特性实现对数据排序取TopN条数据. 代码参考:https://github.com/asker124143222/wordcount 1.样本数据,假设是订 ...
- 【JavaWeb】实现二级联动菜单
实现效果 频道信息 package demo; public class Channel { private String code; //频道编码 private String name; //频道 ...
- 6-SQL子查询
(1) 什么是关联子查询,什么是非关联子查询 (嵌套查询) 子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做非关联子查询. 如 ...
- luoguP3531 [POI2012]LIT-Letters
(https://www.luogu.org/problem/P3531) 注意编号 #include<cstdio> #include<algorithm> #include ...
- 6.gitlab 备份
在配置文件有有默认的 备份路劲 sudo vim /etc/gitlab/gitlab.rb 默认在这个 路径下面 /var/opt/gitlab/backups 然后默认的备份时间是 7天 , ...
- Es6编程风格
let 取代 var let 和 const 之间优先使用 const 字符串 静态字符串一律使用单引号或反引号,不使用双引号 动态字符串使用反引号 `` 解构赋值 使用数组成员对变量赋值时,优先使用 ...
- IntelliJ IDEA常用配置(三)
提示:对于一些通用的设置可以配置成全局的. 1. 主题配置 File - Settings - Color Scheme,默认的是Default(一个白色主题),Darcula是一个黑色主题. 我们也 ...
- 第十周计划周二&周三计划
今天又一次被导师训了,怎么也达不到他的要求,好像我俩不在一条线上.所以现在重新整理一遍思路,继续走. 我认为重点还是主题追踪这一块,但是主题追踪的结果以及显示是个问题,目前还是打算做出来当天最热的前几 ...