一、Cgroups
- Cgroups (Control Groups) 是 Linux 下用于对一个或一组进程进行资源控制和监控的机制;
- 可以对诸如CPU使用时间、内存、磁盘I/O等进程所需的资源进行限制;
- 不同资源的具体管理工作由相应的Cgroup 子系统(Subsystem)来实现;
- 针对不同类型的资源限制,只要将限制策略在不同的的子系统上进行关联即可;
- Cgroups在不同的系统资源管理子系统中以层级树(Hierarchy)的方式来组织管理:每个Cgroup都可以包含其他的子Cgroup,因此子Cgroup能使用的资源除了受本Cgroup 配置的资源参数限制,还受到父Cgroup 设置的资源限制。
- 在cgroup中,使用 task(任务) 来表示系统的一个进程或线程。
二、子系统
- blkio: 这个子系统设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及USB等等
- cpu: 这个子系统使用调度程序为cgroup任务提供CPU的访问
- cpuacct: 产生cgroup任务的CPU资源报告
- cpuset: 如果是多核心的CPU,这个子系统会为cgroup任务分配单独的CPU和内存
- devices: 允许或拒绝cgroup 任务对设备的访问
- freezer: 暂停和恢复 cgroup 任务
- memory: 设置每个cgroup的内存限制以及产生内存资源报告
- net_cls: 标记每个网络包以供cgroup方便使用
- ns: 名称空间子系统
- pid: 进程标识子系统
三、示例
3.1 cpu子系统
busyloop:
package main
func main(){go func(){for{}}()for{}
}
1.运行busyloop,top查看 CPU 使用情况,CPU 占用 200%:
2.通过cgroup 限制 cpu:
#在cgroup cpu 子系统目录中创建目录
#创建完之后在目录中自动生成一些文件,只需要修改文件的配置就可以
cd/sys/fs/cgroup/cpu
mkdir cpudemo
3.把进程添加到cgroup.procs
echo $(ps -ef | grep busyloop | grep -v grep | awk '{print $2}') > cgroup.procs
echo 10000> cpu.cfs_quota_us
4.进程的cpu限制到了10%
cpu.cfs_period_us ,是CFS 调度的周期,默认是 100000,单位是 microseconds 也就是 100ms
cpu.cfs_quota_us 在一个调度周期里,这个控制组被允许的运行时间,比如 30000 ,就是 30ms
这两个参数进行除法 cpu.cfs_quota_us/cpu.cfs_period_us ,比如 10ms /100ms = 0.1 ,表示这个控制组被允许使用的CPU最大配额是 0.1个cpu