如何检查 Linux 中是否配置了控制组

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何检查你的 Linux 系统是否配置了控制组(cgroups)。控制组是一个强大的内核特性,用于管理和控制进程的资源使用情况。

你将通过以下操作来实现这一目标:使用 cat /proc/cgroups 列出可用的控制组子系统,检查 /sys/fs/cgroup 中的控制组挂载点,以及验证控制组配置文件 /etc/cgconfig.conf。这些步骤将全面概述你系统的控制组设置情况。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") subgraph Lab Skills linux/ls -.-> lab-558700{{"如何检查 Linux 中是否配置了控制组"}} linux/cat -.-> lab-558700{{"如何检查 Linux 中是否配置了控制组"}} end

使用 cat /proc/cgroups 列出控制组

在这一步中,你将学习如何列出你的 Linux 系统上可用的控制组(cgroup)子系统。控制组(control groups)是 Linux 内核的一个特性,它允许你将进程组织成层次化的组,并控制它们的资源使用情况(如 CPU、内存、磁盘 I/O、网络等)。

你可以将控制组看作是一种为特定应用程序或用户设置资源限制或分配资源的方式。这对于有效管理系统资源至关重要,特别是在容器或云计算等环境中。

/proc 文件系统是一个虚拟文件系统,它提供有关进程和其他系统信息。/proc/cgroups 文件包含了你的内核所支持的控制组子系统的详细信息。

要查看可用的控制组子系统,你将使用 cat 命令。cat 命令是一个基本的 Linux 实用工具,用于显示文件的内容。

如果终端尚未打开,请打开它。你可以通过点击桌面左侧的 Xfce Terminal 图标来打开终端。

现在,在终端中输入以下命令并按回车键:

cat /proc/cgroups

你应该会看到类似以下的输出:

#subsys_name    hierarchy       num_cgroups     enabled
cpuset  0       1       1
cpu     0       1       1
cpuacct 0       1       1
blkio   0       1       1
memory  0       1       1
devices 0       1       1
freezer 0       1       1
net_cls 0       1       1
perf_event      0       1       1
net_prio        0       1       1
hugetlb 0       1       1
pids    0       1       1
rdma    0       1       1

让我们来详细分析一下这个输出:

  • #subsys_name:控制组子系统的名称(例如,cpumemoryblkio)。每个子系统控制一种特定类型的资源。
  • hierarchy:子系统所连接的层次结构的 ID。在这个输出中,所有子系统都连接到层次结构 0,这是较新的 Linux 发行版中的默认统一层次结构。
  • num_cgroups:当前在此子系统的层次结构中创建的控制组的数量。
  • enabled:表示该子系统在内核中是启用(1)还是禁用(0)。

这个输出向你展示了哪些资源控制功能在你的系统上可用且处于活动状态。了解这些子系统是学习如何使用控制组管理资源的第一步。

点击 Continue 进入下一步。

检查 /sys/fs/cgroup 中的控制组挂载点

在上一步中,你已经了解了可用的控制组(cgroup)子系统。现在,让我们来探究这些控制组在文件系统中的挂载位置。在 Linux 系统中,控制组通常通过虚拟文件系统来呈现,一般挂载在 /sys/fs/cgroup 目录下。

/sys 文件系统是另一个虚拟文件系统,它为内核数据结构提供了一个接口,常用于配置和监控硬件以及内核特性。/sys/fs/cgroup 目录是控制组文件系统的标准挂载点。

为了查看该目录的内容,并了解控制组的层次结构是如何组织的,你将使用 ls 命令。ls 命令用于列出目录的内容。

如果终端尚未打开,请打开它。

在终端中输入以下命令并按下回车键:

ls /sys/fs/cgroup

你应该会看到类似以下的输出:

cgroup.controllers  cgroup.max.depth  cgroup.max.descendants  cgroup.stat  cgroup.subtree_control  cgroup.threads  cpu  cpu.stat  cpu.pressure  cpuset  cpuset.cpus  cpuset.mems  cpuset.stat  io  io.stat  io.pressure  memory  memory.stat  memory.pressure  memory.swap.max  memory.high  memory.low  memory.min  memory.swap.current  memory.current  memory.events  memory.events.local  pids  pids.current  pids.max  systemd  user.slice

这个输出展示了 /sys/fs/cgroup 目录下的目录和文件。在使用统一控制组层次结构(cgroup v2)的系统中,你会看到像 cgroup.controllerscgroup.stat 这样的文件,以及与挂载的控制器相对应的目录(如 cpumemoryiopids)。

这些目录(如 cpumemory 等)中的每一个都代表一个控制组控制器。在这些目录内部,你会找到一些文件,这些文件允许你配置和监控该控制组内进程的资源限制。

例如,如果你进入 cpu 目录,你会找到与 CPU 资源控制相关的文件。

让我们使用 ls 命令快速查看 cpu 目录内部的情况:

ls /sys/fs/cgroup/cpu

你可能会看到如下输出:

cgroup.controllers  cgroup.events  cgroup.freeze  cgroup.max.depth  cgroup.max.descendants  cgroup.stat  cgroup.subtree_control  cgroup.threads  cpu.max  cpu.stat  cpu.weight  cpu.pressure

这些文件(如 cpu.maxcpu.weight)用于为控制组设置 CPU 限制和优先级。

理解 /sys/fs/cgroup 的结构是使用控制组的关键,因为你将直接在这里与它们进行交互。

点击 Continue 进入下一步。

使用 cat /etc/cgconfig.conf 验证控制组配置

在前面的步骤中,你了解了可用的控制组(cgroup)子系统以及它们在文件系统中的挂载位置。现在,让我们来看看一个常见的控制组配置文件:/etc/cgconfig.conf

虽然可以通过 /sys/fs/cgroup 文件系统直接管理控制组,但像 /etc/cgconfig.conf 这样的配置文件通常用于在系统启动时定义控制组的层次结构和初始设置。该文件是 cgroup-tools 软件包的一部分,该软件包提供了管理控制组的实用工具。

cgconfig 服务(如果已安装并启用)会读取 /etc/cgconfig.conf 文件,以便在系统启动时设置控制组的层次结构并挂载控制器。查看这个文件可以让你了解系统上控制组的配置方式。

你将再次使用 cat 命令来显示这个配置文件的内容。

如果终端尚未打开,请打开它。

在终端中输入以下命令并按下回车键:

cat /etc/cgconfig.conf

你应该会看到类似以下的输出(具体内容可能因系统配置而异):

#
## A sample configuration file for cgconfig.
#
## The file contains two sections:
##   mount: defines the hierarchy and where to mount it.
##   group: defines the cgroup and its parameters.
#
## Example:
#
#mount {
##       cpuset = /cgroup/cpuset;
##       cpu = /cgroup/cpu;
##       cpuacct = /cgroup/cpuacct;
##       memory = /cgroup/memory;
##       devices = /cgroup/devices;
##       freezer = /cgroup/freezer;
##       net_cls = /cgroup/net_cls;
##       blkio = /cgroup/blkio;
#}
#
#group staff {
##       perm {
##               task {
##                       uid = staff;
##                       gid = staff;
##               }
##               admin {
##                       uid = staff;
##                       gid = staff;
##               }
##       }
##       cpu {
##               cpu.shares = 1000;
##       }
##       memory {
##               memory.limit_in_bytes = 256M;
##       }
#}
#
#group / {
##       cpu {
##               cpu.shares = 1024;
##       }
#}

在这个示例输出中,你可以看到带有注释(#)的部分,这些部分展示了如何为不同的控制器定义挂载点,以及如何创建具有特定资源限制(例如 cpu.sharesmemory.limit_in_bytes)的控制组(如 staff)。

如果该文件为空或仅包含注释,这意味着控制组的层次结构和初始组不是通过这个特定文件进行配置的。在现代系统中,systemd 通常使用挂载在 /sys/fs/cgroup 的统一层次结构来处理控制组的管理。

即使这个文件在你的系统上没有被积极用于配置,了解它的存在和用途对于理解如何管理控制组也是很重要的。

你现在已经探索了可用的控制组子系统、它们在文件系统中的挂载点以及一个常见的配置文件。这让你对 Linux 系统上控制组的结构和潜在配置有了基本的了解。

点击 Continue 完成本次实验。

总结

在本次实验中,你学习了如何检查 Linux 系统上是否配置了控制组(cgroup)。你首先使用 cat /proc/cgroups 命令列出了内核支持的可用控制组子系统,并理解了输出列,如 subsys_namehierarchynum_cgroupsenabled。这一步让你了解了哪些资源控制机制处于激活状态。

接下来,你通过检查 /sys/fs/cgroup 目录来验证控制组的挂载点,该目录是控制组层次结构的标准挂载位置。最后,你查看了 /etc/cgconfig.conf 文件,以确定是否定义了任何持久的控制组配置,不过这个文件可能在所有系统上都不存在或未被使用,特别是那些依靠 systemd 进行控制组管理的系统。这些步骤共同展示了如何确定 Linux 系统上控制组的存在和基本配置。