前面一章,我们学习了cgroup的一些基础,这章我们开始学习在目前的系统中如何使用,在linux上,为了操作Cgroup,有一个专门的Cgroup文件系统,我们运行mount命令可以查看
cgroup 文件系统多挂载到 /sys/fs/cgroup 下,通过上面的命令行,我们可以看到我们可以用 cgroup 控制哪些资源。我们在 /sys/fs/cgroup/ 下面能看到下面的目录结构
我们可以想象,CPU 的资源控制的配置文件,应该在 cpu,cpuacct 这个文件夹下面。
我们看到了 cgroup 对于 Docker 资源的控制,在用户态是如何表现的,如下图所示
在 ubuntu
系统中(包括 Red Hat Enterprise Linux 7),通过将 cgroup 层级系统与 systemd 单位树捆绑,可以把资源管理设置从进程级别移至应用程序级别。默认情况下,systemd 会自动创建 slice
、scope
和 service
单位的层级(具体的意思稍后再解释),来为 cgroup 树提供统一结构。可以通过 systemctl
命令创建自定义 slice 进一步修改此结构。
如果我们将系统的资源看成一块馅饼,那么所有资源默认会被划分为 3 个 cgroup:System
, User
和 Machine
。每一个 cgroup 都是一个 slice
,每个 slice 都可以有自己的子 slice,如下图所示
下面我们以 CPU 资源为例,来解释一下上图中出现的一些关键词。
如上图所示,系统默认创建了 3 个顶级 slice
(System
, User
和 Machine
),每个 slice 都会获得相同的 CPU 使用时间(仅在 CPU 繁忙时生效),如果 user.slice
想获得 100%
的 CPU 使用时间,而此时 CPU 比较空闲,那么 user.slice
就能够如愿以偿。这三种顶级 slice 的含义如下:
- system.slice —— 所有系统 service 的默认位置
- user.slice —— 所有用户会话的默认位置。每个用户会话都会在该 slice 下面创建一个子 slice,如果同一个用户多次登录该系统,仍然会使用相同的子 slice。
- machine.slice —— 所有虚拟机和 Linux 容器的默认位置
控制 CPU 资源使用的其中一种方法是 shares
。shares 用来设置 CPU 的相对值(你可以理解为权重),并且是针对所有的 CPU(内核),默认值是 1024。因此在上图中,httpd, sshd, crond 和 gdm 的