温馨提示×

Linux进程资源限制如何配置

小樊
43
2025-12-17 22:15:15
栏目: 智能运维

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
    • 生效方式:用户重新登录或重启相关服务
  • Systemd 服务专用(优先级高于 limits.conf):
    • 在单元文件 [Service] 中设置:LimitNOFILE=65535LimitNPROC=4096
    • 执行:systemctl daemon-reload && systemctl restart <service>
  • 常见注意点:
    • soft ≤ hard;普通用户只能把 soft 调小或保持,调大受 hard 限制
    • 登录会话才读 limits.conf;Systemd 服务不会自动继承,需在单元文件显式设置
    • 验证:在目标用户/服务上下文中执行 ulimit -acat /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 -aulimit -n/ulimit -Hn(软/硬)、ulimit -u
    • 进程层:cat /proc/<PID>/limits
    • 系统级文件描述符容量:cat /proc/sys/fs/file-maxcat /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
  • 数值边界与回退
    • 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_bytescpu.stat
    • 系统层:/proc/sys/fs/file-nr/proc/sys/fs/file-max
  • 优先级配合
    • nice/renice 仅影响调度权重,不能替代 cgroups 的硬配额;建议“优先级 + 配额”组合使用

0