原創:扣釘日記(微信公眾號ID:codelogs),歡迎分享,非公眾號轉載保留此聲明。 簡介 現如今,有兩種常見的軟體資源幾乎成了Java後端程式的標配,即線程池與連接池,但這些池化資源非常的重要,一旦不夠用了,就會導致程式阻塞、性能低下,所以有時我們需要看看它們的使用情況,以判斷這裡是否是瓶頸。 ...
原創:扣釘日記(微信公眾號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命令的話,就直接拿去用吧