操作环境:
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的限制