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

临时更改

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

永久更改

第一步

  • (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),则需要更改 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

常见问题

永久更改后 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

参考资料