Java-mysql高负载应用程序崩溃

时间:2012-01-17 12:15:55

标签: java mysql crash scraper high-load

我的html-scraper出了问题。 Html-scraper是使用HtmlUnit在Java上编写的多线程应用程序,默认情况下它运行128个线程。不久,它的工作原理如下:它需要一个来自大文本文件,ping url的站点URL,如果它是可访问的 - 解析站点,找到特定的html块,将所有url和块信息(包括html代码)保存到数据库中的相应表中并转到下一个网站。数据库是mysql 5.1,有4个InnoDb表和4个视图。表具有表连接中使用的字段的数字索引。我还有一个用于浏览和搜索解析数据的网络界面(用于搜索我使用带有delta索引的Sphinx),写在CodeIgniter上。

服务器配置:

CPU: Type Xeon Quad Core X3440 2.53GHz
RAM: 4 GB
HDD: 1TB SATA
OS: Ubuntu Server 10.04

一些mysql配置:

key_buffer = 256M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 128
max_connections = 400
table_cache = 64
query_cache_limit = 2M
query_cache_size = 128M

Java机器使用默认参数运行,但下一个选项除外:

-Xms1024m -Xmx1536m -XX:-UseGCOverheadLimit -XX:NewSize=500m -XX:MaxNewSize=500m -XX:SurvivorRatio=6 -XX:PermSize=128M -XX:MaxPermSize=128m -XX:ErrorFile=/var/log/java/hs_err_pid_%p.log 

当数据库为空时,剪贴板处理18个网址在第二个并且足够稳定。但是在2个弱点之后,当urls表包含384929条记录(约占所有处理网址的25%)并且需要8.2Gb时,java应用程序开始工作非常缓慢并且每1-2分钟崩溃一次。我想原因是mysql,无法处理增长的加载(解析器,它执行2+4*BLOCK_NUMBER查询每个处理的URL; sphinx,它每10分钟更新一次delta索引;我不考虑web接口,因为它被使用只有一个人),也许它很慢地重建索引?但是mysql和scraper日志(也包含所有未捕获的异常)都是空的。你觉得怎么样?

2 个答案:

答案 0 :(得分:0)

我建议运行以下内容只是为了检查一些状态的东西..把输出放在这里也有帮助:

  1. dmesg
  2. top检查驻留对每个进程的虚拟内存

答案 1 :(得分:0)

那么应用程序变得无响应? (根本不是崩溃)我会检查你所有的资源都是免费的。例如执行jstack检查是否有任何线程被绑定。

在MySQL中检查您是否有预期的连接数。如果您在Java中不断创建连接并且不清理它们,则数据库将运行得越来越慢。