0

我的 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 日志(也包含所有未捕获的异常)是空的。你怎么看待这件事?

4

3 回答 3

0

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

于 2012-01-18T16:54:00.350 回答
0

所以应用程序变得无响应?(与崩溃完全不同)我会检查您的所有资源都是免费的。例如jstack,检查是否有任何线程被占用。

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

于 2012-01-18T08:28:35.403 回答
0

我建议运行以下命令来检查一些状态。将输出放在这里也会有所帮助:

  1. dmesg
  2. top检查每个进程的驻留内存与虚拟内存
于 2012-01-17T16:10:20.560 回答