如何決定Web應用線程池大小

這篇文章將涉及一個在部署Web應用產品和Web系統性能測試中都會出現的問題:如何決定Web應用的線程池大小?

線程池(Thread Pool)

在Web應用中線程池的大小決定了在任何一個時間點應用可以處理請求的併發數。如果一個系統收到的請求數超過了線程池的大小,那麼超出的請求要麼進入等待隊列要麼被拒絕。

請注意,併發和並行是不同的。併發請求是指在任何一個時間點,所有被處理的請求中只有只有很少一部分佔用CPU(譯者注:輪流使用CPU)。並行是指在任何一個時間點,所有被處理的請求同時在CPU上運行。

在非阻塞式(NO-Blocking)應用中(如NodeJs),一個單獨的線程或進程可以併發處理多個請求。而在多核CPU中則可以通過增加線程或進程數來實現並行處理。

在阻塞式IO應用中(如java的SringMVC,一個線程只能同時處理一個併發請求。如果想要併發處理多個請求只能通過增加線程數來實現。

CPU消耗型應用

對於CPU消耗型應用來說,線程池的大小應該和單臺服務器的CPU個數相同。對於這類應用由於線程上下文切換增加線程數反而會妨礙對請求的處理,同時還會增加響應時間。

非阻塞式IO應用由於在請求被處理時並不需要等待請求處理完成,因此屬於CPU消耗型的應用。

IO消耗型應用

由於IO消耗型應用依賴於下行流量所在系統的響應時間,而且一個線程在其他系統響應完成之前將一直阻塞,所以決定IO消耗型應用的線程池大小變得更加困難。對於這類型應用,我們就像在阻塞式IO應用文章中講的,通過增加線程數來提高CPU利用率。

科特爾法則(Little’s Law)

科特爾法則通常被用在非技術領域,例如告訴銀行櫃檯出納員還有多少客戶在等待請求處理。

下面是維基百科對科特爾法的說明,英文原文如下:

The average number of threads in a system (Threads) is equal average web request arrival rate (WebRequests per sec), multiplied by the average response time (ResponseTime)

譯文:一個系統的平均線程數(線程數)等於平均請求的到達率(每秒請求數)乘以平均響應時間(響應時間)

公式:線程數=每秒請求數 X 響應時間

公式說明:

線程數 系統所能處理的線程數量

每秒請求數 每秒鐘所能處理的請求數

響應時間 處理一個請求所花費的時間

當然,上邊的公式給出了處理多少請求需要多少線程,但是並沒有考慮線程對CPU的佔用率等情況,也沒有說明對於多核的單臺機器應該分配多少線程。

通過測試決定線程池大小

要分配合適大小的線程池就需要在吞吐量和響應時間這兩個要素之間尋求平衡點。從每個CPU最少線程數開始(即線程數=cpu數),系統線程數和平均響應時間成正比直到CPU使用率達到最大或者響應時間不再減少爲止。

下圖說明了請求數、CPU和響應時間之間的關係。

CPU和請求數的圖中展示了隨着Web系統負載量不斷增加時CPU的使用情況。

響應時間和請求數的圖中展示了Web系統負載量的增加對響應時間的影響。

綠色的點表示吞吐量和響應時間的最優點。

線程池大小=CPU核心數

上圖展示的是阻塞式IO消耗型應用在線程池大小等於CPU核心數量時的情況。線程由於要等待下行流量的IO處理所以會阻塞,而由於線程的阻塞使響應時間進一步增加,而且即使CPU的佔用率非常低,但是線程池中所有線程都處於阻塞狀態,那麼應用還是會拒絕請求。

大的線程池

上圖展示的是阻塞式IO消耗型應用在大的線程池下的使用情況。由於線城池數量大,線程上下文切換也變得非常頻繁,而正是這些沒必要的上下文切換使得應用還沒有達到最大吞吐量時CPU就已經達到最大佔用率了。請求響應時間也由於頻繁的上下文切換而快速增長。

最優線程池大小

上圖展示的是阻塞式IO消耗型應用在最優線程池下的情況。在高吞吐量和更少線程上文切換的情況下CPU得到了高效的利用。同時我們注意到,好的響應時間取決於在線程更少被阻斷(上下文切換)的情況下對請求的高效處理。

線程池隔離

在大多數應用中,只有少數類型的請求會比其他請求更耗時,但這少數的耗時請求會影響整個系統的性能。有兩個辦法可以解決這個問題:

1) 將比較耗時的請求隔離開來專門處理

2) 在同一個應用中爲耗時的web請求單獨分配一個線程池

決定一個阻塞式IO消耗型應用的最優線程池大小是一件困難的事情,這通常需要通過多個性能測試來決定。如果在一個應用中使用多個線程池,會使對線程池的優化進一步複雜化。

1. 本文由程序員學架構翻譯,mathew同學校審

2. 本文譯自How To Determine Web Application Thread Pool Size - Venkatesh CM

3. 轉載請務必註明本文出自:程序員學架構(微信號:archleaner )



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章