Skip to content

解决文件描述符不足问题

查看当前限制值

# 这将显示当前 shell 的文件描述符软限制。
ulimit -n
# 硬限制
ulimit -Hn
# 查看已经使用 ?
lsof | wc -l
  • 查看整个系统的文件描述符使用情况

 cat /proc/sys/fs/file-nr
6944    0       9223372036854775807
输出三列:

已分配的文件句柄数(in-use) 已分配但未使用的句柄数(unused) 最大可分配句柄数(max)

如果第一列接近第三列,则需要增加系统最大值:

sysctl fs.file-max
如需临时增大:

sudo sysctl -w fs.file-max=2097152
永久生效,编辑 /etc/sysctl.conf 添加:

fs.file-max = 2097152

临时增加限制

ulimit -n 65535

永久增加限制

/etc/security/limits.conf

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

如果使用 systemd 启动 NFS,还需要设置 systemd 服务级别的限制。 systemctl edit nfs-kernel-server.service

[Service]
LimitNOFILE=65536
保存并退出,然后重新加载 systemd 配置
sudo systemctl daemon-reexec
sudo systemctl daemon-reload

解决问题

inotify 的最大实例数

$ cat /proc/sys/fs/inotify/max_user_instances
128

解决方法: 临时设置更大值:

sudo sysctl -w fs.inotify.max_user_instances=8192
永久设置:编辑 /etc/sysctl.conf 添加:

fs.inotify.max_user_instances = 8192
应用更改:

sudo sysctl -p

还可以检查以下参数,如有必要也适当调大:

cat /proc/sys/fs/inotify/max_user_watches   # 默认 8192
cat /proc/sys/fs/inotify/max_queued_events  # 默认 16384
修改方式同上,在 /etc/sysctl.conf 中添加对应项。

  • 确保 systemd 对服务的限制足够大 即使全局 ulimit 设置正确,systemd 服务也可能有自己的限制。

编辑服务文件:

sudo systemctl edit nfs-kernel-server.service
确保有:

[Service]
LimitNOFILE=1048576
然后重载配置:

sudo systemctl daemon-reload
sudo systemctl restart nfs-kernel-server

Comments