定义 3 个操作 cgroup 的方法
对 cgroup 的操作主要是定义了 3 个方法,在方法中将 cgroup 抽象成了path,然后通过 path 去操作。
这 3 个方法是:
- Set(),设置 cgroupPath 对应的 cgroup 的资源限制。
- Apply(),将进程添加到某个 cgroup 中。
- Remove(),移出某个 cgroup。
以 memory 为例:
- 设置这个 cgroup 的内存限制,即将限制写入到 cgroup 对应目录的 memory.limit_in_bytes 文件中。
- 删除 cgroup 便是删除对应的 cgroupPath 的目录。
- 将一个进程加入到 cgroupPath 对应的 cgroup 中,就是把进程的 PID 写到 cgroup 的虚拟文件系统对应目录下的 “task”文件中。
如何找到 cgroupPath?
cgroupPath 是找到对应 subsystem 挂载 hierarchy 相对路径对应的 cgroup 在虚拟文件系统中的路径,然后通过这个目录的读写去操作 cgroup 。那么,是如何找到挂载了 subsystem 的 hierarchy 的挂载目录的呢?
通过 /proc/self/mountinfo ,可以找出与当前进程相关的 mount 信息。option 中加上 subsystem,代表挂载的 subsystem 类型,这样就可以在 mountinfo 中找到对应的 subsystem 的挂载目录了 ,比如 memory 。