我的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日志(也包含所有未捕获的异常)是空的。你怎么看待这件事?
你可以提供更多的崩溃细节?它是一个JVM崩溃,还是你得到像OutOfMemoryError一样的错误。您是否尝试过对应用程序进行内存分析或增加最大内存? – 2012-01-17 13:51:50
它不是一个OutOfMemoryError异常,应用程序只是在几分钟内关闭(可能是由于mysql)。在这个时候,Web界面没有响应,sql查询执行得非常缓慢(300甚至更多)。我试图增加最大内存,但它并不能帮助 – c1tru55 2012-01-18 05:20:23