定义 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 。

流程图

03091cf763c8f5d9279890b66dc826e.png