在WebSphere上有個我覺得非常實用的功能,就是ThreadMonitor。
WebSphere預設會每隔3分鐘,偵測Server上運作的程式,有沒有thread停住超過10分鐘的,如果有,就在TextLog中記錄下來。
如此一來,我們就可以透過定期檢查log,來看看是否程式在運作上是否都正常,有沒有效能的問題,
如果有,就可以進一步檢查,是哪段程式lock住了,lock住的原因是什麼?
以我自己的經驗來說,就有好幾次透過log裡面的紀錄,
發現程式效能上的問題並提早處理,並在問題影響範圍沒擴大之前及早修正。
這邊我就透過一段小程式來模擬hung的情況,
private void threadHung(int sec) {
try {
Thread.sleep(sec*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我把這段程式放在Demo的servlet裡面,透過param參數去控制要thread要sleep幾秒,
http://localhost:9080/Iron30/DemoServlet?action=threadHung&sec=1000
這邊我先跑個1千秒試試
從log可以看到
我在9/29/22 15:20:05:164 UTC 時執行了thrad hung的模擬程式 (thradhung是我印出來的)
到了[9/29/22 15:31:09:545 UTC]
差不多過了11分鐘左右的時候,ThreadMonitor發現了有個thrad 10分鐘沒反應
[9/29/22 15:31:09:545 UTC] 000000b6 ThreadMonitor W WSVR0605W: Thread "WebContainer : 0" (00000078) has been active for 664,380 milliseconds and may be hung. There is/are 1 thread(s) in total in the server that may be hung.
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:952)
at rei1997.servlet.DemoServlet.threadHung(DemoServlet.java:63)
at rei1997.servlet.DemoServlet.doGet(DemoServlet.java:38)
.
.
.
這裡可以看到log裡面清楚記錄,這條thread是停在java.lang.Thread.sleep方法上了
1000秒,程式執行完畢後
ThreadMonitor會再印出log,紀錄它發現這條thread的已經執行完成了。
[9/29/22 15:36:45:166 UTC] 00000078 ThreadMonitor W WSVR0606W: Thread "WebContainer : 0" (00000078) was previously reported to be hung but has completed. It was active for approximately 1,000,002 milliseconds. There is/are 0 thread(s) in total in the server that still may be hung.
大概就是這樣,
通常我檢查log都會下這樣的指令:
cd [log所在目錄]
grep 0605W TextLog\*.log
有沒有hung thread可以一目了然。
明天再補充一些相關設定,今天就先這樣吧。