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

Linux中程序的limits中的Max open files的配置由哪些参数决定

在 Linux 中,程序的 Max open files(最大打开文件数,即 ulimit -n)由多个层级的参数共同控制,具体如下:

1. 内核级全局限制(系统默认上限)

/proc/sys/fs/file-max 控制,该值表示整个系统允许打开的最大文件数。
查看方法

cat /proc/sys/fs/file-max
# 输出示例:1234567

临时修改(重启后失效):

sysctl -w fs.file-max=2000000

永久修改(推荐):
/etc/sysctl.conf 中添加或修改:

fs.file-max = 2000000

然后执行:

sysctl -p

2. 用户级限制(PAM 模块)

通过 /etc/security/limits.conf/etc/security/limits.d/ 目录下的配置文件设置。
配置格式

<domain>    <type>    <item>    <value>
  • domain:用户名、组名(@groupname)或 *(所有用户)。
  • typesoft(当前会话限制)或 hard(硬限制,不可超过)。
  • itemnofile(文件描述符限制)。
  • value:具体数值。

示例(对所有用户生效):

* soft nofile 65536
* hard nofile 131072

生效条件
需确保 PAM 模块加载(检查 /etc/pam.d/common-session):

session required pam_limits.so

3. 服务特定限制(systemd 服务)

对于通过 systemd 管理的服务(如 Kafka、Nginx),需在服务配置文件中设置。
修改方法

  1. 编辑服务文件(以 Kafka 为例):
    systemctl edit kafka.service
    
  2. 添加或修改以下内容:
    [Service]
    LimitNOFILE=100000
    
  3. 重启服务:
    systemctl daemon-reload
    systemctl restart kafka
    

4. 会话级临时限制(shell 会话)

在当前 shell 中临时修改(仅对当前会话有效):

ulimit -n 65536  # 设置 soft 限制
ulimit -Hn 131072 # 设置 hard 限制

5. 程序内部限制

某些程序会在代码中硬编码最大文件数限制,需修改程序配置:

  • Java 程序:通过 ulimitsystemd 配置。
  • Nginx:在 nginx.conf 中添加:
    worker_rlimit_nofile 65536;
    

6. 查看实际生效值

  • 查看当前 shell 限制

    ulimit -n  # soft 限制
    ulimit -Hn # hard 限制
    
  • 查看进程限制

    cat /proc/<PID>/limits | grep "Max open files"
    # 示例:
    # Max open files            65536                131072               files
    

配置优先级(从低到高)

  1. 内核默认值/proc/sys/fs/file-max
  2. 用户全局限制/etc/security/limits.conf
  3. systemd 服务限制service.conf
  4. 会话临时限制ulimit 命令)
  5. 程序内部硬编码限制

最佳实践

  1. 调整顺序:先改系统全局(file-max),再改用户限制,最后针对特定服务配置。
  2. 监控工具:使用 lsofss 监控系统打开文件数:
    lsof | wc -l  # 查看系统当前打开的文件总数
    
  3. 生产环境建议
    • 对于高并发服务(如 Kafka、Elasticsearch),设置 nofile100000+
    • 确保 fs.file-max 大于所有服务 nofile 的总和。

通过以上配置,可有效提升系统允许的最大文件打开数,避免 “Too many open files” 错误。

http://www.xdnf.cn/news/1085203.html

相关文章:

  • 明星AI自动化测试工具Midscene.js源码解析
  • Pr插件图文安装教程
  • 实用机器学习
  • C盘瘦身 -- 虚拟内存文件 pagefile.sys
  • 华为OD机试 2025B卷 - 字符串加密 (C++ Python JAVA JS C语言)
  • Python实现文件夹中文件名与Excel中存在的文件名进行对比,并进行删除操作
  • 剑指offer第2版:动态规划+记忆化搜索
  • 多表查询~
  • vue3使用summernote
  • OpenStack云平台管理
  • 回溯题解——子集【LeetCode】输入的视角(选或不选)
  • uniapp运行项目到ios基座
  • 【图像与信号处理】基于可微分二值化网络(DBNet)与循环卷积神经网络(CRNN)的电梯铭牌和限速器检验单识别方法
  • 6,Receiving Messages:@KafkaListener Annotation
  • mac中有多个java版本涉及到brew安装中,怎么切换不同版本
  • Baklib作为赞助商参加RubyConf China 2025 技术大会
  • 宝塔下载pgsql适配spring ai
  • Qt中的坐标系
  • 如果让计算机理解人类语言- Word2Vec(Word to Vector,2013)
  • 1.1_5_2 计算机网络的性能指标(下)
  • 腾讯云录音文件快速识别实战教程
  • Oracle PL/SQL 编程基础详解(从块结构到游标操作)
  • vue3 字符包含
  • C++标准库中各种互斥锁的用法 mutex
  • WebRTC与RTMP
  • AtCoder AT_abc413_d [ABC413D] Make Geometric Sequence
  • 【Godot4】正则表达式总结与测试
  • 操作系统【2】【内存管理】【虚拟内存】【参考小林code】
  • 使用Scapy构造OSPF交互报文欺骗网络设备与主机建立Full关系
  • 20250706-12-Docker快速入门(下)-容器数据持久化_笔记