原創:扣釘日記(微信公眾號ID:codelogs),歡迎分享,非公眾號轉載保留此宣告。
現如今,有兩種常見的軟體資源幾乎成了Java後端程式的標配,即執行緒池與連線池,但這些池化資源非常的重要,一旦不夠用了,就會導致程式阻塞、效能低下,所以有時我們需要看看它們的使用情況,以判斷這裡是否是瓶頸。
在Linux上,通過top -H -p 1
命令,可以檢視java程序的執行緒情況,其中1是java程序號,如下:
如上,可以看到執行緒的名稱、CPU使用率等,其中http-nio-8080-e
就是Tomcat執行緒池中的執行緒,tomcat執行緒全名類似於http-nio-8080-exec-20
,由於Linux中執行緒名稱有長度限制,所以被截斷了。
注:jdk8的話,需要jdk8u222以上版本,才能在top中看到執行緒名稱。
我們數一下http-nio-8080-e
執行緒的數量,發現它有20個,正好對應上了在springboot中的執行緒設定。
這樣能通過top得到執行緒池的執行緒數量了,但如何瞭解執行緒池的使用情況,即活躍執行緒有多少個呢?
經過檢視man檔案,我發現top命令有一個-i
選項,描述如下:
意思就是i
是一個開關選項,預設會顯示全部執行緒,而開啟此選項之後,就只顯示活躍執行緒了!
所以,只需要利用-i
選項,再配合sed/awk/uniq等文書處理命令,即可以統計出活躍執行緒數了,如下:
$ top -H -i -b -d 1 -n2 -p 1 | awk -v RS= 'END{print $0}' | awk '$1 ~ /[0-9]+/{print $12}' | sed -E 's/[0-9]+/n/g' | sort | uniq -c
可以看到,20個執行緒的執行緒池中,在1秒內只有4個執行緒是活躍的,執行緒池中執行緒數量是足夠的。
這個命令指令碼就不展開解釋了,也不復雜,有linux命令基礎的將命令依次拆開執行,應該能Get到指令碼邏輯,沒學過linux命令的話,就直接拿去用吧