记录一次线上项目运行一段时间后不能正常使用问题解决
一.问题描述
一个风和日丽的周末午后,突然有种不详的感觉,公司群消息,突然来了一句“系统登录不进去”。一阵冷汗,不能影响客户使用,立马开机远程办公电脑,通过工具进入到后台主机查看日志,发现不停的打印too many open files,有一种似曾相识的感觉,在此之前,处理过一次,有点驾轻就熟了,首先还是秉着不影响客户使用的原则,重启项目,日志下载下来后面再来研究。
二.问题分析
1. 首先咱们得清楚一点,报错的原因:linux系统中对进程可以调用的文件句柄数进行了限制,超过限制进程将无法获取新的句柄,不能打开新的文件或者网络套接字,就会报错。
2. 咱可以先查询下我们的主机设置的限制是多大,是否有必要对其进行调大: (centos 6.5 查看/etc/security/limits.d/90-nproc.conf、 centos 7.0 查看/etc/security/limits.d/20-nproc.conf) 3. 句柄数的限制4096能满足开销了才是,为什么还会超过呢?带着这样的疑问,我们继续分析,通过lsof -p命令查看进程的句柄数,还有类型,发现这次并不是因为FIFO类型的文件在增加,而是IPv6类型的在不断增加。
4. 通过对这些ip的分析,在后端的日志中发现,这个ip就是使用系统的客户端ip,在后端的日志中发现,用户并没有做什么其他操作,并且后端也并没有涉及到流未关闭的情况,那么只能够自己去系统中操作一番,确认是哪个页面有什么特殊操作导致的,带着这个疑问,说干就干。
5. 通过努力,最终发觉,用户在直接关闭浏览器、或者直接退出登录操作后,服务端都会出现TCP状态为close_wait的句柄数据,沉思片刻后,前段时间同事有在做消息推送的需求,后端通过SseEmitter进行消息推送,会不会是这个问题导致的呢?后面定位前端代码,发觉果真如此,在直接关闭浏览器、或者直接退出登录操作都没有关闭流操作 至此问题,终于定位出来,后续就把问题告诉同事,让前端进行没有感情的修复操作。
三.建议
咱们在写代码的时候,还是要谨慎细心,避免一些不必要的问题出现,让人冷汗直冒。
|