學習筆記-Spring boot 內建執行緒池最佳化

一、Sprint boot 內建執行緒池最佳化

# 等待佇列長度,預設100。佇列也做緩衝池用,但也不能無限長,不但消耗記憶體,而且出隊入隊也消耗CPU

server。tomcat。accept-count=1000

# 最大工作執行緒數,預設200。(4核8g記憶體,執行緒數800,一般是核數*200。作業系統做執行緒之間的切換排程是有系統開銷的,所以不是越多越好。)

server。tomcat。max-threads=800

# 最小工作空閒執行緒數,預設10。(適當增大一些,以便應對突然增長的訪問量)

server。tomcat。min-spare-threads=100

#最大連線數,預設為10000

server。tomcat。max-connections=10000

預設配置下,連線超過10000後會出現拒絕連線情況

預設配置下,觸發的請求超過200+100後拒絕處理(最大工作執行緒數+等待佇列長度)

上線前可以壓測一下,調整引數配置,檢視tomcat執行緒數命令如下:

獲取tomcat程序pid :ps -ef|grep tomcat

統計該tomcat程序內的執行緒個數 :ps -Lf 29295 |wc -l

二、檢視執行緒情況

jstack統計執行緒數:

jstack -l 28367 | grep ‘java。lang。Thread。State’ | wc -l

jstack 檢視http連線數:

jstack -l XXXx | grep http | wc -l

三、系統負載

負載(load)是linux機器的一個重要指標,直觀了反應了機器當前的狀態。如果機器負載過高,那麼對機器的操作將難以進行。Linux的負載高,主要是由於CPU使用、記憶體使用、IO消耗三部分構成。任意一項使用過多,都將導致伺服器負載的急劇攀升。

檢視伺服器負載有多種命令,w或者uptime都可以直接展示負載,

$ uptime

12:20:30 up 44 days, 21:46, 2 users, load average: 8。99, 7。55, 5。40

$ w

12:22:02 up 44 days, 21:48, 2 users, load average: 3。96, 6。28, 5。16

load average分別對應於過去1分鐘,5分鐘,15分鐘的負載平均值。

什麼是Load?什麼是Load Average?

Load 就是對計算機幹活多少的度量(WikiPedia:the system Load is a measure of the amount of work that a compute system is doing)簡單地說是程序佇列的長度。Load Average 就是一段時間(1分鐘、5分鐘、15分鐘)內平均Load。

如何判斷系統是否已經Over Load

對一般的系統來說,根據cpu數量去判斷。如果平均負載始終在1。2以下,而你有2顆cup的機器。那麼基本不會出現cpu不夠用的情況。也就是

Load平均要小於Cpu的數量,一般是會根據15分鐘那個load 平均值為首先

這兩個命令只是單純地反映出負載,linux提供了更為強大,也更為實用的top命令來檢視伺服器負載。

$top

學習筆記-Spring boot 內建執行緒池最佳化

Tasks行展示了目前的程序總數及所處狀態,要注意zombie,表示殭屍程序,不為0則表示有程序出現問題。

Cpu(s)行展示了當前CPU的狀態,us表示使用者程序佔用CPU比例,sy表示核心程序佔用CPU比例,id表示空閒CPU百分比,wa表示IO等待所佔用的CPU時間的百分比。

wa佔用超過30%則表示IO壓力很大

Mem行展示了當前記憶體的狀態,total是總的記憶體大小,userd是已使用的,free是剩餘的,buffers是目錄快取。

Swap行同Mem行,cached表示快取,使用者已開啟的檔案。

如果Swap的used很高,則表示系統記憶體不足

在top命令下,按1,則可以展示出伺服器有多少CPU,及每個CPU的使用情況

學習筆記-Spring boot 內建執行緒池最佳化

一般而言,伺服器的合理負載是CPU核數*2。也就是說對於8核的CPU,負載在16以內表明機器執行很穩定流暢。如果負載超過16了,就說明伺服器的執行有一定的壓力了。

在top命令下,

按shift + "c",則將程序按照CPU使用率從大到小排序

按shift+"p",則將程序按照記憶體使用率從大到小排序

,很容易能夠定位出哪些服務佔用了較高的CPU和記憶體。

僅僅有top命令是不夠的,因為它僅能展示CPU和記憶體的使用情況,對於負載升高的另一重要原因——IO沒有清晰明確的展示。linux提供了iostat命令,可以瞭解io的開銷。

輸入

iostat -x 1 10

命令,表示開始監控輸入輸出狀態,

-x表示顯示所有引數資訊,1表示每隔1秒監控一次,10表示共監控10次

學習筆記-Spring boot 內建執行緒池最佳化

其中rsec/s表示讀入,wsec/s表示每秒寫入,這兩個引數某一個特別高的時候就表示磁碟IO有很大壓力,util表示IO使用率,如果接近100%,說明IO滿負荷運轉。

檢視系統負載vmstat

$vmstat

procs ——————-memory—————— ——-swap—— ——-io—— -system—— ————cpu——-

r b swpd free buff cache si so bi bo in cs us sy id wa st

0 0 0 689568 121068 1397252 0 0 77 8 110 745 4 1 93 1 0

r

列表示執行和等待cpu時間片的程序數,如果長期大於1,說明cpu不足,需要增加cpu。

b

列表示在等待資源的程序數,比如正在等待I/O、或者記憶體交換等。 cpu 表示cpu的使用狀態

us

列顯示了使用者方式下所花費 CPU 時間的百分比。us的值比較高時,說明使用者程序消耗的cpu時間多,但是如果長期大於50%,需要考慮最佳化使用者的程式。

sy

列顯示了核心程序所花費的cpu時間的百分比。這裡us + sy的參考值為80%,如果us+sy 大於 80%說明可能存在CPU不足。

wa

列顯示了IO等待所佔用的CPU時間的百分比。這裡wa的參考值為30%,如果wa超過30%,說明IO等待嚴重,這可能是磁碟大量隨機訪問造成的,也可能磁碟或者磁碟訪問控制器的頻寬瓶頸造成的(主要是塊操作)。

id

列顯示了cpu處在空閒狀態的時間百分比 system 顯示採集間隔內發生的中斷數

in

列表示在某一時間間隔中觀測到的每秒裝置中斷數。 cs列表示每秒產生的上下文切換次數,如當 cs 比磁碟 I/O 和網路資訊包速率高得多,都應進行進一步調查。

memory

swpd

切換到記憶體交換區的記憶體數量(k表示)。如果swpd的值不為0,或者比較大,比如超過了100m,只要si、so的值長期為0,系統性能還是正常

free

當前的空閒頁面列表中記憶體數量(k表示) buff 作為buffer cache的記憶體數量,一般對塊裝置的讀寫才需要緩衝。 cache: 作為page cache的記憶體數量,一般作為檔案系統的cache,如果cache較大,說明用到cache的檔案較多,如果此時IO中bi比較小,說明檔案系統效率比較好。 swap

si

由記憶體進入記憶體交換區數量。 so由記憶體交換區進入記憶體數量。 IO

bi

從塊裝置讀入資料的總量(讀磁碟)(每秒kb)。 bo 塊裝置寫入資料的總量(寫磁碟)(每秒kb)

這裡我們設定的bi+bo參考值為1000,如果超過1000,而且wa值較大應該考慮均衡磁碟負載,可以結合iostat輸出來分析