既然 cgroups 是以这些文件作为 API 的,那么我就可以通过创建或者是修改这些文件的内容来应用 cgroups。具体该怎么做呢?比如我们怎么才能限制某个进程可以使用的资源呢?接下来我们就通过简单的 demo 来演示如何使用 cgroups 限制进程可以使用的资源。
cgroups 工具
在介绍通过 systemd 应用 cgroups 之前,我们先使用 cgroup-bin 工具包中的 cgexec 来演示 demo。Ubuntu 默认没有安装 cgroup-bin 工具包,请通过下面的命令安装:
$ sudo apt install cgroup-bin
demo:限制进程可用的 CPU
在我们使用 cgroups 时,最好不要直接在各个子系统的根目录下直接修改其配置文件。推荐的方式是为不同的需求在子系统树中定义不同的节点。比如我们可以在 /sys/fs/cgroup/cpu 目录下新建一个名称为 nick_cpu 的目录:
$ cd /sys/fs/cgroup/cpu $ sudo mkdir nick_cpu
然后查看新建的目录下的内容:

是不是有点吃惊,cgroups 的文件系统会在创建文件目录的时候自动创建这些配置文件!
让我们通过下面的设置把 CPU 周期限制为总量的十分之一:
$ sudo su$ echo 100000 > nick_cpu/cpu.cfs_period_us $ echo 10000 > nick_cpu/cpu.cfs_quota_us
上面的两个参数眼熟吗?没错,笔者在《Docker: 限制容器可用的 CPU》一文中介绍的 "--cpu-period=100000 --cpu-quota=200000" 就是由它们实现的。
然后创建一个 CPU 密集型的程序:
void main()
{ unsigned int i, end;
end = 1024 * 1024 * 1024;
for(i = 0; i < end;
) { i ++; }}
保存为文件 cputime.c 编译并通过不同的方式执行:
$ gcc cputime.c -o cputime $ sudo su$ time ./cputime $ time cgexec -g cpu:nick_cpu ./cputime

time 命令可以为我们报告程序执行消耗的时间,其中的 real 就是我们真实感受到的时间。使用 cgexec 能够把我们添加的 cgroup 配置 nick_cpu 应用到运行 cputime 程序的进程上。 上图显示,默认的执行只需要 2s 左右。通过 cgroups 限制 CPU 资源后需要运行 23s。
demo:限制进程可用的内存
这次我们来限制进程可用的最大内存,在 /sys/fs/cgroup/memory 下创建目录nick_memory:
$ cd /sys/fs/cgroup/memory $ sudo mkdir nick_memory
下面的设置把进程的可用内存限制在最大 300M,并且不使用 swap:
# 物理内存 + SWAP <= 300 MB;1024*1024*300 = 314572800$ sudo su$ echo 314572800 > nick_memory/memory.limit_in_bytes$ echo 0 > nick_memory/memory.swappiness
然后创建一个不断分配内存的程序,它分五次分配内存,每次申请 100M:








