【发布时间】:2012-01-17 12:15:54
【问题描述】:
我的 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/日志/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 分钟更新一次 delta 索引;我不考虑 Web 界面,因为它仅用于一个人),也许它重建索引很慢?但是 mysql 和 scraper 日志(也包含所有未捕获的异常)是空的。你怎么看?
【问题讨论】:
-
你能提供更多关于崩溃的细节吗?是 JVM 崩溃,还是出现 OutOfMemoryError 之类的错误。您是否尝试过对应用程序进行内存分析或增加最大内存?
-
这不是 OutOfMemoryError 异常,应用程序只是在几分钟内静默关闭(可能是由于 mysql)。此时 web-interface 没有响应,sql 查询执行非常缓慢(300s 和更多)。我尝试增加最大内存,但没有帮助
标签: java mysql web-scraping crash high-load