- 01 简介
- 02 查看限制
- 03 可配置的参数
- 3.1 CPU限制
- 3.1.1 CPU时间分配
- 3.1.2 CPU亲核性
- 3.2 内存限制
- 3.2.1 硬内存上限
- 3.2.2 软内存限制
- 3.3 IO限制
- 3.3.1 读写带宽限制
- 3.3.2 IO优先级
- 3.4 限制进程数量
- 3.5 限制文件描述符最大大小
- 3.6 核心转储限制
- 3.7 指定用户和用户组
- 3.8 禁止提权
- 3.9 沙箱隔离
- 3.1 CPU限制
- 4.0 注意
01 简介
本指南介绍如何通过 systemd
管理服务单元的资源限制,包括查看服务状态和配置常见资源限制参数(如 CPU、内存、IO 等)。
配置通常通过编辑服务文件(位于 /etc/systemd/system/<service_name>.service
或使用 systemctl edit <service_name>
创建覆盖配置)实现。修改后需运行以下命令使配置生效:
systemctl daemon-reload
systemctl restart <service_name>
02 查看限制
使用以下命令查看某个 systemd 服务单元的运行状态和资源限制详情(如 CPU、内存、进程数等):
systemctl show <service_name>
如:查看 Nginx 服务的限制:
systemctl show nginx
输出结果为:
# 服务启动类型
# Type=forking: 表示服务通过 fork() 创建子进程,父进程退出,子进程继续运行。
# 常见于传统守护进程(如 nginx、apache),systemd 会根据 PIDFile 或 GuessMainPID 跟踪主进程。
Type=forking# 退出类型
# ExitType=main: 表示服务退出时仅考虑主进程的退出状态,而不关注其他子进程。
# 这确保 systemd 仅基于主进程的退出码判断服务的状态。
ExitType=main# 重启策略
# Restart=no: 表示服务退出后不自动重启。
# 可选值包括 always(总是重启)、on-success(成功退出时重启)、on-failure(失败退出时重启)等。
Restart=no# 重启模式
# RestartMode=normal: 定义重启行为的模式,通常与 Restart 参数配合使用。
# normal 表示按常规方式处理重启,较少使用其他模式(如 aggressive)。
RestartMode=normal# 主进程 PID 文件
# PIDFile=/run/nginx.pid: 指定服务主进程的 PID 文件路径。
# systemd 使用该文件跟踪主进程,Type=forking 时通常需要设置。
PIDFile=/run/nginx.pid# 通知访问控制
# NotifyAccess=none: 表示服务不通过 systemd 的通知机制(sd_notify)与 systemd 通信。
# 其他值如 main(仅主进程通知)、all(所有进程通知)适用于支持 systemd 通知的服务。
NotifyAccess=none# 重启间隔时间
# RestartUSec=100ms: 设置服务重启之间的最小间隔时间,单位为微秒(100ms = 0.1秒)。
# 防止服务因频繁重启导致系统过载。
RestartUSec=100ms# 重启步骤
# RestartSteps=0: 定义重启的步骤数,通常与 RestartMaxDelayUSec 配合用于指数退避重启策略。
# 设置为 0 表示不使用分步重启。
RestartSteps=0# 最大重启延迟
# RestartMaxDelayUSec=infinity: 设置重启延迟的最大值,infinity 表示无上限。
# 若启用指数退避策略,此参数限制最大延迟时间。
RestartMaxDelayUSec=infinity# 下一次重启间隔
# RestartUSecNext=100ms: 指定下一次重启的间隔时间,当前为 100 毫秒。
# 通常由 systemd 内部动态设置,配合 RestartSteps 使用。
RestartUSecNext=100ms# 启动超时时间
# TimeoutStartUSec=1min 30s: 服务启动的最大允许时间(1 分 30 秒)。
# 若启动时间超过此值,systemd 将认为启动失败并采取 TimeoutStartFailureMode 定义的动作。
TimeoutStartUSec=1min 30s# 停止超时时间
# TimeoutStopUSec=5s: 服务停止的最大允许时间(5 秒)。
# 若停止时间超过此值,systemd 将采取 TimeoutStopFailureMode 定义的动作。
TimeoutStopUSec=5s# 终止超时时间
# TimeoutAbortUSec=5s: 服务强制终止(SIGKILL)的超时时间(5 秒)。
# 若服务未在 TimeoutStopUSec 内正常停止,systemd 将发送 SIGKILL 信号。
TimeoutAbortUSec=5s# 启动失败处理模式
# TimeoutStartFailureMode=terminate: 定义启动超时时采取的动作,terminate 表示终止服务进程。
# 其他可选值包括 kill(强制杀死)或 ignore(忽略超时)。
TimeoutStartFailureMode=terminate# 停止失败处理模式
# TimeoutStopFailureMode=terminate: 定义停止超时时采取的动作,terminate 表示终止服务进程。
# 与 TimeoutStartFailureMode 类似。
TimeoutStopFailureMode=terminate# 最大运行时间
# RuntimeMaxUSec=infinity: 设置服务最大运行时间,infinity 表示无限制。
# 若设置具体时间(如 1h),服务运行超过该时间将被终止。
RuntimeMaxUSec=infinity# 运行时间随机额外延迟
# RuntimeRandomizedExtraUSec=0: 为最大运行时间添加随机延迟,0 表示无额外延迟。
# 用于避免多个服务同时超时,减轻系统压力。
RuntimeRandomizedExtraUSec=0# 看门狗超时时间
# WatchdogUSec=0: 设置看门狗超时时间,0 表示禁用看门狗机制。
# 若启用(需服务支持),服务需定期向 systemd 发送心跳信号,否则将被终止。
WatchdogUSec=0# 看门狗时间戳
# WatchdogTimestampMonotonic=0: 记录看门狗机制的单调时间戳,0 表示未启用或未记录。
# 由 systemd 内部维护,通常无需手动设置。
WatchdogTimestampMonotonic=0# 是否仅在根目录下启动
# RootDirectoryStartOnly=no: 表示启动服务时不要求特定根目录。
# 若为 yes,服务需在指定的 RootDirectory 下启动。
RootDirectoryStartOnly=no# 是否在退出后保持服务状态
# RemainAfterExit=no: 服务退出后,systemd 不会保持其状态为“活跃”。
# 若为 yes,服务退出后仍被视为运行,适用于某些特殊服务。
RemainAfterExit=no# 是否猜测主进程 PID
# GuessMainPID=yes: 若未设置 PIDFile,systemd 将尝试猜测主进程的 PID。
# 仅在 Type=forking 时有效,yes 表示启用猜测。
GuessMainPID=yes# 当前主进程 PID
# MainPID=2007: 当前服务的主进程 PID,由 systemd 自动设置。
# 表示当前运行的主进程 ID(此处为 2007)。
MainPID=2007# 控制进程 PID
# ControlPID=0: 用于控制服务启动、停止等操作的进程 PID,0 表示无控制进程。
# 通常由 systemd 动态管理。
ControlPID=0# 文件描述符存储最大数量
# FileDescriptorStoreMax=0: 服务可存储的文件描述符数量上限,0 表示不存储。
# 用于支持文件描述符传递的特殊场景。
FileDescriptorStoreMax=0# 当前存储的文件描述符数量
# NFileDescriptorStore=0: 当前存储的文件描述符数量,0 表示无存储。
# 由 systemd 自动维护。
NFileDescriptorStore=0# 文件描述符存储保留策略
# FileDescriptorStorePreserve=restart: 定义文件描述符存储在服务重启时的保留策略。
# restart 表示仅在服务重启时保留描述符。
FileDescriptorStorePreserve=restart# 服务状态错误码
# StatusErrno=0: 服务状态的错误码,0 表示无错误。
# 非零值表示服务运行中遇到问题。
StatusErrno=0# 服务运行结果
# Result=success: 服务当前运行结果,success 表示运行正常。
# 其他值包括 failed(失败)、timeout(超时)等。
Result=success# 服务重载结果
# ReloadResult=success: 服务重载(reload)操作的结果,success 表示重载成功。
# 仅在服务支持 reload 操作时有效。
ReloadResult=success# 服务清理结果
# CleanResult=success: 服务清理操作的结果,success 表示清理成功。
# 清理操作通常涉及移除临时文件或状态。
CleanResult=success# 服务运行用户 ID
# UID=[not set]: 服务运行的用户 ID,[not set] 表示未指定特定用户。
# 可通过 User= 参数设置。
UID=[not set]# 服务运行组 ID
# GID=[not set]: 服务运行的组 ID,[not set] 表示未指定特定组。
# 可通过 Group= 参数设置。
GID=[not set]
03 可配置的参数
以下为常见资源限制参数的说明及配置案例,涵盖 CPU、内存、IO、进程数、文件描述符等,旨在优化资源分配和提升系统安全性。
3.1 CPU限制
3.1.1 CPU时间分配
限制服务可使用的 CPU 时间百分比。例如,100% 表示 1 个 CPU 核心,150% 表示 1.5 个核心。
如:限制 mysql 服务最多使用 50% 的 CPU:
[Service]
CPUQuota=50%
编辑 /etc/systemd/system/mysql.service.d/override.conf,添加上述内容并重启服务。
3.1.2 CPU亲核性
指定服务进程可运行的 CPU 核心,适用于多核系统优化。
如:限制 apache2 服务仅运行在 CPU 核心 0 和 1 上:
[Service]
CPUAffinity=0 1
编辑 /etc/systemd/system/apache2.service.d/override.conf,添加上述内容并重启服务。
3.2 内存限制
3.2.1 硬内存上限
设置服务可使用的最大内存,超过时触发 OOM Killer 杀死进程。
如:限制 redis 服务最多使用 512MB 内存:
[Service]
MemoryMax=512M
编辑 /etc/systemd/system/redis.service.d/override.conf,添加上述内容并重启服务。
3.2.2 软内存限制
设置软内存限制,超过时系统尝试回收内存,但不会杀死进程。
如:为 postgresql 服务设置 256MB 软内存限制:
[Service]
MemoryLow=256M
编辑 /etc/systemd/system/postgresql.service.d/override.conf,添加上述内容并重启服务。
3.3 IO限制
3.3.1 读写带宽限制
限制服务对特定设备的读写带宽,单位为字节/秒(如 10M 表示 10MB/s)。
如:限制 mongodb 服务对 /dev/sda 的写带宽为 10MB/s:
[Service]
IOWriteBandwidthMax=/dev/sda 10M
编辑 /etc/systemd/system/mongodb.service.d/override.conf,添加上述内容并重启服务。
3.3.2 IO优先级
设置 IO 调度权重,影响服务获取 IO 资源的优先级(取值 1-10000)。
如:为 docker 服务设置 IO 权重为 50:
[Service]
IOWeight=50
编辑 /etc/systemd/system/docker.service.d/override.conf,添加上述内容并重启服务。
3.4 限制进程数量
限制服务可创建的最大进程或线程数,防止资源过度占用。
如:限制 nginx 服务最多创建 100 个进程/线程:
[Service]
TasksMax=100
编辑 /etc/systemd/system/nginx.service.d/override.conf,添加上述内容并重启服务。
3.5 限制文件描述符最大大小
设置服务可打开的最大文件描述符数量,适用于高并发服务。
如:为 haproxy 服务设置最大文件描述符数量为 65535:
[Service]
LimitNOFILE=65535
编辑 /etc/systemd/system/haproxy.service.d/override.conf,添加上述内容并重启服务。
3.6 核心转储限制
控制核心转储文件大小,设为 0 可禁用核心转储。
如:禁用 tomcat 服务的核心转储:
[Service]
LimitCORE=0
编辑 /etc/systemd/system/tomcat.service.d/override.conf,添加上述内容并重启服务。
3.7 指定用户和用户组
以特定用户或组运行服务,降低权限风险。
如:以 nginx 用户运行 nginx 服务:
[Service]
User=nginx
Group=nginx
编辑 /etc/systemd/system/nginx.service.d/override.conf,添加上述内容并重启服务。
3.8 禁止提权
禁止服务进程提升权限,增强安全性。
如:为 redis 服务启用禁止提权:
[Service]
NoNewPrivileges=yes
3.9 沙箱隔离
启用临时文件隔离或限制对系统文件的访问。
如:为 apache2 服务启用临时文件隔离和严格系统保护:
[Service]
PrivateTmp=yes
ProtectSystem=strict
4.0 注意
- 配置文件路径:使用 systemctl edit <service_name> 自动创建覆盖文件,避免直接修改主服务文件。
- 每次修改配置后,必须运行 systemctl daemon-reload 和 systemctl restart <service_name>。