项目 说明
适用系统 Ubuntu 24.04 LTS(也适用于其他 Linux 发行版)
适用服务 Nacos、ZooKeeper、Kafka、Elasticsearch、Tomcat 等所有 Java 中间件
配置目的 提高系统资源限制,避免高并发下 Too many open filesunable to create new native thread 错误

一、背景说明

Linux 系统对资源的限制分为三个层级,必须全部配置才能确保生产环境稳定运行:

层级 限制项 作用范围 高并发时的报错
系统级 fs.file-max 整个操作系统所有进程总共能打开的文件数 Too many open files in system
系统级 kernel.pid_max 整个操作系统总共能创建的进程/线程数 fork: Cannot allocate memory
用户/进程级 nofile(软/硬) 单个进程能打开的文件数 Too many open files
用户/进程级 nproc(软/硬) 单个用户能拥有的进程/线程总数 unable to create new native thread

核心原则:系统级限制必须大于用户/进程级限制,否则后者的配置无法生效。三者构成完整的限制链条。


二、系统级内核参数配置(最高优先级)

2.1 参数说明

参数 含义 推荐值 说明
fs.file-max 系统所有进程可打开的文件描述符总数 1000000 约每 1MB 内存支持 100 个句柄
kernel.pid_max 系统可分配的 PID(进程/线程)总数 4194304 现代 Linux 默认已提升,此值更稳妥

2.2 /etc/sysctl.d/ 文件优先级说明

/etc/sysctl.d/ 目录下的配置文件按字典序加载,数字前缀越小越先加载,后加载的文件会覆盖先加载的文件中的同名参数

加载顺序示例

文件 加载顺序 参数值 最终生效
/etc/sysctl.d/10-network.conf 第1个 net.ipv4.tcp_syncookies = 1 保留
/etc/sysctl.d/50-default.conf 第2个 kernel.pid_max = 32768 被覆盖
/etc/sysctl.d/99-sysctl.conf 第3个 kernel.pid_max = 65535 被覆盖
/etc/sysctl.d/100-custom.conf 第4个 kernel.pid_max = 4194304 ✅ 最终生效

为什么使用 100- 前缀?

  • 系统可能自带 /etc/sysctl.d/99-sysctl.conf,其中可能包含 kernel.pid_max = 65535
  • 使用 100-custom.conf(数字更大)可确保自定义配置在系统默认配置之后加载,从而覆盖默认值。
  • 如果有多个文件设置了相同参数,最后一个文件中的值会生效

2.3 配置步骤

sudo vim /etc/sysctl.d/100-custom.conf

写入以下内容:

# 系统总文件描述符上限
fs.file-max = 1000000
# 系统总 PID 上限(进程/线程)
kernel.pid_max = 4194304

使配置立即生效

sudo sysctl -p /etc/sysctl.d/100-custom.conf

或应用所有配置文件:

sudo sysctl --system

验证配置是否生效

cat /proc/sys/fs/file-max
cat /proc/sys/kernel/pid_max

预期输出

1000000
4194304

2.4 查看所有配置来源(排查冲突)

如果发现参数值不符合预期,可查看加载顺序和来源:

sudo sysctl --system 2>&1 | grep -E "file-max|pid_max"

输出示例:

* Applying /etc/sysctl.d/99-sysctl.conf ...
kernel.pid_max = 65535
* Applying /etc/sysctl.d/100-custom.conf ...
kernel.pid_max = 4194304

2.5 回滚方式

如需撤销,删除或重命名文件(如 mv 100-custom.conf 100-custom.conf.bak),然后执行 sudo sysctl --system 重新加载。


三、用户/进程级限制配置(三个层面必须协同)

3.1 核心概念

概念 说明
软限制(soft) 当前生效的限制值,进程可主动调整(不得超过硬限制)
硬限制(hard) 软限制的上限,由 root 设置,普通用户无法超越

3.2 为什么三个层面必须协同配置?

关键结论:生产环境必须同时配置以下三个层面,形成完整的限制链条。

配置方法 生效对象 是否必须 原因
方法1:/etc/security/limits.conf 登录会话(SSH/控制台) 必须 systemd 服务不读取此文件
方法2:/etc/systemd/system.conf 所有 systemd 服务(全局默认) 必须 SSH 登录不读取此文件
方法3:服务单元文件 单个 systemd 服务(覆盖) 按需 仅为特定服务设不同值时使用

注意:方法1 和 方法2 不是二选一,而是必须同时配置。方法3 仅在需要为特定服务设置**不同(更高或更低)**限制时使用。


四、生产环境推荐配置值

场景 nofile 软/硬 nproc 软/硬 适用服务
通用中间件 65535 / 65535 65535 / 65535 ZooKeeper、Tomcat、Spring Boot
高连接服务 1048576 / 1048576 65535 / 65535 Nacos 2.x、Kafka、Elasticsearch
Redis / 数据库 65535 / 65535 unlimited / unlimited Redis、MySQL(不推荐 unlimited

建议nproc 不建议设为 unlimited,统一使用 65535 更安全。


五、配置方法(方法1 + 方法2 必须执行)

🔹 方法1:/etc/security/limits.conf(对登录用户生效)

影响通过 SSH 登录控制台直接登录的用户环境。

sudo vim /etc/security/limits.conf

在文件末尾添加:

# ============================================
# 文件描述符限制(nofile)
# ============================================
# 所有用户通用配置(65535)
* soft nofile 65535
* hard nofile 65535

# 针对高负载服务用户(1048576,需已创建专用用户)
zookeeper soft nofile 1048576
zookeeper hard nofile 1048576
nacos soft nofile 1048576
nacos hard nofile 1048576

# ============================================
# 进程/线程数限制(nproc)
# ============================================
# 所有用户通用配置
* soft nproc 65535
* hard nproc 65535

# 针对高负载服务用户
zookeeper soft nproc 65535
zookeeper hard nproc 65535
nacos soft nproc 65535
nacos hard nproc 65535

使配置生效

# 需要重新登录 SSH 才能生效
exit
# 重新连接后验证
ulimit -n   # 查看 nofile
ulimit -u   # 查看 nproc

🔹 方法2:/etc/systemd/system.conf(对 systemd 服务全局生效)

这是最关键的一步。如果不配置,所有 systemd 启动的服务都会无视 /etc/security/limits.conf

sudo vim /etc/systemd/system.conf

取消注释并修改:

# ============================================
# 文件描述符限制
# ============================================
# ⚠️ 注意:不可设为 软:硬 不同值(如 1024:524288)
# 这会导致 Java 进程继承过低的软限制
# ✅ 正确写法:统一设为同一值
DefaultLimitNOFILE=65535

# ============================================
# 进程/线程数限制
# ============================================
DefaultLimitNPROC=65535

同时修改用户级 systemd 配置

sudo vim /etc/systemd/user.conf

同样修改:

DefaultLimitNOFILE=65535
DefaultLimitNPROC=65535

使配置生效

# 重新加载 systemd 进程配置
sudo systemctl daemon-reexec

建议:执行 daemon-reexec 后,重启服务器以确保所有已运行服务继承新配置。


🔹 方法3:服务单元文件单独覆盖(按需使用)

对于 Nacos、Kafka 等需要更高限制的服务,在各自的 systemd 单元文件中单独覆盖。

sudo vim /etc/systemd/system/nacos.service

[Service] 块中添加:

[Service]
LimitNOFILE=1048576
LimitNPROC=65535
sudo systemctl daemon-reload
sudo systemctl restart nacos

何时使用方法3

场景 是否使用
所有服务统一用 65535 ❌ 不需要
Nacos 需 1048576,其他服务保持 65535 ✅ 使用
临时测试某个服务需更高的限制 ✅ 使用
为某个服务设置更低的限制(隔离风险) ✅ 使用

六、配置优先级总结

优先级 配置来源 适用对象 是否必须
1(最高) 服务单元文件 LimitNOFILE= 单个 systemd 服务 ❌ 按需
2(中) /etc/systemd/system.conf 所有 systemd 服务 必须
3(低) /etc/security/limits.conf 登录会话(SSH/控制台) 必须
默认值 systemd/内核编译默认 无任何配置时

配置生效范围总结

配置场景 systemd 服务 SSH/控制台登录
只配置方法1(limits.conf ❌ 不生效 ✅ 生效
只配置方法2(system.conf ✅ 生效 ❌ 不生效
配置方法1 + 方法2(✅ 推荐) ✅ 生效 ✅ 生效
配置方法1 + 方法2 + 方法3 ✅ 生效(特定服务覆盖) ✅ 生效

七、验证配置是否生效

7.1 验证系统级内核参数

cat /proc/sys/fs/file-max
cat /proc/sys/kernel/pid_max

7.2 验证登录会话限制

ulimit -n   # nofile
ulimit -u   # nproc

7.3 验证运行中的进程限制

# 查看 Nacos 进程
cat /proc/$(pgrep -f nacos)/limits | grep -E "Max open files|Max processes"

# 查看 ZooKeeper 进程
cat /proc/$(pgrep -f zookeeper)/limits | grep -E "Max open files|Max processes"

预期输出

Max open files            1048576              1048576              files
Max processes             65535                65535                processes

7.4 一键验证脚本

#!/bin/bash
echo "========== 系统级内核参数 =========="
echo "fs.file-max: $(cat /proc/sys/fs/file-max)"
echo "kernel.pid_max: $(cat /proc/sys/kernel/pid_max)"
echo ""
echo "========== 当前会话限制 =========="
echo "nofile (soft): $(ulimit -n)"
echo "nproc  (soft): $(ulimit -u)"
echo ""
echo "========== 运行中 Java 服务限制 =========="
for pid in $(pgrep -f "java"); do
    name=$(cat /proc/$pid/cmdline | tr '\0' ' ' | cut -c1-50)
    echo "PID: $pid ($name...)"
    cat /proc/$pid/limits | grep -E "Max open files|Max processes" | sed 's/^/  /'
    echo ""
done

保存为 verify-limits.sh 并执行:

chmod +x verify-limits.sh
./verify-limits.sh

八、完整配置清单

文件路径 需修改的配置项 推荐值 是否必须
/etc/sysctl.d/100-custom.conf fs.file-max 1000000 必须
/etc/sysctl.d/100-custom.conf kernel.pid_max 4194304 必须
/etc/security/limits.conf * soft/hard nofile/nproc 65535 必须
/etc/systemd/system.conf DefaultLimitNOFILE 65535 必须
/etc/systemd/user.conf DefaultLimitNPROC 65535 必须
/etc/systemd/system/nacos.service LimitNOFILE 1048576 ❌ 按需
/etc/systemd/system/zookeeper.service LimitNOFILE 65535 ❌ 按需

九、一键配置脚本

#!/bin/bash
set -e

echo "=== 配置系统资源限制(完整版)==="

# ============================================
# 1. 系统级内核参数
# ============================================
echo "配置 /etc/sysctl.d/100-custom.conf..."
sudo tee /etc/sysctl.d/100-custom.conf << 'EOF'
# 系统总文件描述符上限
fs.file-max = 1000000
# 系统总 PID 上限(进程/线程)
kernel.pid_max = 4194304
EOF

sudo sysctl -p /etc/sysctl.d/100-custom.conf

# ============================================
# 2. 用户/会话级限制
# ============================================
echo "配置 /etc/security/limits.conf..."
sudo tee -a /etc/security/limits.conf << 'EOF'

# 生产环境资源限制配置
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

# 高负载服务专用
zookeeper soft nofile 1048576
zookeeper hard nofile 1048576
nacos soft nofile 1048576
nacos hard nofile 1048576
zookeeper soft nproc 65535
zookeeper hard nproc 65535
nacos soft nproc 65535
nacos hard nproc 65535
EOF

# ============================================
# 3. systemd 服务全局默认值
# ============================================
echo "配置 /etc/systemd/system.conf..."
sudo sed -i 's/^#DefaultLimitNOFILE=/DefaultLimitNOFILE=65535/' /etc/systemd/system.conf
sudo sed -i 's/^#DefaultLimitNPROC=/DefaultLimitNPROC=65535/' /etc/systemd/system.conf

echo "配置 /etc/systemd/user.conf..."
sudo sed -i 's/^#DefaultLimitNOFILE=/DefaultLimitNOFILE=65535/' /etc/systemd/user.conf
sudo sed -i 's/^#DefaultLimitNPROC=/DefaultLimitNPROC=65535/' /etc/systemd/user.conf

# ============================================
# 4. 重载 systemd
# ============================================
sudo systemctl daemon-reexec

echo ""
echo "=== 配置完成 ==="
echo "请执行以下操作:"
echo "1. 重新登录 SSH:exit 后再登录"
echo "2. 重启 systemd 管理的服务(如 Nacos、ZooKeeper)"
echo "3. 执行 'ulimit -n' 验证当前会话"
echo "4. 执行 'cat /proc/sys/fs/file-max' 验证内核参数"

保存为 configure-limits.sh 并执行:

chmod +x configure-limits.sh
sudo ./configure-limits.sh

十、常见问题排查

问题现象 可能原因 解决方法
ulimit -n 显示 1024 未重新登录或方法1未配置 重新 SSH 登录,检查 /etc/security/limits.conf
systemd 服务仍显示 1024 未配置 /etc/systemd/system.conf 配置方法2,执行 systemctl daemon-reexec
服务显示 1048576 但实际不够 单元文件中设置了较小值 检查方法3是否覆盖了 LimitNOFILE=1024
修改后重启服务器仍不生效 systemd 配置文件格式错误 检查是否误写了 1024:524288 等软硬不同格式
fs.file-max 修改后不生效 配置路径错误或未执行 sysctl -p 检查 /etc/sysctl.d/ 下文件是否以 .conf 结尾
cat /proc/sys/fs/file-max 显示旧值 配置未加载或文件顺序冲突 执行 sudo sysctl --system 查看加载日志
nproc 对 root 不生效 nproc 限制对 root 用户无效 生产服务不要用 root 运行
多个文件设置同一参数,最终值不对 文件加载顺序导致覆盖 检查 ls /etc/sysctl.d/*.conf,确认数字前缀最大文件包含目标配置

附录:配置关系图

┌─────────────────────────────────────────────────────────────────┐
│                     系统级内核参数                              │
│  /etc/sysctl.d/100-custom.conf                                │
│  fs.file-max = 1000000       ← 系统总文件描述符上限            │
│  kernel.pid_max = 4194304    ← 系统总 PID 上限                │
│  (100- 前缀确保在 99-sysctl.conf 之后加载,覆盖默认值)       │
└─────────────────────────────────────────────────────────────────┘
                              │
                              │ 必须大于所有用户级限制
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                    用户/进程级限制                              │
├─────────────────────────────┬───────────────────────────────────┤
│  方法1:limits.conf          │  方法2:systemd 全局             │
│  SSH/控制台登录生效          │  systemd 服务生效                │
│  * soft nofile 65535        │  DefaultLimitNOFILE=65535        │
│  * hard nofile 65535        │  DefaultLimitNPROC=65535         │
│  * soft nproc 65535         │                                   │
│  * hard nproc 65535         │                                   │
├─────────────────────────────┴───────────────────────────────────┤
│  方法3:服务单元文件(按需覆盖)                                │
│  [Service]                                                     │
│  LimitNOFILE=1048576        ← 仅高负载服务使用                 │
│  LimitNPROC=65535                                              │
└─────────────────────────────────────────────────────────────────┘

文档版本:2.0
适用系统:Ubuntu 24.04 LTS / CentOS 7+
核心原则:系统级 + 方法1 + 方法2 必须同时配置,方法3 按需使用
最后更新:2026-07-19

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐