簡體   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