Linux Cgroups
Linux Cgroups 是 Linux 内核中用来为进程设置资源限制的一个重要功能. Cgroups将进程进行分组, 然后对这一组进程进行统一的资源监控和限制。Cgroups当前有V1和V2版本,为了后续用于实现简单容器sdocker,这里只验证V1版本的cpu和memory子系统。
Linux可以通过如下命令来查看当前系统支持的cgroup子系统:
有的系统(debian8/suse12), cgroup.memory没有启用, 这时可能会影响到下面几个方面:
解决办法, 在/etc/default/grub文件中增加如下选项(debian使用update_grub, suse使用grub2-mkconfig, 然后reboot):
Cgroup.CPU
对于Cgroup.CPU,限制cpu利用率主要通过修改下面两个文件来实现:
把cpu.cfs_quota_us / cpu.cfs_period_us(默认100000)的值作为可以使用的CPU的百分比。使用方法举例如下(摘录自附录网页):
针对Cgroup.CPU进行测试,对于如下的cpu密集型程序, 启动后从top中可以看到cpu占用100%:
通过给cpu.cfs_quota_us赋值20000,同时把程序pid赋值给tasks文件,让程序只能使用1/5的cpu。
设置后立即生效,top可以看到进程cpu占用率在20%左右波动:
退出程序并清理cgroup资源:
Cgroup.Memory
/sys/fs/cgroup/memory下定义了Cgroup.Memory子系统的相关文件, 各文件含义如下:
针对Cgroup.Memory进行测试,如下的测试代码通过不断分配内存来触发内存限制功能:
memory.cpp
设置内存限制6m到memory.limit_in_bytes,同时把进程pid设置到tasks文件, 一段时间后可以看到进程oom-kill.
测试发现进程实际打印分配的总内存远远大于设置的内存上限时, memory.usage_in_bytes中的数值才会慢慢趋近于memory.limit_in_bytes,即使设置memory.swappiness为0也如此;
参考网址: