当前位置: 首页 > news >正文

ulimit参数使用详细总结

目录

1. 基本介绍

1.1 核心功能

1.2 作用范围

1.3 限制类型

2. 基本语法

3. 常用选项​

3.1 常见options

3.2 查看当前限制

4. 核心概念

4.1 软限制(Soft Limit)

4.2 硬限制(Hard Limit)

5. 修改限制 

5.1 临时修改

5.2 永久修改

方法1:修改 /etc/security/limits.conf

方法2:针对Systemd服务的限制

6. 正确配置优先级

7. 验证限制

7.1 查看进程实际限制

 7.2 查看 Systemd 服务的当前限制

 7.3 查看某进程的文件描述符限制

 7.4 查看系统当前打开文件描述符总数

 7.5 查看系统最大文件描述符数

7.6 实时监控文件描述符使用情况 

 7.7 查看特定进程的当前限制​

8. 常见问题

8.1 修改后不生效?

8.2 权限不足?

9. 应用场景

9.1 Web 服务器 (Nginx/Apache)

9.2 数据库 (MySQL/PostgreSQL):

9.3 调试程序崩溃:

9.4 防止资源耗尽攻击:

9.5 嵌入式/资源受限系统:

9.6 容器化环境

10. 注意事项

10.1 谨慎修改硬限制​​

10.2 不同shell的行为差异​​

​​10.3 故障排查​​

10.4 nproc 限制与容器

10.5 限制继承性

10.6 Limits.conf 的生效范围

10.7 云环境限制

10.8 权限差异

10.9 Unlimited


1. 基本介绍

1.1 核心功能

        查看和设置 当前 Shell 进程及其启动的子进程 可使用的 系统资源限制

1.2 作用范围

        限制由 Shell 启动的单个进程或用户会话的资源使用,防止资源耗尽(如打开文件过多、内存泄露、进程爆炸等)。

1.3 限制类型

        包括文件描述符数量、进程数、内存大小、堆栈大小、CPU 时间、core 文件大小等。

2. 基本语法

1.1 基本语法

ulimit   [options]   [limit]

其中,options为控制限制类型的标志,limit则是指定资源限制的值。若省略limit,ulimit将显示当前设置。

3. 常用选项​

3.1 常见options

  • -a:显示所有当前限制。​
  • -c:设置或显示 core 文件的最大大小(以块为单位)。​
  • -d:设置或显示进程数据段的最大大小(以 KB 为单位)。​
  • -f:设置或显示由 shell 及其子进程创建的文件的最大大小(以块为单位)。​
  • -l:设置或显示可锁定到内存中的最大大小(以 KB 为单位)。​
  • -m:设置或显示最大常驻集大小(以 KB 为单位)。​
  • -n:设置或显示最大打开文件描述符数。​
  • -q:设置或显示 POSIX 消息队列的最大字节数。​
  • -s:设置或显示最大堆栈大小(以 KB 为单位)。​
  • -t:设置或显示最大 CPU 时间(以秒为单位)。​
  • -u:设置或显示单个用户可用的最大进程数。​
  • -v:设置或显示 shell 可用的最大虚拟内存(以 KB 为单位)。

3.2 查看当前限制

ulimit -a:列出所有当前资源限制

$ ulimit -a
core file size          (blocks, -c) 0          # core 文件大小 (块)
data seg size           (kbytes, -d) unlimited  # 数据段大小 (KB)
scheduling priority             (-e) 0          # 调度优先级
file size               (blocks, -f) unlimited  # 文件大小 (块)
pending signals                 (-i) 31111      # 挂起信号数量
max locked memory       (kbytes, -l) 64         # 锁定内存 (KB)
max memory size         (kbytes, -m) unlimited  # 常驻内存集大小 (KB)
open files                      (-n) 1024       # 打开文件描述符数
pipe size            (512 bytes, -p) 8          # 管道缓冲区大小
POSIX message queues     (bytes, -q) 819200     # POSIX 消息队列
real-time priority              (-r) 0          # 实时优先级
stack size              (kbytes, -s) 8192       # 栈大小 (KB)
cpu time               (seconds, -t) unlimited  # CPU 时间 (秒)
max user processes              (-u) 31111      # 用户最大进程数
virtual memory          (kbytes, -v) unlimited  # 虚拟内存 (KB)
file locks                      (-x) unlimited  # 文件锁

4. 核心概念

4.1 软限制(Soft Limit)

当前生效的资源阈值,进程可自行调整(不超过硬限制);超出时可能触发警告而非直接终止

4.2 硬限制(Hard Limit)

系统强制上限,仅 root 可修改,超限时进程会被强制终止。

在设置限制时,如果不指定是软限制还是硬限制,默认是软限制。

设置硬限制,使用-H选项,例如ulimit -Hn 2048设置文件描述符的硬限制为2048;

设置软限制,使用-S选项,如ulimit -Sn 1024。

5. 修改限制 

5.1 临时修改

# 修改当前Shell的限制(仅对当前会话有效)
ulimit -n 65535       # 文件描述符数
ulimit -u 10000       # 用户进程数
ulimit -f unlimited   # 文件大小无限制

5.2 永久修改

方法1:修改 /etc/security/limits.conf
vim /etc/security/limits.conf
# 添加以下内容(示例)
*         soft    nofile      65535
*         hard    nofile      65535
username  hard    nproc       10000# 为用户 'appuser' 设置打开文件描述符限制
appuser soft nofile 65536
appuser hard nofile 65536# 为用户 'appuser' 设置进程数限制
appuser soft nproc 4096
appuser hard nproc 8192# 为所有用户设置核心文件大小限制
* soft core 0* hard core 0# 为 'dba' 组成员设置更高的内存锁定限制
@dba hard memlock 262144
@dba soft memlock 262144
  • /etc/security/limits.d/*.conf:系统允许在 /etc/security/limits.d/ 目录下放置额外的 .conf 文件来管理特定服务或用户的限制,便于模块化管理。

  • /etc/default/ 下的服务配置文件:某些服务(如 sshd, systemd 服务)可能有自己的默认配置文件,其中可以设置 ulimit 或通过 systemdLimit* 指令。

  • systemd 服务单元文件:对于由 systemd 管理的服务,可以在服务的 .service 文件中使用 LimitNOFILE, LimitNPROC, LimitCORE 等指令来设置资源限制,这通常比 /etc/security/limits.conf 更直接有效,特别是对于非交互式服务。

  • * 表示所有用户,也可替换为具体用户名。
  • soft 为软限制(可临时突破),hard 为硬限制(需root权限修改)。
  • nproc 表示单个用户能够创建的最大进程数或线程数,在 Linux 中线程和进程的概念在资源限制上是一样的)。这有助于防止某个用户启动过多的进程而导致系统资源耗尽,影响其他用户的正常使用。
  • nofile 代表一个进程可以同时打开的最大文件描述符数量(包括网络连接、文件等)。文件描述符是操作系统用于管理和跟踪文件、网络连接等输入输出资源的一个抽象。
方法2:针对Systemd服务的限制
vim /etc/systemd/system.conf
# 修改以下参数
DefaultLimitNOFILE=65535
DefaultLimitNPROC=10000
# 重启生效
sudo systemctl daemon-reload

6. 正确配置优先级

场景正确配置方式优先级
Systemd 管理的服务修改服务的 .service 文件中的 Limit* 指令★★★★★
全局默认限制 (Systemd)/etc/systemd/system.conf★★★★☆
用户登录会话 (SSH/终端)/etc/security/limits.conf★★★☆☆
临时调整当前 Shellulimit 命令★★☆☆☆
容器内进程容器启动参数 (如 docker run --ulimit)★★★★★

7. 验证限制

7.1 查看进程实际限制

# 查看进程实际限制
cat /proc/<PID>/limits# 示例:查看Nginx主进程限制
ps aux | grep nginx
cat /proc/$(pgrep nginx)/limits
cat /proc/$(pidof nginx)/limits

 7.2 查看 Systemd 服务的当前限制

# 查看 Systemd 服务的当前限制
systemctl show nginx | grep Limit

 7.3 查看某进程的文件描述符限制

grep -i "max open files" /proc/<pid>/limits    

 7.4 查看系统当前打开文件描述符总数

lsof | wc -l
# 或者查看特定进程
lsof -p <PID> | wc -l

 7.5 查看系统最大文件描述符数

# 查看系统最大文件描述符数
cat /proc/sys/fs/file-max# 临时修改(重启失效)
echo 2000000 > /proc/sys/fs/file-max# 永久修改
echo "fs.file-max = 2000000" >> /etc/sysctl.conf
sysctl -p

7.6 实时监控文件描述符使用情况 

#实时监控文件描述符使用情况
watch -n 1 'ls -l /proc/$(pidof mysql)/fd | wc -l' 

 7.7 查看特定进程的当前限制​

使用prlimit命令可以查看指定进程的资源限制情况。

prlimit   -p    <进程ID>

8. 常见问题

8.1 修改后不生效?

  • 检查是否重启了相关服务或Shell会话。
  • 确认/etc/security/limits.conf/etc/systemd/system.conf语法正确。
  • 确保未通过ulimit -n等命令在会话中覆盖配置。

8.2 权限不足?

  • 临时修改需要当前用户权限。
  • 永久修改可能需要root权限或sudo

9. 应用场景

9.1 Web 服务器 (Nginx/Apache)

提高 nofile (文件描述符) 以应对高并发连接。

配置 systemd unit 文件。Systemd 通过 cgroups + Unit 文件配置 实现更强大的资源隔离:

# /etc/systemd/system/nginx.service
[Service]
LimitNOFILE=65535    # 直接控制文件描述符
LimitNPROC=4096      # 直接控制进程数
MemoryMax=2G         # 内存限制 (cgroups)
CPUQuota=80%         # CPU 限制 (cgroups)

Nginx 报错 “Too many open files”错时的解决方案。

Systemd 的配置优先级更高且更精确,完全覆盖 limits.conf 。

9.2 数据库 (MySQL/PostgreSQL):

提高 nofile 和 nproc,确保高并发连接稳定性。

9.3 调试程序崩溃:

设置 ulimit -c unlimited 允许生成 core dump 文件用于分析。

9.4 防止资源耗尽攻击:

设置合理的 nproc 限制防止 fork 炸弹。

设置 fsize/as/data 限制进程内存/文件大小。

9.5 嵌入式/资源受限系统:

严格限制内存 (-v, -m)、栈大小 (-s)、进程数 (-u)

9.6 容器化环境

容器(Docker/Kubernetes)通过 cgroups/namespaces 直接控制资源:

docker run --ulimit nofile=1024:1024 ...  # 容器内覆盖所有限制

limits.conf 对容器内进程完全无效

10. 注意事项

10.1 谨慎修改硬限制​

因为硬限制是资源使用的上限,修改硬限制可能会影响系统的稳定性,尤其是对于系统级别的硬限制修改,需要谨慎操

10.2 不同shell的行为差异​​

不同的shell可能会有不同的ulimit行为,所以在使用时要确保是在目标shell下进行设置。

​​10.3 故障排查​​

当遇到资源相关的错误,如“too many open files”时,可以先使用ulimit -n查看当前文件描述符的限制,如果怀疑是限制过低导致的,可以尝试调整限制值来解决问题

10.4 nproc 限制与容器

在容器环境 (Docker/K8s) 中,容器的进程数限制通常由 cgroups 控制,而非 ulimit -u

10.5 限制继承性

子进程继承父进程的限制设置

10.6 Limits.conf 的生效范围

  • 仅影响通过 PAM (Pluggable Authentication Modules) 登录的会话(如 SSH、本地终端登录)。

  • 不直接影响

    • 系统启动的服务 (需用 systemd 配置)

    • 图形界面 (GUI) 中非终端启动的程序

    • cron 作业 (需在 cron 配置或脚本中显式设置)

10.7 云环境限制

部分云服务商锁定硬限制,需通过平台控制台调整。

10.8 权限差异

非 root 用户只能降低自己的软限制,且硬限制不可超过系统预设值

10.9 Unlimited

使用 unlimited 时要非常谨慎,因为它可能允许进程耗尽系统资源。

http://www.dtcms.com/a/313053.html

相关文章:

  • ELECTRICAL靶机
  • Transformer模型用于MT信号相关性预测与分析
  • python的易物小店交换系统
  • 2106. 摘水果
  • 数据结构中使用到的C语言
  • RocksDb 是什么?levelDB、LSM 树、SSTable又分别是什么?区别呢?
  • Linux 内存调优之如何限制进程、系统级别内存资源
  • 第二章 矩阵
  • 剥离petalinux设备树,使用 dtc 单独编译
  • 主流身份认证协议都有哪些?应用场景有何区别?
  • BRL贝叶斯规则列表
  • 《C++》stack容器详解
  • 块三角掩码(Block-Triangular Masking)
  • Remix框架:高性能React全栈开发实战
  • 安卓加固脱壳
  • js--2048小游戏
  • C++23 Concepts:用类型约束重构泛型编程的终极方案
  • 构造类型--结构体,共同体联合体,枚举
  • 【AI论文】Rep-MTL:释放表征级任务显著性在多任务学习中的潜力
  • 影响人类发音的疾病类型种类和数据集
  • CMake 命令行参数完全指南(2)
  • 界面规范4-按钮
  • All the Mods 9 - To the Sky - atm9sky 局域网联机报错可能解决方法
  • spring batch处理数据模板(Reader-Processor-Writer模式)
  • 【Mysql】日志--错误日志、二进制日志、查询日志、慢查询日志
  • Timer实现定时调度的原理是什么?
  • Python开发环境PyCharm下载与安装
  • RSA 解密逻辑
  • Spring lookup-method实现原理深度解析
  • 悬挂的绳子,它的函数方程是什么样子的?