我的 html-scraper 有问题。Html-scraper 是使用 HtmlUnit 在 Java 上编写的多线程应用程序,默认情况下它运行 128 个线程。很快,它的工作原理如下:它从大文本文件中获取站点 url,ping url,如果可以访问 - 解析站点,查找特定的 html 块,将所有 url 和块信息(包括 html 代码)保存到数据库中的相应表中,然后转到下一个站点。数据库是mysql 5.1,有4个InnoDb表和4个视图。表具有用于表连接的字段的数字索引。我还有一个用于浏览和搜索已解析数据的 Web 界面(用于搜索,我使用带有增量索引的 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
当数据库为空时,scraper每秒处理 18 个 url,并且足够稳定。但是在 2 次弱点之后,当 urls 表包含 384929 条记录(约占所有已处理 url 的 25%)并占用 8.2Gb 时,java 应用程序开始工作非常缓慢并且每 1-2 分钟崩溃一次。我猜原因是 mysql,它无法处理不断增长的负载(解析器,它对2+4*BLOCK_NUMBER
每个处理的 url 执行查询;sphinx,每 10 分钟更新一次增量索引;我不考虑 web 界面,因为它只有一个人使用) ,也许它重建索引很慢?但是 mysql 和 scraper 日志(也包含所有未捕获的异常)是空的。你怎么看待这件事?