繁体   English   中英

Java-MySQL高负载应用程序崩溃

[英]Java-mysql highload application crash

我的html刮板有问题。 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

当数据库为空时,抓取器每秒处理18个URL,并且足够稳定。 但是经过2次弱化后,当urls表包含384929条记录(占所有已处理url的25%)并占用8.2Gb时,java应用程序开始运行非常缓慢,每1-2分钟崩溃一次。 我猜想原因是mysql,无法处理不断增长的负载(解析器,每个处理的url执行2+4*BLOCK_NUMBER查询; sphinx,每10分钟更新一次增量索引;我不考虑网络界面,因为使用了它仅一个人),也许它重建索引的速度很慢? 但是mysql和scraper日志(也包含所有未捕获的异常)为空。 你怎么看待这件事?

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

  1. dmesg
  2. top检查每个进程的驻留内存与虚拟内存

因此,应用程序变得无响应了吗? (完全不同于崩溃)我将检查您所有的资源是否可用。 例如做一个jstack检查是否有任何线程被捆绑。

在MySQL中签入您期望的连接数。 如果您用Java不断创建连接并且不清理它们,则数据库的运行速度将越来越慢。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM