如何解决打开文件数过多问题?

RHEL-Like

1 基础知识

1.1 错误提示

java.io.IOException: Too many open files
        at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) ~[na:1.8.0_65]
        at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422) ~[na:1.8.0_65]
        at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250) ~[na:1.8.0_65]
        at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:446) ~[tomcat-embed-core-9.0.12.jar!/:9.0.12]
        at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:70) ~[tomcat-embed-core-9.0.12.jar!/:9.0.12]
        at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:95) ~[tomcat-embed-core-9.0.12.jar!/:9.0.12]
        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_65]

1.2 原因分析

“Too many open files”是Linux系统中常见的错误
从字面意思是说程序打开的文件数过多
files不仅仅是文件的意思,它包括打开的通讯链接(比如socket)、在监听的端口等等(也称句柄,英文称handle)
此错误常称为句柄数超出系统限制
引起的原因是进程某时刻开启的句柄超过系统限制

2 解决方案

2.1 找出程序进程号

pgrep -u api java

以上参数“-u”后面跟程序的运行用户“api”,命令输出如下,

17656

2.2 查询当前进程的输出数量

lsof -p 17656 | tee ~/openfiles.log | wc -l

2.3 查询当前系统的允许打开的句柄

su - api

以上切换到程序运行用户后,使用如下命令查询,

ulimit -a | grep "open files"

可见如下输出,

open files                      (-n) 2048

2.4 修改允许用户打开的句柄

su - root
vim /etc/security/limits.d/31-imapi.conf

加入如下设置

api               soft    nofile       600000
api               hard    nofile       600000

2.5 确认用户打开的句柄

su - api
ulimit -a | grep "open files"

可见如下输出,

open files                      (-n) 600000
没有评论

发表回复

RHEL-Like
如何配置rsyncd服务?

1 前言 一个问题,一篇文章,一出故事。 由于笔者想实现文件通过rsync自动传输,但是又不想使用o …

RHEL-Like
如何用pam_google_authenticator认证模块实现SSH 2FA?

1 前言 一个问题,一篇文章,一出故事。 笔者想开启2FA以便增强SSH服务的安全性,于是便整理此文 …

RHEL-Like
如何升级RHEL clamav杀毒?

1 前言 一个问题,一篇文章,一出故事。 笔者需要卸载旧的病毒软件,然后更新rpm包的病毒软件,于是 …