606 字
3 分钟

最新实践:使用systemd限制进程资源使用

参数类型#

CPU 资源限制#

参数说明示例
CPUQuota=限制 CPU 总占用百分比(相对整个系统)CPUQuota=20%(最多 20% CPU 时间)
CPUQuotaPeriodSec=限制周期,默认 100ms,可配合上面微调调度平滑度CPUQuotaPeriodSec=1s
CPUShares=设置 CPU 权重(默认 1024),相对优先级CPUShares=512
CPUWeight=cgroup v2 新参数(替代 CPUShares),范围 1–10000CPUWeight=200
AllowedCPUs=限定可使用的 CPU 核心(cgroup v2)AllowedCPUs=0,2,4AllowedCPUs=0-3
Nice=设置进程的 nice 优先级(-20~19)Nice=10

内存限制#

参数说明示例
MemoryMax=最大可用内存上限MemoryMax=500M
MemorySwapMax=限制 swap 可用大小MemorySwapMax=0(禁止 swap)
MemoryHigh=达到此值后触发内核压力控制,但不立刻杀死进程MemoryHigh=400M
MemoryLow=优先保证该服务的最低内存MemoryLow=200M
MemoryAccounting=启用内存使用统计(建议总是开)MemoryAccounting=true

磁盘 I/O 相关#

参数说明示例
IOWeight=设置 I/O 优先级(范围 1–10000)IOWeight=500
IODeviceWeight=针对具体块设备设置权重IODeviceWeight=/dev/sda 200
IOReadBandwidthMax=限制读带宽IOReadBandwidthMax=/dev/sda 10M
IOWriteBandwidthMax=限制写带宽IOWriteBandwidthMax=/dev/sda 5M
IOReadIOPSMax= / IOWriteIOPSMax=限制 IOPS 数量IOWriteIOPSMax=/dev/nvme0n1 200

网络(需 cgroup v2 + systemd >= 250)#

参数说明示例
IPIngressMaxBytes=限制进入流量IPIngressMaxBytes=10M
IPEgressMaxBytes=限制发出流量IPEgressMaxBytes=5M
IPAccounting=启用网络流量统计IPAccounting=true

进程与文件句柄数#

参数说明示例
TasksMax=限制该服务下最多可创建多少个线程/进程TasksMax=100
LimitNOFILE=限制最大文件描述符数LimitNOFILE=4096
LimitNPROC=限制用户最大进程数LimitNPROC=128
LimitCORE=限制 core dump 大小LimitCORE=0(禁用)

自动重启与故障策略(辅助控制)#

参数说明示例
Restart=服务崩溃后是否自动重启Restart=on-failure
RestartSec=重启前等待时间RestartSec=5s
StartLimitBurst= / StartLimitIntervalSec=控制过多重启时的熔断机制StartLimitBurst=3StartLimitIntervalSec=60s

使用#

打开 service 文件临时覆盖文件#

Terminal window
systemctl edit ghost

添加规则#

Terminal window
### Editing /etc/systemd/system/ghost.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file
[Service]
CPUQuota=20%
### Edits below this comment will be discarded

在空行中增加的规则将被注入到 service 文件中

使规则生效#

  1. 重载配置
Terminal window
systemctl daemon-reload
  1. 重新启动应用
Terminal window
systemctl restart application

启用统计信息#

配置变量#

Terminal window
[Service]
CPUAccounting=true
MemoryAccounting=true
IOAccounting=true
IPAccounting=true

查看#

Terminal window
systemctl status ghost
systemd-cgtop
systemd-cgls

使用 systemd-run#

systemd-run 是最新实践,可以将进程以 systemd 临时服务单元的形式启动,cgroups 中的所有资源限制参数都可以通过这条命令进行应用

例如:

Terminal window
systemd-run --user -p CPUQuota=20% --scope ./hard_script.sh

其中:

  • --user: 后台运行进程
  • --scope: 让该进程在运行时不生成 systemd 临时服务文件
  • -p: 指定要控制的资源参数。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
最新实践:使用systemd限制进程资源使用
https://white-festa.net/posts/systemd_resource_limitation/使用systemd限制进程资源使用/
作者
常世常暗
发布于
2024-11-09
许可协议
CC BY-NC-SA 4.0
最后更新于 2024-11-09,距今已过 409 天

部分内容可能已过时

评论区

目录