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" 错误。

相关推荐
ezreal_pan2 小时前
Kubernetes 负载均衡现象解析:为何同一批次请求集中于单个 Pod
运维·云原生·k8s·traefik
朱皮皮呀2 小时前
Spring Cloud——服务注册与服务发现原理与实现
运维·spring cloud·eureka·服务发现·php
xixingzhe22 小时前
多人同时导出 Excel 导致内存溢出
服务器·设计
云手机掌柜2 小时前
Tumblr长文运营:亚矩阵云手机助力多账号轮询与关键词布局系统
大数据·服务器·tcp/ip·矩阵·流量运营·虚幻·云手机
yuanpan3 小时前
ubuntu系统上的conda虚拟环境导出方便下次安装
linux·ubuntu·conda
云边云科技4 小时前
零售行业新店网络零接触部署场景下,如何选择SDWAN
运维·服务器·网络·人工智能·安全·边缘计算·零售
城管不管4 小时前
Docker核心---数据卷(堵门秘籍)
运维·docker·容器
AOwhisky4 小时前
Linux 文本处理三剑客:awk、grep、sed 完全指南
linux·运维·服务器·网络·云计算·运维开发
Gavin_9154 小时前
从零开始部署经典开源项目管理系统最新版redmine6-Linux Debian12
linux·ruby on rails·开源·debian·ruby·redmine
xuanerya4 小时前
使用 SSH 方式克隆 GitHub 仓库没有权限解决办法
运维·ssh·github