记一次too many open files 异常
“位卑未敢忘忧国,事定犹须待阖棺”
序
这是一次生产事故。更新了代码之后,第二天一早便有客户反馈服务器访问不了。
我从梦中惊醒,开始检查问题。
在查看了日志之后,发现了下面的错误:
java.io.IOException: Too many open files
我在想,是什么文件被打开多次,导致服务器都挂了呢?一直没有头绪,随后百度了一下,从too many open files(打开的文件过多)解决方法这篇文章中找出了问题,原来是我的过滤器在读取配置文件。
问题分析
因为项目设置ip过滤,几台服务器中好几个节点的ip和端口都要写到过滤器中。于是,我把这些ip写到了一个配置文件中,然后再过滤的方法doFilter()
中来读取该配置文件的ip。所以,问题来了,只要项目任何的一个路径被访问,都要进入过滤器,然后读取配置文件判断ip,当用户和操作多的时候,配置文件就被打开的次数太多了。于是,就出现了上面的问题。
就是这句代码惹的祸。
问题解决
既然这句代码写在doFilter
中会导致文件被读取太多次从而引起错误,那么,可以把这个文件的读取写init
方法中。这样,只是在项目启动的时候被读取一次,然后定义一个全局变量存起来就OK了。这样就可以在doFilter
中使用全局变量来拿到需要过滤的ip了。
引以为戒!
还没有评论,来说两句吧...