Debian 12 更改最大文件描述符数

临时更改

  • 临时更改(仅当前会话有效)可以直接使用 ulimit 命令,这种方式仅适用于当前 Shell 会话,退出终端或者系统重启后会恢复默认值
1
2
# 临时更改限制
ulimit -n 1048576
1
2
# 验证更改
ulimit -n

特别注意

ulimit -n 1048576 命令和 /etc/security/limits.conf 配置文件修改的是当前 Shell 及其启动的子进程的最大文件描述符限制,对 systemd 服务及其管理的其他服务无效。

永久更改

第一步

  • (1) 编辑 /etc/security/limits.conf 配置文件,添加以下两行内容
1
sudo vi /etc/security/limits.conf
1
2
* soft nofile 1048576
* hard nofile 1048576
  • (2) 编辑 /etc/sysctl.conf 配置文件,添加以下一行内容
1
sudo vi /etc/sysctl.conf
1
fs.file-max = 1048576
1
2
# 使配置更改生效
sudo sysctl -p

第二步

  • (1) 编辑 /etc/pam.d/login 配置文件,添加以下一行内容(必须确保没有该配置项才添加
1
sudo vi /etc/pam.d/login
1
session required pam_limits.so
  • (2) 编辑 /etc/pam.d/common-session 配置文件,添加以下一行内容(必须确保没有该配置项才添加
1
sudo vi /etc/pam.d/common-session
1
session required pam_limits.so
  • (3) 编辑 /etc/pam.d/common-session-noninteractive 配置文件,添加以下一行内容(必须确保没有该配置项才添加
1
sudo vi /etc/pam.d/common-session-noninteractive
1
session required pam_limits.so

第四步

如果运行的是由 systemd 管理的服务(比如 Nginx、MySQL、Redis),则需要更改 systemd 的配置(因为上面的配置不会生效)。

  • (1) 为所有服务更改,会影响所有登录会话
1
2
3
4
5
# 创建配置目录
sudo mkdir -p /etc/systemd/system.conf.d

# 创建配置文件,添加以下四行内容
sudo vi /etc/systemd/system.conf.d/limits.conf
1
2
3
4
[Manager]
DefaultLimitNOFILE=1048576
DefaultLimitNOFILESoft=1048576
DefaultLimitNOFILEHard=1048576
1
2
# 使配置更改生效
sudo systemctl daemon-reload
  • (2) 为特定服务更改(可选操作),比如想更改像 Nginx 这样的 systemd 服务
1
2
# 编辑 Nginx 服务的配置文件,添加以下两行内容
sudo systemctl edit nginx.service
1
2
[Service]
LimitNOFILE=1048576
1
2
3
4
5
6
7
8
# 使配置更改生效
sudo systemctl daemon-reload

# 重启 Nginx 服务
sudo systemctl restart nginx

# 验证更改生效
sudo systemctl show nginx --property=LimitNOFILE

验证更改

  • (1) 重启系统
1
sudo reboot
  • (2) 验证更改
1
ulimit -n
1
cat /proc/sys/fs/file-max
1
systemctl show --property=DefaultLimitNOFILE

常见问题

不同更改方法的对比

场景推荐方法影响范围是否需要重启系统
所有服务都需要高文件描述符修改 /etc/systemd/system.conf.d/limits.conf全局,所有由 systemd 管理的服务需要重启系统
特定服务(如数据库、Web 服务器)执行 systemctl edit 单独设置仅该服务重启该服务即可
仅当前登录会话(非服务)修改 /etc/security/limits.conf 或者执行 ulimit -n 1048576当前用户通过 Shell 启动的进程重新进行 SSH 登录即可

永久更改后 ulimit 不生效

根据上面的操作步骤更改系统的最大文件描述符数,并重启系统后,发现 ulimit -n 命令的执行输出和结果依旧是 1024,即更改不生效。解决步骤如下:

  • (1) 编辑 /etc/profile 配置文件,在文件末尾添加以下一行内容
1
sudo vi /etc/profile
1
ulimit -n 1048576
1
2
# 使配置更改生效
sudo source /etc/profile
  • (2) 编辑 /etc/bash.bashrc 配置文件,在文件末尾添加以下一行内容
1
sudo vi /etc/bash.bashrc
1
ulimit -n 1048576
1
2
# 使配置更改生效
sudo source /etc/bash.bashrc

特别注意

ulimit -n 1048576 命令和 /etc/security/limits.conf 配置文件修改的是当前 Shell 及其启动的子进程的最大文件描述符限制,对 systemd 服务及其管理的其他服务无效。

参考资料