AEM 對話串傾印分析
請依照本文章詳述的步驟和最佳實務,使用IBM對話串分析器工具成功分析AEM Java對話串傾印。
說明 description
環境
Adobe Experience Manager
問題
如何使用IBM對話串分析器工具分析AEM Java對話串傾印?
解決方法 resolution
-
下載並安裝IBM執行緒分析器 (我們將其簡稱為IBM TDA)。
-
從體驗效能問題的 AEM 執行個體擷取對話串傾印。
-
在 IBM TDA 中開啟對話串傾印。
-
若要檢視對話串傾印的詳細資訊,請選取清單中的檔案,然後按一下 對話串詳細資訊 按鈕。
-
依 棧疊深度 排序,最長的棧疊在頂端。
-
檢閱堆疊深度為 10 行或更長的對話串。 這些通常是人們最感興趣的對話串。
記下感興趣的對話串。
-
依執行緒 狀態 排序。
-
向下捲動至 可執行的 執行緒。 可執行的對話串指在進行對話串傾印時積極使用 CPU 時間的對話串。
注意:檢閱 可執行的 執行緒時,您可以忽略列於本頁底部 Threads 區段的可忽略執行緒。
-
尋找屬於應用程式一部分的可執行的對話串,例如,背景作業對話串或請求對話串(請求對話串的名稱如下 — 127.0.0.1
[
1347028187737]
GET/content/sites/global/en/sitemap.static-delivery.httpd.html HTTP/1.1)。找到它們後,請逐一按一下。
-
對於每個請求對話串,您可以檢視對話串名稱中的時間戳記,以瞭解使用者的瀏覽器何時向伺服器提出請求。
例如,在上述執行緒名稱中,時間戳記(以毫秒為單位的unix epoch格式)是 1347028187737。
我們可以使用www.epochconverter.com將該epoch數字轉換為日期/時間。
每個對話串傾印都會顯示執行時的日期和時間。
您可以透過請求時間和對話串傾印時間之間的時間差來檢視請求活動的時間。
-
檢閱過要求對話串後,捲動瀏覽其他 可執行的 對話串。
找到感興趣的可執行緒後,請檢視中間面板 等待執行緒。
那裡列出的Threads正在等待所選對話串釋出監視器。
如果您沒有看到任何等待對話串,那麼您選取的對話串可能仍然是鎖定的擁有者(如需詳細資訊,請參閱鎖定的實作類別)。
例如,透過ReentrantReadWriteLock,您無法分辨哪個對話串是鎖定持有者,因為鎖定會在內部實作多個監視器。
因此,您可能必須檢視原始程式碼以將其與可能是鎖定持有者的對話串進行比對。
-
如果對話串有許多其他對話串正在等候的鎖定或監視器,則請檢查其餘的對話串傾印以檢視是否可以找到有相同問題的其他對話串。
檢視其他對話串中是否仍然存在相同的對話串(在IBM TDA中,您可以選取多個對話串傾印並按一下 比較Threads 按鈕,以檢視多個對話串傾印中的對話串狀態。
-
請參閱下列熒幕擷圖中的 收集器服務:
-
在此檢視中,您可以檢視多個對話串傾印中的對話串,以瞭解它是否為長時間執行的對話串。
基本上,如果對話串在多個傾印中處於 可執行的 狀態並且具有長棧疊,則通常表示它是一個長時間執行的對話串。
-
如果您在檢視 可執行專案 對話串時沒有發現太多內容,請返回對話串清單,選取對話串傾印,然後按一下頂端面板上的 監視器詳細資訊 按鈕。
IBM TDA將開啟視窗,顯示擁有對話串及其等待對話串的監視器樹檢視。
注意:它可能會顯示一些執行緒集區執行緒,例如servlet引擎執行緒集區監視器,可以忽略閒置的執行緒。
您通常可以分辨對話串是否為閒置的對話串池對話串,因為大多數時候它們只有10個或更少的棧疊行。
執行緒層級CPU使用率(僅限Linux平台):
-
如果您除了對話串傾印之外還擷取了
top -H -b -n1 -p <javapid>
輸出,那麼您可以交叉參照對話串層級CPU使用率。開啟頂端輸出並取得正在使用CPU的對話串的處理ID。
將流程ID轉換為十六進位,然後在對應的對話串傾印檔案中搜尋該十六進位值。
識別碼應該符合其中一個執行緒的 nid。
-
如果使用最多CPU的相符執行緒是 VM執行緒 或任何 GC 執行緒,那麼您可能有記憶體問題。
對更多對話串傾印和頂端輸出重複相同的練習,如果出現這些對話串佔用CPU時間的模式,則說明存在記憶體問題。
-
如果您已確認記憶體問題,則在下次發生問題時擷取棧積傾印。
請參閱此分析記憶體問題文章,以取得擷取和分析棧積傾印的詳細資料。
可忽略的 Threads:
- VM 對話串:這是一種 VM 系統對話串。
- 以 GC 任務對話串開始的對話串:這些是垃圾收集對話串。
- 名稱類似於
- [ 1347028691218] in code at java.net.PlainSocketImpl.socketAccept(Native Method)
的Threads:這些是來自servlet引擎的執行緒集區,等待新連線的執行緒。