Ubuntu 修改 ulimit‑n(nofile,最大打开文件数)

 

Ubuntu 修改 ulimit‑n(nofile,最大打开文件数)

⚠️关键点:

  1. /etc/security/limits.conf 只对登录 shell 会话生效;systemd 托管的后台服务完全忽略该文件
  2. 进程一旦启动,ulimit 不会动态更新,必须重启进程 / 服务才生效
  3. 两层限制:用户层 ulimit;内核全局fs.file‑max

1. 查看当前值

# 当前shell软限制
ulimit -n
(base) [root@VM-8-12-centos ~]# ulimit -n
100001
# 当前shell硬限制 ulimit -Hn
(base) [root@VM-8-12-centos ~]# ulimit -Hn
100002
# 查看某个正在运行进程真实限制(PID替换成你的进程号) cat /proc/<PID>/limits | grep "Max open files"
# systemd服务查看LimitNOFILE systemctl show yourservice --property=LimitNOFILE
(base) [root@VM-8-12-centos ~]# systemctl show yourservice --property=LimitNOFILE
LimitNOFILE=1048576

# 内核全局最大文件句柄 sysctl fs.file-max
(base) [root@VM-8-12-centos ~]# sysctl fs.file-max
fs.file-max = 198942

2. 临时修改(仅当前 shell,重启 / 退出失效)

ulimit -n 65536

3. 普通登录用户(ssh 登录、本地终端)永久修改

编辑 limits.conf

sudo nano /etc/security/limits.conf

文件末尾追加(示例 65536,按需调整):

* soft nofile  65536
* hard nofile  65536
root soft nofile 65536
root hard nofile 65536

root 必须单独写,*不覆盖 root 用户。

检查 PAM 是否开启(Ubuntu 默认开启):

grep pam_limits.so /etc/pam.d/common-session

要有:session required pam_limits.so,没有就手动加上腾讯云。

生效:完全注销退出登录,重新 ssh/login,不要 su 切换,再执行ulimit‑n验证。

4. 重要:systemd 后台服务(systemctl 启动的程序)

limits.conf 对 systemd 服务无效!! 必须改 systemd 配置。

方式 A:仅单个服务(推荐,最小改动)

sudo systemctl edit myapp.service

填入:

[Service]
# soft:hard,示例:软65536,硬1048576
LimitNOFILE=65536:1048576

保存退出,重载并重启服务:

sudo systemctl daemon-reload
sudo systemctl restart myapp

方式 B:全局所有 systemd 服务默认值

sudo mkdir -p /etc/systemd/system.conf.d
sudo nano /etc/systemd/system.conf.d/99-nofile.conf
[Manager]
DefaultLimitNOFILE=65536:1048576

生效:

sudo systemctl daemon-reexec

daemon‑reexec 重启 systemd 主进程,所有已运行的 systemd 服务需要各自重启才会拿到新限制,旧进程保持旧值。

5. 内核全局上限(fs.file‑max,所有进程合计)

一般默认足够,高并发场景调大:

sudo nano /etc/sysctl.conf
fs.file-max = 2097152

应用:

sudo sysctl -p

常见踩坑排查清单

  1. 修改 limits.conf 后ulimit‑n不变:没有完全注销重登录,su/sudo 不会加载 pam_limits,新开 ssh 会话测试。
  2. shell 里 ulimit‑n 正确,但 systemd 服务进程看/proc/PID/limits还是 1024:没有修改 systemd 的 LimitNOFILE,服务未重启
  3. 设置值超过内核fs.nr_open会失败;LimitNOFILE硬值不能超过fs.nr_open
  4. 已经启动的旧进程不会自动更新 ulimit,必须重启进程

验证命令集合,复制直接运行

echo "=== shell ulimit -n ==="
ulimit -n
ulimit -Hn
echo "=== kernel fs.file-max ==="
sysctl fs.file-max
echo "=== systemd全局默认 ==="
systemctl show --property=DefaultLimitNOFILE

如果你告诉我:是 ssh 登录运行程序,还是 systemd service 托管,我可以给你直接复制粘贴的整套配置。

 

posted @ 2026-09-05 19:08  emanlee  阅读(33)  评论(0)    收藏  举报