您的位置:首页 > 运维架构

Too many open files 产生的原因分析及解决

2008-09-04 17:05 302 查看
 

1.1  现象分析

在模拟环境上对XXX网站进行性能测试,xxx页面一个用户运行100次之后即报错,搜索功能只能承受约3个并发用户的访问。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

对发现的问题进行分析后,得到如下的一些分析结果:

1.    通过查看系统源代码,发现系统未将打开的数据库连接及时关闭,造成数据库连接越开越多,当数据库连接的数目达到connectionpool设置的值之后,后续的访问就不能再和数据库建立起连接,产生报错信息。

2.    搜索引擎方面,开发单位解释目前搜索引擎不是专业的工具,因此造成承受的并发量很低。

3.    在多用户并发访问网站的情况下,操作系统的文件描述符使用达到操作系统设置的极限极限值时,WebLogic Server后台会有报错信息产生。文件描述符不仅被打开的文件占用,同时每个新的套接字都需要一个描述符。客户端和服务器通过 TCP 套接字进行通信。在与服务器建立连接时,每个浏览器的 http 请求都使用 TCP 套接字。由于文件描述符达到系统设置的极限,WebLogic将报File Not Found Exception及 failed to listen on port 7001两类异常。使用pfiles命令跟踪操作系统打开的文件描述符,发现当文件描述符达到上限1024的同时,WebLogic Server开始报上述错误。

4.      对网站的服务器端代码进行检查后发现,并不存在用来打开和关闭文件的用户代码,并且分析文件描述符的占用情况发现打开的文件描述符并不是IO文件,而是Socket监听。当并发访问的压力较小(100个左右)由于文件描述符在每个客户连接正常中断的情况下能够得到正常的释放(会看到文件描述符出现周期性的波峰波谷),但是当并发用户增加到一定的极限(300左右)时,网站服务器在测试工具默认的2分钟时间内不能进行正常响应(客户端会因超时而中断连接),但服务器端依旧继续处理用户的请求,这时文件描述符因来不及释放会发生泄漏并以较快的速度进行累积,达到操作系统设定的峰值,造成WebLogic Server报错。

5.      在WebLogic Server的参数配置为数据库连接25个,执行线程数为25个时,进行并发测试发现,WebLogic服务器主机在处理完初始的连接后,CPU占用率几乎为零,进入等待数据库的执行结果的空闲状态,也就是说WebLogic处理完请求后,将数据库执行SQL提交给Oracle进行执行,它将一直等待执行的结果回来,直到达到超时时限。此时数据库服务器的磁盘占有率非常高,数据库正在频繁的读写数据。当进行了一段时间之后,客户端认为超时(默认120秒)时,直接切断了连接。(这种情况非常类似如果请求响应太慢,一个用户强行关闭了浏览器),异常关闭直接导致文件描述符泄漏。在客户断异常中断连接后,WebLogic以及数据库仍然在提供服务,WebLogic队列里面的线程仍然继续执行(这一点可以说明如果用户异常退出,但是在服务器端的处理并没有因此而结束),这是由于Http协议的短连接特性造成的。同时由于WebLogic中的线程的概念远小于用户请求的一个jsp页面的概念,也就是说一个用户的完整请求会被分为很多小的请求,这也很符合用压力测试工具看到的结果,所有的并发用户执行完全部请求返回给客户端的响应时间很相近,几乎同时在客户端接到响应。

6.      在WebLogic Server的参数置为数据库连接10个,WebLogic执行线程数为10个时,使用数据库检测工具发现数据库的10个连接,总是在活动与不活动之间切换,且总是有空余的连接。但是这个时候客户端的响应时间非常长,大概在300秒左右,且WebLogic一直非常繁忙,证明这个时候的系统瓶颈开始转向WebLogic。

1.2 测试结论

综上所述,我们认为,造成该系统问题的最根本的原因在于数据库的瓶颈。当数据库出现瓶颈后,该系统反应非常慢,用户会主动的断开或者重新请求连接,而由于HTTP协议的短连接机制,原来的请求仍然在队列等待,从而使得系统压力持续加大,并进而表现为文件描述符达到极限。

1.3 问题解决

1.对代码进行查阅后发现,该系统的翻页设计存在较大缺陷。该系统在计算当前页面将显示的内容时,将数据库中的所有记录返回,然后在确定当前页面显示的问题,对数据库造成了很大的开销。经修改后(使用子查询,仅返回显示页面需要的数据),平均查询的速度(服务器端的)由原来的20s降低至20ms,性能提高了约1000倍。

 

2.由于测试的模块为查询模块,而监测发现数据库的磁盘存在<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1M/s的写入,并且操作系统的pi(Pagein)、 po(Pageout)参数较高,可能发生的较大的页面交换,从而影响系统性能。运营方对数据库的PGA参数进行了调节,从而性能得到进一步提高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息