Linux进程资源限制如何配置
导读:Linux进程资源限制配置指南 一 概览与适用场景 ulimit / limits.conf:作用于“会话/用户”的计数型与阈值型限制,如打开文件数 nofile、进程数 nproc、栈大小 stack、CPU 时间等。适合登录会话与守护...
Linux进程资源限制配置指南
一 概览与适用场景
- ulimit / limits.conf:作用于“会话/用户”的计数型与阈值型限制,如打开文件数 nofile、进程数 nproc、栈大小 stack、CPU 时间等。适合登录会话与守护进程的传统配置,配置简单、生效快,但对 CPU、内存等“用量型”资源不擅长。
- cgroups v1/v2:内核级“分组+配额”机制,可对CPU、内存、块 I/O、cpuset等进行硬限制与统计,支持将进程及其子进程自动继承限制,适合生产环境、容器与精细化治理。
- nice/renice:调整进程调度优先级,属于“相对调度”而非硬配额,常与 cgroups/ulimit 配合使用。
二 快速上手 ulimit 与 limits.conf
- 临时生效(当前会话与子进程):
- 查看:
ulimit -a - 示例:
ulimit -n 65535(打开文件数)、ulimit -u 4096(用户进程数)
- 查看:
- 永久生效(登录会话):
- 编辑 /etc/security/limits.conf(或 /etc/security/limits.d/*.conf),格式:
< domain> < type> < item> < value> - 示例:
* soft nofile 65535 * hard nofile 131070 nginx soft nofile 65535 nginx hard nofile 65535 - 确保 PAM 加载:
/etc/pam.d/common-session、/etc/pam.d/login、/etc/pam.d/sshd中包含session required pam_limits.so - 生效方式:用户重新登录或重启相关服务
- 编辑 /etc/security/limits.conf(或 /etc/security/limits.d/*.conf),格式:
- Systemd 服务专用(优先级高于 limits.conf):
- 在单元文件
[Service]中设置:LimitNOFILE=65535、LimitNPROC=4096等 - 执行:
systemctl daemon-reload & & systemctl restart < service>
- 在单元文件
- 常见注意点:
- soft ≤ hard;普通用户只能把 soft 调小或保持,调大受 hard 限制
- 登录会话才读 limits.conf;Systemd 服务不会自动继承,需在单元文件显式设置
- 验证:在目标用户/服务上下文中执行
ulimit -a或cat /proc/< PID> /limits
三 使用 cgroups 进行硬限制 CPU 与内存
- 前置检查:
mount | grep cgroup,确认 cpu、memory 等子系统已挂载(以下示例为 cgroups v1) - 内存限制(示例:100MB)
sudo mkdir -p /sys/fs/cgroup/memory/myapp echo 104857600 | sudo tee /sys/fs/cgroup/memory/myapp/memory.limit_in_bytes your_cmd & echo $! | sudo tee /sys/fs/cgroup/memory/myapp/tasks # 监控 cat /sys/fs/cgroup/memory/myapp/memory.usage_in_bytes - CPU 限制(示例:50% 单核)
sudo mkdir -p /sys/fs/cgroup/cpu/myapp echo 100000 | sudo tee /sys/fs/cgroup/cpu/myapp/cpu.cfs_period_us echo 50000 | sudo tee /sys/fs/cgroup/cpu/myapp/cpu.cfs_quota_us echo $! | sudo tee /sys/fs/cgroup/cpu/myapp/tasks # 监控 cat /sys/fs/cgroup/cpu/myapp/cpu.stat - 同时限制 CPU+内存:将同一 PID 写入多个子系统的 tasks 文件即可;子进程自动继承该 cgroup 的限制。
- 生产便捷方式:使用 systemd-run 直接创建受控作用域
systemd-run --scope -p MemoryLimit=100M -p CPUQuota=50% your_command - 提示:cgroups 是 Docker/Kubernetes 等容器技术的底层基础,适合做“用量型硬限制”。
四 常用命令与验证
- 会话与用户层
- 查看:
ulimit -a、ulimit -n/ulimit -Hn(软/硬)、ulimit -u - 进程层:
cat /proc/< PID> /limits - 系统级文件描述符容量:
cat /proc/sys/fs/file-max、cat /proc/sys/fs/nr_open
- 查看:
- cgroups 层
- 内存:
cat /sys/fs/cgroup/memory/< group> /memory.usage_in_bytes - CPU:
cat /sys/fs/cgroup/cpu/< group> /cpu.stat
- 内存:
- 调度优先级
- 启动时:
nice -n 10 your_cmd - 运行中:
renice -n 10 -p < PID>
- 启动时:
- 实践建议:先在测试环境验证阈值与 OOM/限流行为,再推广到生产。
五 配置要点与排错清单
- 生效边界
- limits.conf 仅对“登录会话”生效;Systemd 服务以单元文件
Limit*为准,需daemon-reload与重启 - 确保 PAM 启用:
session required pam_limits.so
- limits.conf 仅对“登录会话”生效;Systemd 服务以单元文件
- 数值边界与回退
- soft ≤ hard ≤ /proc/sys/fs/nr_open;且单个进程 nofile 不能超过 nr_open
- 若 hard 超过 nr_open,可能导致登录失败,需回退到合法范围
- 继承与分组
- cgroups 的 tasks 加入后,子进程自动继承;同一进程可同时加入 cpu、memory 等多个子系统
- 监控与定位
- 会话层:
ulimit -a、/proc/< PID> /limits - cgroups 层:
memory.usage_in_bytes、cpu.stat - 系统层:
/proc/sys/fs/file-nr、/proc/sys/fs/file-max
- 会话层:
- 优先级配合
- nice/renice 仅影响调度权重,不能替代 cgroups 的硬配额;建议“优先级 + 配额”组合使用
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux进程资源限制如何配置
本文地址: https://pptw.com/jishu/775176.html
