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

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

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

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

bash 复制代码
cat /proc/sys/fs/file-max
# 输出示例:1234567

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

bash 复制代码
sysctl -w fs.file-max=2000000

永久修改 (推荐):

/etc/sysctl.conf 中添加或修改:

conf 复制代码
fs.file-max = 2000000

然后执行:

bash 复制代码
sysctl -p

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

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

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

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

conf 复制代码
* soft nofile 65536
* hard nofile 131072

生效条件

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

conf 复制代码
session required pam_limits.so

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

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

  1. 编辑服务文件(以 Kafka 为例):

    bash 复制代码
    systemctl edit kafka.service
  2. 添加或修改以下内容:

    conf 复制代码
    [Service]
    LimitNOFILE=100000
  3. 重启服务:

    bash 复制代码
    systemctl daemon-reload
    systemctl restart kafka

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

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

bash 复制代码
ulimit -n 65536  # 设置 soft 限制
ulimit -Hn 131072 # 设置 hard 限制

5. 程序内部限制

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

  • Java 程序 :通过 ulimitsystemd 配置。

  • Nginx :在 nginx.conf 中添加:

    conf 复制代码
    worker_rlimit_nofile 65536;

6. 查看实际生效值

  • 查看当前 shell 限制

    bash 复制代码
    ulimit -n  # soft 限制
    ulimit -Hn # hard 限制
  • 查看进程限制

    bash 复制代码
    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 监控系统打开文件数:

    bash 复制代码
    lsof | wc -l  # 查看系统当前打开的文件总数
  3. 生产环境建议

    • 对于高并发服务(如 Kafka、Elasticsearch),设置 nofile100000+
    • 确保 fs.file-max 大于所有服务 nofile 的总和。

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

相关推荐
渣渣盟5 小时前
Linux软件管理与编辑器命令速查手册
linux·运维·编辑器
姚不倒5 小时前
F5 健康检查 Monitor 深入篇
运维·负载均衡·f5
小鹿软件办公5 小时前
通过调整编码参数使用 VLC 媒体播放器无损压缩视频方法
运维·网络·音视频
无足鸟ICT5 小时前
【RHCA+】扩展正则表达式
linux·正则表达式
一池秋_6 小时前
ubuntu(linux)完美复刻windows11字体,解决linux字体费眼晴
linux·运维·ubuntu
随风一样自由6 小时前
【WSL+Linux】国内网络连接微软官方服务器(或GitHub)不稳定,导致下载内核或Linux发行版时超时断开如何解决?
linux·服务器·wsl
源图客6 小时前
Claude Code基础使用
服务器·前端·数据库
川石课堂软件测试6 小时前
性能测试|Nginx中间件监控与调优
linux·python·nginx·中间件·单元测试·压力测试·harmonyos
次旅行的库6 小时前
解决ValueError: too many values to unpack (expected 2)
linux·人工智能·深度学习·机器学习·推荐算法
清晨曦月6 小时前
【从零构建分布式在线评测系统】二、Judge0服务器上的心跳程序
运维·服务器·分布式