Linux 资源限制(进程级,用户级,系统级)

在 Linux 系统中,资源限制按生效范围和持久性可分为 进程级、用户级、系统级 三类,每类对应不同的配置方式和应用场景。以下是详细分类及对比:

1. 进程级别限制(临时生效,优先级最高)

1.1. 修改方式

    • 通过 ulimit 命令在终端中动态调整(需在 shell 会话中执行)

      ulimit -n 4096 # 修改当前 shell 进程的文件描述符限制为 4096
      ulimit -u 655360 # 修改当前 shell 进程的最大进程数为655360

    • 或在程序中通过 setrlimit() 系统调用(需编程实现)

1.2. 特点

    • 作用范围 :仅对当前进程或子进程有效,不影响其他进程。
    • 临时生效:进程结束或 shell 会话退出后失效,无法持久化。
    • 优先级最高:若与用户 / 系统级限制冲突,以进程级设置为准(仅对当前进程有效)。

1.3. 适用场景

    • 临时测试:调试程序时临时提高资源上限。
    • 不建议用于长期配置,因为无法跨会话或重启保持。

2. 用户级别限制(永久生效,但需要重新登录)

2.1. 修改方式

复制代码
配置文件(永久生效):
# /etc/security/limits.conf 或 /etc/security/limits.d/*.conf
#系统会先读取 /etc/security/limits.conf,再读取 /etc/security/limits.d/目录下的
#所有配置文件(按文件名的 ASCII 码顺序加载),若存在相同的参数修改,后加载的配置会
#覆盖先加载的配置,修改建议:/etc/security/limits.d/下为避免加载顺序与数值顺序不一致,
#数字前缀建议使用两位数(如 10、20、30,先加载 10,再加载 20,最后加载 30)

格式:<domain> <type> <item> <value>
# 示例:
*       soft    nofile  1024   # 所有用户的文件描述符软限制,软限制不能大于硬限制
*       hard    nofile  4096   # 硬限制(不可突破)
@dev    hard    nproc   2048   # dev 组的最大进程数硬限制
root    soft    memlock unlimited  # root 用户的内存锁定无限制


#查看修改的配置(需重新登录后)
cat /proc/self/limits

2.2. 特点

  • 生效范围 :特定用户或用户组(通过 domain 指定),修改后需要重新登录才会生效。
  • 持久性:系统重启后仍有效(依赖 PAM 模块加载)。
  • 优先级:低于进程级,但高于系统级内核参数(用户限制不能超过内核允许的最大值)。

2.3. 适用场景

  • 开发环境:为开发用户组提高文件描述符限制。
  • 数据库服务:为 mysql 用户配置更高的进程数限制。
  • 安全管控:限制普通用户创建过多进程(防止 DoS 攻击)。

3. 系统级资源限制(内核参数)

sysctl 是 Linux 系统中用于修改 **系统级别内核参数,**按以下顺序加载配置(后加载的覆盖先加载的):

  1. /usr/lib/sysctl.d/*.conf(系统默认配置,优先级最低)
  2. /run/sysctl.d/*.conf(动态生成的配置,通常为空)
  3. /etc/sysctl.d/*.conf(用户自定义配置,按文件名排序)
  4. /etc/sysctl.conf(用户自定义全局配置,优先级最高)

假设存在以下配置文件:

复制代码
/etc/sysctl.d/50-base.conf:     fs.file-max = 500000
/etc/sysctl.d/99-sysctl.conf:   fs.file-max = 1000000
/etc/sysctl.conf:               fs.file-max = 2000000

最终生效值2000000(来自 /etc/sysctl.conf),如果你希望 /etc/sysctl.d/99-sysctl.conf 中的 fs.file-max = 1000000 生效,必须删除或注释 /etc/sysctl.conf 中的该行

3.1. 修改方式

  • 临时修改(无需重启)

    sysctl -w fs.file-max=1000000 # 系统全局最大文件描述符数
    sysctl -w fs.nr_open‌=1000000 # 单个进程最大文件描述符数(大于或等于fs.file-max)
    sysctl -w net.ipv4.tcp_max_syn_backlog=8192 # TCP 半连接队列长度

  • 永久修改

    /etc/sysctl.conf 或 /etc/sysctl.d/*.conf

    /etc/sysctl.d/
    ├── 99-sysctl.conf # 全局通用参数(避免频繁修改)
    ├── 100-mysql.conf # MySQL 专用参数
    └── 110-nginx.conf # Nginx 专用参数
    fs.file-max = 1000000
    ‌fs.nr_open‌ = 1000000
    net.ipv4.tcp_max_syn_backlog = 8192

    #只是修改文件,配置需要在重启系统后才会生效,要想立即生效,需要执行下面的代码
    sysctl -p # 加载 /etc/sysctl.conf
    sysctl -p /etc/sysctl.d/99-network.conf # 加载指定文件

    #查看系统资源限制
    sysctl fs.file-nr
    #输出示例:fs.file-nr = 1234 0 1000000 (已用 1234,未用 0,上限 1000000)

3.2. 特点

  • 生效范围全局生效,影响整个系统。
  • 持久性:需写入配置文件,才能在重启后继续生效。
  • 优先级 :作为用户级和进程级限制的 最终上限 (例如,fs.file-max 限制了系统可分配的最大文件描述符总数)。

3.3. 典型场景

  • 网络优化:调整 TCP 参数提高吞吐量。
  • 内存管理:修改 vm.swappiness 控制内存交换策略。
  • 文件系统:增加 fs.inotify.max_user_watches 允许更多文件监控。

4. 三类限制的对比表

|----------|----------------|---------------------------------|------------------------|
| 维度 | 进程级 | 用户级 | 系统级(内核参数) |
| 配置文件 | ulimit 命令或编程 | /etc/security/limits.conf | /etc/sysctl.conf |
| | | /etc/security/limits.d/*.conf | /etc/sysctl.d/*.conf |
| 生效范围 | 当前进程及子进程 | 特定用户 / 组 | 整个系统 |
| 持久性 | 临时(会话结束失效) | 永久(需重新登录) | 永久(需 sysctl -p 或重启) |
| 优先级 | 最高(但受内核限制约束) | 中等 | 最低(作为全局基线) |
| 典型用途 | 临时调试、脚本执行 | 用户资源配额管理 | 系统性能调优、安全基线 |

5. 注意事项

  1. 内核参数与 PAM 的协同
    • 用户级限制(如 nofile)不能超过系统级内核参数 fs.file-max 的值。
    • 例如:若 fs.file-max = 100000,则用户级 hard nofile 最大只能设置为 100000。
  1. 验证配置生效

    查看进程级限制

    ulimit -a

    查看用户级限制(需重新登录后)

    cat /proc/self/limits

    查看系统级内核参数

    sysctl -a | grep fs.file-max

6. 典型场景示例

  1. 提高某个服务的文件描述符限制

    1.系统级别限制(每个进程最大能打开的文件数)
    vim /etc/sysctl.d/100-file.conf
    fs.file-max = 1000000
    ‌fs.nr_open‌ = 1000000
    sysctl -p /etc/sysctl.d/100-file.conf

    2.用户级别限制(用户最大能打开的文件数)
    #立即生效配置
    ulimit -n 655360
    #永久配置,重新登录生效
    vim /etc/security/limits.d/30-nofile.conf

    • soft nofile 655360
    • hard nofile 655360
  2. 优化高并发 Web 服务器的网络参数

    /etc/sysctl.d/99-network.conf

    net.core.somaxconn = 32768
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.ip_local_port_range = 10000 65535

执行 sysctl -p 使配置立即生效。

  1. 临时调试程序

    ulimit -s unlimited # 临时取消栈大小限制
    ./memory-hungry-app # 运行内存密集型应用

通过合理组合使用这三类资源限制,可实现从细粒度进程控制到全局系统优化的全方位资源管理

相关推荐
AlfredZhao14 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346620 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
小宇宙Zz2 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信