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 # 运行内存密集型应用

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

相关推荐
陈希1232 分钟前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡36 分钟前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
@兽血沸腾1 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
且从容.4 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道4 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
讯捷蓝达6 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
且从容.7 小时前
ubuntu安装flink
linux·ubuntu·flink
数字新视界9 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落9 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨9 小时前
WSL2的安装与使用
linux·wsl