【问题标题】:Java-mysql highload application crashJava-mysql 高负载应用程序崩溃
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 顶部 VIRT RES SHR %CPU %MEM COMMAND 823m 53m 2960 460 1.3 mysqld 3094m 1.9g 10m 329 49.1 java
  • 哇,是的,java 肯定是在上面。你在 dmesg 中找到什么结论了吗? - 它应该显示哪个线程死了。另外 - 您是否注意到其中任何一个程序的内存使用趋势?如果您像这样top -p[pid],[pid] 运行您的上衣,您将能够专门观看这两个。如果 java 应用程序每 1-2 分钟崩溃一次,并且在这 1-2 分钟内运行时,它的内存使用量为 1.9g,则可能表示内存泄漏。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-04
      • 2018-12-02
      • 1970-01-01
      • 2015-07-16
      • 2013-09-16
      • 2013-09-23
      • 2021-07-28
      • 2023-01-24
      • 1970-01-01
      相关资源
      最近更新 更多