内容简介:cgroups 是 Linux 内核中的一个功能,用来限制、控制分离一个进程的资源,比如 CPU、内存、IO 等。cgroups 是由一组子系统构成,每种子系统即时一种资源,目前可使用的资源如下:cgroups 中有个 hierarchy 的概念,意思一组 cgroup 是一棵树,cgroup2 可以挂在 cgroup 1 上,这样可以从 cgroup1 中继承设置。
cgroups 是 Linux 内核中的一个功能,用来限制、控制分离一个进程的资源,比如 CPU、内存、IO 等。
cgroups 是由一组子系统构成,每种子系统即时一种资源,目前可使用的资源如下:
- cpu:限制 cpu 的使用率
- cpuacct:cpu 的统计报告
- cpuset:分配 cpu
- memory:分配 mem 的使用量
- blkio:限制块设备的 io
- devices:能够访问的设备
- net_cls:控制网络数据的访问
- net_prio:网络流量包的优先级
- freezer:pause 或者 resume 进程
- ns:控制 namespace 的访问
cgroups 中有个 hierarchy 的概念,意思一组 cgroup 是一棵树,cgroup2 可以挂在 cgroup 1 上,这样可以从 cgroup1 中继承设置。
所以 process、subsystem、hierarchy 存在一些关系。
- 一个 subsystem 只能附加到一个 hierarchy
- 一个 hierarchy 可以附加到多个 subsystem 中
- 一个 process 可以作为多个 cgroups 成员,但是要在不同的 hierarchy 中
- fork 出的子进程默认和父进程使用一个 cgroups,但是可以移动到其他的 cgroups 中
在 linux 中 /sys/fs/cgroup 中是 cgroups 默认的 hierarchy,可以看到目前的 subsystem
dr-xr-xr-x 6 root root 0 Dec 17 17:31 blkio lrwxrwxrwx 1 root root 11 Dec 17 17:31 cpu -> cpu,cpuacct dr-xr-xr-x 6 root root 0 Dec 17 17:31 cpu,cpuacct lrwxrwxrwx 1 root root 11 Dec 17 17:31 cpuacct -> cpu,cpuacct dr-xr-xr-x 4 root root 0 Dec 17 17:31 cpuset dr-xr-xr-x 6 root root 0 Dec 17 17:31 devices dr-xr-xr-x 4 root root 0 Dec 17 17:31 freezer dr-xr-xr-x 7 root root 0 Dec 17 17:31 memory lrwxrwxrwx 1 root root 16 Dec 17 17:31 net_cls -> net_cls,net_prio dr-xr-xr-x 3 root root 0 Dec 17 17:31 net_cls,net_prio lrwxrwxrwx 1 root root 16 Dec 17 17:31 net_prio -> net_cls,net_prio dr-xr-xr-x 3 root root 0 Dec 17 17:31 perf_event dr-xr-xr-x 3 root root 0 Dec 17 17:31 pids dr-xr-xr-x 5 root root 0 Dec 17 17:31 systemd
假如我们想给一个进程添加内存限制,第一步需要创建一个 hierarchy 在 /sys/fs/cgroup/memory 中
sudo mkdir /sys/fs/cgroup/memory/mytestcgroup
系统会帮助我们创建一系列文件,这是因为我们挂载的类型是 cgroup,cgroup 的 hierarchy 目录会被映射成文件目录,方便操作:
-rw-r--r-- 1 root root 0 Apr 14 21:36 cgroup.clone_children --w--w--w- 1 root root 0 Apr 14 21:36 cgroup.event_control -rw-r--r-- 1 root root 0 Apr 14 21:36 cgroup.procs -rw-r--r-- 1 root root 0 Apr 14 21:36 memory.failcnt --w------- 1 root root 0 Apr 14 21:36 memory.force_empty -rw-r--r-- 1 root root 0 Apr 14 21:36 memory.limit_in_bytes -rw-r--r-- 1 root root 0 Apr 14 21:36 memory.max_usage_in_bytes -rw-r--r-- 1 root root 0 Apr 14 21:36 memory.memsw.failcnt -rw-r--r-- 1 root root 0 Apr 14 21:36 memory.memsw.limit_in_bytes -rw-r--r-- 1 root root 0 Apr 14 21:36 memory.memsw.max_usage_in_bytes -r--r--r-- 1 root root 0 Apr 14 21:36 memory.memsw.usage_in_bytes -rw-r--r-- 1 root root 0 Apr 14 21:36 memory.move_charge_at_immigrate -r--r--r-- 1 root root 0 Apr 14 21:36 memory.numa_stat -rw-r--r-- 1 root root 0 Apr 14 21:36 memory.oom_control ---------- 1 root root 0 Apr 14 21:36 memory.pressure_level -rw-r--r-- 1 root root 0 Apr 14 21:36 memory.soft_limit_in_bytes -r--r--r-- 1 root root 0 Apr 14 21:36 memory.stat -rw-r--r-- 1 root root 0 Apr 14 21:36 memory.swappiness -r--r--r-- 1 root root 0 Apr 14 21:36 memory.usage_in_bytes -rw-r--r-- 1 root root 0 Apr 14 21:36 memory.use_hierarchy -rw-r--r-- 1 root root 0 Apr 14 21:36 notify_on_release -rw-r--r-- 1 root root 0 Apr 14 21:36 tasks
在上面的文件中我们可以看到 tasks,这里面放着就是被限制的进程 pid,我们把当前 session 的 pid 放入 task 中,以后从这个 session 启动的进程将会被限制,比如限制一下内存只能使用 100m。
sudo bash -c "echo "100m" > memory.limit_in_bytes" sudo bash -c "echo $$ > tasks"
然后使用 stress 工具启动一个测压
stress --vm-bytes 200m --vm-keep -m 1
最后通过 top 等 工具 可以发现内存被限制到了 100m。
Go 语言控制 cgroup
Go 语言中并没有特殊的 API 接口来处理 cgroup,依然是通过和命令行一样的模式(读写文件)来控制 cgroup。
所以,在 go 语言中就是创建文件夹,删除文件加,写入文件这三个操作来使用 cgroup 功能。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- APUE 学习笔记——进程控制
- 如何在 Go 中使用 CGroup 实现进程内存控制
- 如何在 Go 中使用 CGroup 实现进程内存控制
- Firefox 69 Beta 9 发布,提供控制进程优先级的能力
- 进程:进程生命周期
- Python 知识巩固:通过主进程带起多个子进程实现多进程执行逻辑
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Impractical Python Projects
Lee Vaughan / No Starch Press / 2018-11 / USD 29.95
Impractical Python Projects picks up where the complete beginner books leave off, expanding on existing concepts and introducing new tools that you’ll use every day. And to keep things interesting, ea......一起来看看 《Impractical Python Projects》 这本书的介绍吧!