too many open files问题排查与解决

995 阅读2分钟

线上视频服务画面不可见了,打开日志发现错误提示 too many open files,是说进程打开的文件数过大,已达上限,线上服务器是ubuntu20.04,默认进程能够打开的文件数配置大小是1024,故需要增大可打开的文件数。

线上视频服务名称为goCamera,查看此服务打开的文件数。

1、查看进程能够打开的最大文件数:

ulimit -a

image.png

2、查询到进程ID:

ps -ef | grep goCamera

得到进程ID为282048

3、查看此进程允许打开的最大文件数:

cat /proc/282048/limits

image.png

4、查询此进程已经打开的文件数:

sudo lsof -p 282048 | wc -l

image.png

目前是355,当涨到一千多的时候就会报错:too many open files

5、增大进程可打开的最大文件数:

5.1、通过命令暂时修改,重启后失效:

若遇权限不足,使用较大权限的账号

ulimit -n 204800

5.2、通过修改配置文件的形式永久修改:

# sudo vim /etc/security/limits.conf
# 在文件末尾添加
*   soft    nofile  204800
*   hard    nofile  204800

至此,如果解决了那就没啥问题了,但如果还是会出现相同的问题,那么检查自己的服务是否交由systemctl进行了管理,若是,则还需要进行配置。

在Centos7 & ubuntu 系统中,使用Systemd替代了之前的SysV。/etc/security/limits.conf文件的配置作用域缩小了。/etc/security/limits.conf的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。

6、修改Systemctl默认的进程能够打开的最大文件数:

# sudo vim /etc/systemd/system.conf
# 在文件末尾添加
DefaultLimitNOFILE=204800
DefaultLimitNPROC=204800

然后运行命令:

# 使修改system.conf生效
sudo systemctl daemon-reexec
# 重启服务
sudo systemctl restart xxx.Service

7、补充:

7.1、查看系统能够打开的最大文件数(区别于进程):

cat /proc/sys/fs/file-max

7.2、修改系统能够打开的最大文件数:

sudo vim /etc/sysctl.conf
# 文件末尾添加
fs.file-max=1000000
# 刷新配置生效
sudo sysctl -p 

8、总结:

淦!