27 November 2010

最近在做程序过程中惊现too many open files异常。

在web程序运行过程中,三不五时有用户反映页面打开慢,查询没有结果。当下的解决办法是赶紧重启了web服务器。然后分析日志,起初发现取连接池中的连接报取不到的错误,以为是连接池的问题,小紧张了一下。继续分析发现这些错误都是跟随在too many open files异常的后面,而这个异常又是常常跟在lucene查询索引的后面。google了一下,此类问题归结于应用程序打开的文件描述符超过系统限制所致,即网络连接(Socket也是一种特殊的文件)或文件IO没有关闭,占用过多。

在linux系统中增大文件描述符的方法: 修改/etc/security/limits.conf,在文件末加上

* - nofile 2048 #具体可google一下。

增大应用程序的可用文件描述符数量不是治本的方法,需要找出是什么在占用而没有及时释放。根据跟踪日志文件定位于索引的查询方法,使用 lsof -p <pid> | wc -l ,查看web服务器进程占用的文件描述符,并不停的执行查询,发现值在不停增加,而且基本没有减少的趋势, lsof -p <pid> > log.txt ,查看导出的记录,发现大量索引文件的路径及名称,而且还有很多重复的文件名。

赶紧检查相关的代码,在处理索引查询的过程中用到循环(一次查询可能涉及到多个索引目录,但需要精确的计数),而indexseacher的关闭是在最后面finally里面,等于循环里面开启的索引文件连接都没有关闭,修改了这个低级bug。 再用 lsof -p <pid> | grep <索引文件的路径> | wc -l 命令测试,执行完索引查询后,查看返回0。问题解决,教训~