2012-01-17 47 views
0

我的html刮板有问题。 Html-scraper是使用HtmlUnit在Java上编写的多线程应用程序,默认情况下它使用128个线程运行。简而言之,它的工作原理如下:从大文本文件,ping网址和可访问的网址中获取网址 - 解析网站,查找特定的html块,将包含html代码的所有url和块信息保存到数据库中相应的表中并转到下一个网站。数据库是mysql 5.1,有4个InnoDb表和4个视图。表格具有用于表格连接的字段的数字索引。我还有一个用于浏览和搜索分析数据的网络界面(用于搜索我使用带有delta索引的Sphinx),写在CodeIgniter上。Java-mysql高负荷应用程序崩溃

服务器配置:

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 

渣机运行与除下一个选项的默认参数:

-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条记录(约占所有处理URL的25%)并占用8.2Gb时,Java应用程序开始工作非常缓慢,每1-2分钟崩溃一次。我猜是原因是mysql,它无法处理不断增长的负载(解析器,它执行查询每个处理后的url; sphinx,它每10分钟更新一次delta索引;我不考虑web接口,因为它只被一个人使用),也许它非常缓慢地重建索引?但是mysql和scraper日志(也包含所有未捕获的异常)是空的。你怎么看待这件事?

+1

你可以提供更多的崩溃细节?它是一个JVM崩溃,还是你得到像OutOfMemoryError一样的错误。您是否尝试过对应用程序进行内存分析或增加最大内存? – 2012-01-17 13:51:50

+0

它不是一个OutOfMemoryError异常,应用程序只是在几分钟内关闭(可能是由于mysql)。在这个时候,Web界面没有响应,sql查询执行得非常缓慢(300甚至更多)。我试图增加最大内存,但它并不能帮助 – c1tru55 2012-01-18 05:20:23

回答

0

我建议你运行以下只是检查了几个状态的东西.. puting该输出这里将有所帮助:

  1. dmesg
  2. top检查居民VS每过程
  3. 虚拟内存
+0

** **顶 'VIRT RES SHR%CPU%MEM COMMAND' '823米53米2960 460 1.3 mysqld' '3094米1.9克10米329 49.1 java' – c1tru55 2012-01-18 05:56:35

+0

哇啊,Java绝对在那里。你在dmesg中找到了什么结论吗? - 它应该显示哪个线程死亡。 另外 - 你有没有注意到这些程序的内存使用趋势呢?如果你像这样顶层运行你的顶层,你就可以独占地看这两个顶层。 如果Java应用程序每1-2分钟崩溃一次,并且在1-2分钟内运行它的内存使用率为1.9g,则可能表示存在内存泄漏。 – technocrat 2012-01-18 14:35:07

0

因此,应用程序变得无法响应? (根本不一样)我会检查你的所有资源都是免费的。例如做一个jstack来检查是否有线程绑定。

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

0

谢谢大家的建议,mysql实际上是问题的原因。通过在my.conf中启用慢查询日志,我发现执行每次迭代的其中一个查询执行300秒(1个搜索字段未编入索引)。