从第一原理出发的 Linux cgroup

主要观点:作者花费两周学习 Linux 的 cgroup 概念后,为下一位勇敢者写下此内容,推荐 Facebook 的 cgroup2 资源,重点介绍 cgroup v2,其在 2016 年 Linux 内核 4.5 中引入,设计更简单。Linux 控制组可限制资源分配,如内存、CPU 和网络带宽,通过 NixOS VM 示例演示。
关键信息:

  • cgroup 有 v2 和 v1 实现区别,v2 更简单,本文以 v2 为例。
  • Linux“一切皆文件”哲学,可通过读写文件与内核通信。
  • cgroup 位于 /sys/fs/cgroup 目录下,可通过 /proc/self/cgroup 查看当前登录 shell 的 cgroup。
  • 可创建 cgroup 目录结构,如 /sys/fs/cgroup/demo/ 下的子目录。
  • cgroup 中有各种虚拟文件,如用于设置控制器值的文件和提供实时统计信息或事件的文件。
  • 通过 echo 命令设置 cgroup.subtree_control 启用控制器,通过写入 pid 到 cgroup.procs 文件更改进程的 cgroup。
  • 可编写程序如 hog.c 来测试内存限制,编写 throttled.c 测试 CPU 限制,使用 cgexec 工具在特定 cgroup 中运行程序。
    重要细节:
  • 编写程序时要注意 memset 为 1 避免编译器或内核优化,否则可能未实际分配新内存。
  • 最初 /sys/fs/cgroup/demo 的 cgroup.subtree_control 为空,子 cgroup 也缺少相关文件。
  • 限制进程时,用户需有共同祖先的写权限,如 /sys/fs/cgroup ,否则需使用 sudo。
  • 控制组可提供额外隔离层和性能基准测试工具,虽起初看似困难,但“一切皆文件”哲学使其易于上手,且可忽略 systemd 增加的复杂性,希望内核能提供更有用的错误消息。
阅读 18
0 条评论