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

CentOS(RHEL)

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
没有评论

发表评论

CentOS(RHEL)
如何修复非XFS文件系统逻辑坏道?

1 前言 一个问题,一篇文章,一出故事。 笔者服务器根分区出现逻辑坏道,于是整理此文。 另外,如果你 …

CentOS(RHEL)
如何破解CentOS或RHEL 7的root密码?

1 前言 一个问题,一篇文章,一出故事。 本章将讲述如何破解系统root的密码。 2 最佳实践 2. …

CentOS(RHEL)
如何进入CentOS或RHEL 7的拯救模式?

1 基础知识 拯救模式(Rescue Mode)指从硬盘引导或光盘等媒介启动一个小型的linux系统 …