systemd
是 Linux 的一个初始化系统和服务管理器,它依赖于 Linux 内核的 cgroups
(Control Groups)功能来实现对系统资源的高效管理。以下是对两者关系的详细解读:
1. 什么是 cgroups?
cgroups
是 Linux 内核提供的一种资源管理功能,允许将进程组织成组,并对这些组的资源使用进行限制和监控。它主要支持以下功能:
- 资源限制:限制 CPU、内存、I/O 等资源的使用量。
- 优先级分配:为不同的进程组分配不同的资源优先级。
- 资源统计:监控资源使用情况。
- 进程隔离:隔离不同进程的资源使用。
- 冻结和恢复:暂停或恢复一组进程的执行。
2. systemd 中的 cgroups 支持
systemd
是 cgroups
的核心用户之一,它通过 cgroups
来管理系统服务和用户会话。每当 systemd
启动一个服务时,它会为该服务创建一个专属的 cgroup
,用于隔离和管理其资源。
特性:
- 每个服务独立的 cgroup:每个通过
systemd
启动的服务都会在cgroups
中创建一个层级(例如/sys/fs/cgroup/system.slice/<service_name>.service
)。 - 支持 cgroups v1 和 v2:
systemd
支持 cgroups 的两种版本,cgroups v2 是默认的,提供了统一的资源控制接口。 - 动态管理:可以在服务运行时动态调整其资源限制。
3. systemd 和 cgroups 的层次结构
在 systemd 中,服务、用户会话等都映射到 cgroups
的层次结构。主要的层次有:
- slice(切片):
- 是 cgroups 的顶层分类,用于组织资源。
- 常见的 slice:
system.slice
:用于管理系统服务。user.slice
:用于管理用户会话。machine.slice
:用于管理虚拟机和容器。
- scope(作用域):
- 一组相关的进程,但不由
systemd
启动。例如,通过dbus
添加的用户会话。
- 一组相关的进程,但不由
- service(服务):
- 由
systemd
管理的服务,每个服务都对应一个 cgroup。
- 由
示例路径:
/sys/fs/cgroup/system.slice/sshd.service
:sshd
服务的 cgroup。/sys/fs/cgroup/user.slice/user-1000.slice
:用户 ID 为 1000 的用户会话。
4. 常用配置和操作
配置文件:
systemd
提供了一些参数用于配置服务的资源控制,它们通常放在 .service
文件中,例如:
- CPU 限制:
CPUQuota=
:限制服务的 CPU 使用百分比。例如,CPUQuota=50%
表示最多使用 50% 的 CPU。
- 内存限制:
MemoryLimit=
:限制服务的最大内存使用量。
- I/O 限制:
IOWeight=
:设置服务的 I/O 权重。
运行时管理:
通过 systemctl
和 systemd-cgls
工具可以查看和管理 cgroups:
- 查看服务状态及其资源限制:
systemctl status <service_name>
- 查看 cgroups 层次结构:
systemd-cgls
- 动态调整资源:
systemctl set-property <service_name> MemoryLimit=500M
5. cgroups v2 的改进
在 cgroups v2 中,资源控制接口被统一,不再像 v1 那样分为多个子系统(subsystems)。主要改进包括:
- 单一层次结构:所有 cgroup 控制器共享一个层次。
- 更简单的 API:统一的资源配置文件格式,便于管理。
- 更强的隔离:子 cgroup 无法影响父 cgroup 的行为。
systemd
对 cgroups v2 的支持已经非常成熟,并在现代发行版中默认启用。
6. 实战案例:限制服务资源
以 nginx.service
为例,限制其 CPU 使用为 50%,内存为 512MB:
- 编辑配置:
systemctl set-property nginx.service CPUQuota=50% systemctl set-property nginx.service MemoryLimit=512M
- 重启服务:
systemctl restart nginx.service
- 查看限制:
systemctl show nginx.service | grep -E "CPUQuota|MemoryLimit"
通过结合 systemd
和 cgroups
,Linux 系统可以实现强大的资源管理和隔离,适用于服务的性能优化和稳定性保障。