too many open files 解决终极篇

操作环境:

centos7.X

前提:

部署的java服务莫名其妙的死掉了,查看日志后发现报错too many open files,由于这个问题的复现需要周期,所以开启了探索及解决问题之旅。

网上解决办法

经过不断的度娘之后,发现并没有什么真正的用处,以下是在网上千篇一律的解决方法:

1、查看并更改系统ulimit配置类型的

ulimit -a                       #查看系统内核配置等信息

ulimit -n 65535            #将打开文件数设置为65535(个人感觉是只是登录用户层次的,跟部署服务层面没关系)

修改后重连生效,不生效的话,需要查看sshd文件确认。

vim /etc/ssh/sshd_config
UsePAM yes                        #需要取消注释,设置成yes

2、更改limit文件,重启设备生效类的

1、vim /etc/security/limits.d/20-nproc.conf        
将4096改为655350

2、vim /etc/sysctl.conf

fs.file-max = 65535           #添加限制数

sysctl -p                             #使得配置文件生效

3、vim /etc/security/limits.conf

*               soft    nofile          65535
*               hard    nofile          65535

个人操作办法

以下自己查阅资料实践操作步骤。

1、查看原有进程的限制

ps -ef | grep 服务                                             #查看服务的进程pid

cat /proc/pid(线程的具体pid)/limits              #查看该进程pid的限制,发现是4096.

2、修改原有进程的限制

由于服务是在tomcat上部署的,需要更改tomcat的打开文件数的限制。

由于尝试了好多次,在tomcat的配置文件中不知道应该如何配置,所以尝试了将tomcat添加到systemd服务中进行资源控制,以下为具体步骤。

1、

# 编辑文件
vim /opt/tomcat/bin/catalina.sh
# 更改如下内容
    # Copy CATALINA_BASE from CATALINA_HOME if not already set  
    [ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME"  
    # 设置pid。一定要加在CATALINA_BASE定义后面,要不然pid会生成到/下面  
    CATALINA_PID="$CATALINA_BASE/tomcat.pid"  

2、添加到system服务中

vim /etc/systemd/system/tomcat.service              #创建tomcat服务。

[Unit]  
Description=Apache zhylbyqSystemTomcat 8 chy  
After=syslog.target network.target remote-fs.target nss-lookup.target  
  
[Service]  
Type=forking   
Environment="JAVA_HOME=/var/jdk1.8.0_111"  
PIDFile=/opt/tomcat/tomcat.pid 
ExecStart=/opt/tomcat/bin/startup.sh  
ExecReload=/usr/bin/kill -s HUP $MAINPID  
ExecStop=/usr/bin/kill -s QUIT $MAINPID  
PrivateTmp=true  
 

LimitNOFILE=1048576                          #添加打开文件数的限制。


[Install]  
WantedBy=multi-user.target

3、重启tomcat服务进行查看,发现限制已经修改成功。

systemctl restart tomcat                                  #重启tomcat服务

ps -ef|grep tomcat

cat /proc/pid(线程的具体pid)/limits              #查看该进程pid的限制

猜你喜欢

转载自blog.csdn.net/tiny_du/article/details/115717380