我的html scraper有问题。Htmlscraper是使用HtmlUnit在Java上编写的多线程应用程序,默认情况下它使用128个线程运行。很快,它的工作原理如下:它从大文本文件中获取一个网站url,ping url,如果它是可访问的——解析网站,找到特定的html块,将所有url和块信息(包括html代码)保存到数据库中的相应表中,然后转到下一个网站。数据库是mysql 5.1,有4个InnoDb表和4个视图。对于表联接中使用的字段,表具有数字索引。我还有一个用于浏览和搜索解析数据的web界面(对于搜索,我使用带有delta索引的Sphinx),它是在CodeIgniter上编写的。
服务器配置:
CPU: Type Xeon Quad Core X3440 2.53GHz
RAM: 4 GB
HDD: 1TB SATA
OS: Ubuntu Server 10.04
一些mysql-config:
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
当数据库为空时,scraper在第二秒内处理18个url,并且足够稳定。但在两个漏洞之后,当url表包含384929条记录(约占所有已处理url的25%)并占用8.2Gb时,java应用程序开始工作非常缓慢,每1-2分钟就会崩溃一次。我想原因是mysql,它不能处理不断增长的加载(解析器,它对每个处理过的url执行2+4*BLOCK_NUMBER
查询;sphinx,它每10分钟更新一次delta索引;我不考虑web接口,因为它只有一个人使用),也许它重建索引很慢?但是mysql和scraper日志(其中也包含所有未捕获的异常)是空的。你觉得怎么样?
我建议运行以下程序来检查一些状态。。将输出放在这里也会有所帮助:
dmesg
top
检查每个进程的常驻内存与虚拟内存
所以应用程序变得没有响应?(与崩溃完全不同)我会检查一下你所有的资源都是免费的。例如执行CCD_ 4以检查是否有任何线程被绑定。
在MySQL中检查您是否有预期的连接数。如果您不断地用Java创建连接,而不清理它们,那么数据库的运行速度会越来越慢。
感谢大家的建议,mysql实际上是问题的原因。通过在my.conf中启用慢速查询日志,我发现其中一个执行每次迭代的查询执行300秒(用于搜索的1个字段没有索引)。