目標

使用 IBM Thread Analyzer 工具分析 AEM Java 執行緒傾印。

步驟

  1. 下載並安裝 IBM Thread Analyzer (以下簡稱 IBM TDA)。
  2. 從遇到效能問題的 AEM 例項中擷取執行緒傾印
  3. 在 IBM TDA 中開啟執行緒傾印。
  4. 若要檢視執行緒傾印的詳細資訊,請在清單中選取該檔案,然後按一下「執行緒詳細資訊」按鈕*。
tda-threaddetail
  1. 依據「堆疊深度」排序,使最長的堆疊排在上方。
tda-image1
  1. 檢閱堆疊深度 10 行以上的執行緒。 這些執行緒通常為最需要注意的部分。 記下需要注意的執行緒。
  2. 依據執行緒「狀態」排序。
  3. 向下捲動至「可執行的」執行緒。可執行的執行緒是指收集執行緒傾印時主動佔用 CPU 時間的執行緒。

注意: 檢閱「可執行的」執行緒時,您可以忽略列於此頁底部「可忽略的執行緒」一節中的執行緒。

  1. 尋找屬於應用程式之可執行的執行緒,例如背景工作執行緒或請求執行緒 (請求執行緒的名稱如下 127.0.0.1 [1347028187737] GET /content/sites/global/en/sitemap.static-delivery.httpd.html HTTP/1.1)。找到該執行緒後,請依序點選。
  2. 在各個請求執行緒中,您可以查看執行緒名稱中的時間戳記,藉此瞭解使用者瀏覽器傳送請求至伺服器的時間。 例如,在上述的執行緒中,其時間戳記 (使用毫秒 Unix Epoch 格式) 為 1347028187737。  我們可以使用 www.epochconverter.com 將該 Epoch 數字轉換為日期/時間。 當系統收集執行緒傾印時,各個執行緒傾印皆會顯示日期和時間。 您可以透過請求時間與執行緒傾印時間之間的差距,瞭解請求作用的時間長度。
  3. 檢閱該請求執行緒後,請捲動尋找其他「可執行的」執行緒。 當您找到需要注意之「可執行的」執行緒,請查看中間的「等待中的執行緒」面板。 列於該面板中的執行緒正在等待選取的執行緒釋放監控。 如果您沒有看見任何等待中的執行緒,則表示選取的執行緒可能仍為「鎖定」的擁有者 (如需詳細資訊,請參閱鎖定的實作類別)。舉例來說,鎖定會在內部實作多個監控,因此您無法透過 ReentrantReadWriteLock 分辨何者為具備鎖定持有者身分的執行緒。 如此您可能需要查看原始碼進行比對,找出可能為鎖定持有者的執行緒。
  4. 如果該執行緒有多個其他執行緒正在等待的鎖定或監控,請逐一檢視其餘執行緒傾印,嘗試找出其他出現相同問題的執行緒。 瞭解是否有相同的執行緒存在於其他傾印中 (在 IBM TDA 中,您可以選取多個執行緒傾印,然後按一下「比較執行緒」按鈕*,在多個執行緒傾印中檢視執行緒的狀態)。
tda-comparethreads
  1. 請參閱以下螢幕擷取畫面中的「收集器服務」:
tda-Image2
  1. 在此檢視中,您可以在多個執行緒傾印中查看該執行緒,以瞭解其是否為長時間執行的執行緒。 一般而言,如果該執行緒在多個傾印中皆為「可執行」狀態且具有長堆疊,則通常表示其為長時間執行的執行緒。
  2. 如果您在查看可執行的執行緒過程中幾乎沒有結果,請返回執行緒清單,選取某個執行緒傾印,接著按一下頂端面板上的「監控詳細資訊」按鈕*。IBM TDA 將會開啟視窗,顯示擁有執行緒及其等待中之執行緒的監控樹狀圖。注意: 視窗中會顯示部分執行緒集區的執行緒 (例如 servlet 引擎執行緒集區監控),閒置的執行緒可忽略。 您通常能夠分辨出某個執行緒是否為閒置執行緒集區的執行緒,原因在於大多數時間裡,該執行緒僅有 10 行以下的堆疊。
tda-monitordetail
  1. 在頂端面板上,按一下「尋找長時間執行的執行緒」按鈕 (此按鈕為望遠鏡的圖示)。
  2. 您現在應該會在左下角的執行緒傾印後方看見新的圖示。按一下此圖示,隨即顯示所有長時間執行的的執行緒。
  3. 重複相同步驟,按一下右側面板中的「狀態」以進行排序。
  4. 向下捲動至可執行的執行緒,在各傾印間逐一尋找曾處於執行狀態的執行緒。
執行緒層級 CPU 使用率 (僅限 Linux 平台):
  1. 除執行緒傾印外,如果您擷取到「top -H -b -n1 -p <javapid>」輸出,則可交叉參照執行緒層級 CPU 使用率。 開啟頂端的輸出,並取得使用 CPU 之執行緒的處理程序 ID。 將該處理程序 ID 轉換為十六進位,接著在對應的執行緒傾印檔案中搜尋其十六進位值。 該 ID 應符合任一執行緒的「nid」。
  2. 如果使用最多 CPU 的符合執行緒為「VM Thread」或任何「GC」執行緒,則表示您的記憶體可能出現問題。為 針對其他執行緒傾印與頂端的輸出重複相同步驟,如果其中出現這些執行緒佔用 CPU 時間的現象,則表示您的記憶體出現問題。
  3. 如果您已確認記憶體問題,則可在下次發生該問題時擷取堆積傾印。 如需有關擷取與分析堆積傾印的詳細資訊,請參閱本文

可忽略的執行緒:

  • VM Thread: 此為 VM 系統執行緒。
  • 以 GC 作業執行緒開頭的執行緒: 這些是記憶體回收執行緒。
  • 執行緒名稱類似於 java.net.PlainSocketImpl.socketAccept(Native Method) 之程式碼中的 - [1347028691218]: 這些執行緒來自 servlet 引擎執行緒集區,正在等待新的連線。

此産品由 Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License 授權  Creative Commons 條款未涵蓋 Twitter™ 與 Facebook 文章。

法律說明   |   線上隱私權政策