2011-08-23 40 views
13

正如我在Performance drop after 5 days running web application, how to spot the bottleneck?中發佈的那樣,運行一段時間後應用程序運行緩慢時出現問題。如何使用VisualVM來發現瓶頸/問題

我得到VisualVM運行並在不同的時間之間做了一個快照。現在應用程序非常慢,但我不知道如何發現瓶頸。他們之間彼此之間沒有太多的區別,唯一有點增長的就是堆,這是一段時間後垃圾收集的成功。

任何人都可以給我一些指針嗎?

這裏是快照(應用程序):

[1] http://www.2shared.com/file/W4XJ6HtE/application-1314108550032.html

[2] http://www.2shared.com/fadmin/22521338/f512f97e/application-1314097232727.apps.html

謝謝!

編輯:仔細一看,我注意到CPU甚至沒有使用太多..而系統真的很慢!

+0

在第二快照上的TCP NO延遲和內格爾限制設置(其越過一個小時,而第一越過4秒只)有在CPU上的一些負載,幾乎沒有負荷創建由GC提供。如果CPU是瓶頸,您應該嘗試分析哪些方法會導致此問題。你也可以在jvisualvm中做到這一點。 – ziggystar

+0

運行應用程序的應用程序服務器是什麼?它是否在Web服務器前端?如果是,那麼2個連接(哪個模塊)如何。 – atrain

回答

4

實際上,有一些比VisualVM更好的工具。

你可以嘗試JProfiler的,這是一個很好的探查(但支付)

而且你可以嘗試對NetBeans Profiler,這是免費的偉大工程

有了VisualVM的您只能看到實際狀態你的應用程序(內存和CPU使用情況,JMX,加載的類等)。

+3

有更好的工具;但這並不意味着你在這種情況下需要他們(我目前無法判斷)。 JvisualVM還包括一個分析器(儀器和採樣)和一個內存分析器。你也可以安裝額外的插件。 – ziggystar

+0

@ziggystar很高興知道,不知道! –

6

作爲第一步,我會建議確定究竟是什麼慢。它是否緩慢執行一些工作?或者說處理來自不同客戶的工作的吞吐量低?

什麼資源效率不高?

  • 如果您正在使用一些外部服務(如數據庫或RPC服務器)總是記錄他們的響應時間,使任何其他優化步驟之前檢查。
  • 這可能是缺乏處理器能力。只需查看CPU使用情況。
  • 這可能是缺乏記憶。使用gc日誌記錄來檢測此類問題。有關於它的good topic
  • 這可能是缺乏硬盤速度。使用iostat並瞭解您的硬盤性能限制。
  • 這可能是缺乏網絡吞吐量。檢查網絡頻道使用情況
  • 此外,您可能會耗盡一些操作系統特定的限制,如打開的文件和/或網絡套接字的數量。檢查您是否將所有操作系統級異常正確報告到日誌文件中。

由於您已經確定哪些資源不夠有效,並且您的程序中遭受這種情況的部分,您可以嘗試查找要優化的代碼段。採用隨機工具並通過它運行應用程序而不知道要查找什麼是沒有意義的。

從我個人的經驗來看,非常罕見的情況是,當你只有一個緩慢的方法時,可以通過探查器找到它。這很可能是您的算法或錯誤的數據庫模式中的意外的IO和/或同步。

0

我不會假設你的應用程序存在問題,如果它的基於Windows的系統查看病毒掃描程序,那麼當時運行的任何更新調度程序。

確保您的日誌正在翻轉並且調試過濾正確,因此它們不會失去控制。

檢查任何長時間運行的查詢的sql快照。檢查數據庫加載和數據庫堆。

如果您有Visual VM運行一段時間,請確保您有一些線程準備好接受工作/連接將顯示爲黃色(空閒)。

在黑暗 Eclipse Memory Analyzer

一聲槍響採取堆轉儲,當你注意到放緩,並通過分析儀運行它。

如果你在基於unix的系統上檢查文件描述符ulimit -a以確保java進程沒有最大化。

檢查服務器