標籤(空格分隔): Thread Pool Webweb
本文原文是 How To Determine Web Application Thread Pool Sizeexpress
繼續當擴展 Web 應用程序時面臨的架構問題,在這篇博客中,我將介紹一個常見的問題,怎樣肯定 Web 應用程序的線程池大小?當部署 Web 應用程序到生產或是當 Web 應用程序性能測試的時候會顯示出來。架構
在 Web 應用程序中,線程池大小決定了它們能在任什麼時候候處理的併發請求數。若是一個 Web 應用程序獲得的請求比線程池多,多餘的請求要麼排隊要麼被拒絕。併發
請注意併發並非並行。併發請求是在任什麼時候間點只有少數請求能夠運行在 CPU 上正在被處理的請求數。並行請求是在任什麼時候間點全部的請求均可以運行在 CPU 上的正在處理的請求數。性能
在非阻塞 I/O 應用程序中,好比 NodeJS,一個單進程(線程)能處理併發的處理多個請求。在多核 CPU 環境,能夠經過增長進程或線程數來處理並行請求。測試
在阻塞 I/O 應用程序中,好比 Java SpringMVC,一個單進程僅僅能夠併發的處理一個請求。爲了併發的處理更多的請求,咱們不得不增長線程數。spa
CPU 限制的應用程序,線程池的大小應該等於系統裏面 CPU 的數量。增長更多的線程將中斷請求處理,因爲線程上下文切換,這樣也會增長響應時間。線程
非 I/O 阻塞的應用程序將被 CPU 限制,由於它們沒有線程等待時間,當請求獲得處理的時候。3d
肯定 I/O 限制應用程序的線程池的大小是複雜的多,並依賴於下游系統的響應時間,由於一個線程會被阻塞直到其餘系統響應了。咱們將不得不增長線程的數量,以便更好地利用 CPU,正如在 Reactor Pattern Part 1 : Applications with Blocking I/O 中的討論。code
利特爾法則被用於非技術領域,好比銀行須要計算出處理進入銀行的客戶所須要的出納臺的數量。
The long-term average number of customers in a stable system L is equal to the long-term average effective arrival rate, λ, multiplied by the average time a customer spends in the system, W; or expressed algebraically: L = λW.
利特爾法則應用於 Web 應用程序。
在一個系統中的平均線程數量等於平均的 web 請求到達率(每秒的 web 請求數),乘以平均響應時間(ResponseTime)。
線程 = 線程數
每秒 web 請求數 = 在 1s 內能被處理的 web 請求數
響應時間 = 處理一個 web 請求所花費的時間
線程 = (每秒 web 請求數) X 響應時間
當以上的方程式提供了須要的線程數來處理傳入的請求,它沒有提供線程 CPU 利用率的信息。好比,多少個線程應該被分配在給定系統的 X CPU。
爲了找出吞吐量和響應時間之間最佳平衡的線程池大小。每一個 CPU 最小線程啓動開始(Threads Pool Size = No of CPUs),應用程序線程池大小直接與下游系統的平均響應時間成正比,直到 CPU 使用率爆了,或是響應時間降級。
下面的圖說明了多少個請求數,CPU 和鏈接響應時間指標。
CPU Vs 請求數圖表顯示了增長 Web 應用程序負載的時候,CPU 的利用率。
響應時間 Vs 請求數圖表顯示了因爲增長 Web 應用程序的負載,對響應時間的影響。
綠點表示最佳吞吐量和響應時間。
線程池大小 = CPU 數量
以上圖表描述了阻塞 I/O 限制應用程序,當線程數等於 CPU 數時。應用程序線程被阻塞等待下游系統響應。由於線程被阻塞,響應時間隨着請求進入隊列增長。即便 CPU 利用率很是低,隨着全部的請求被阻塞,應用程序開始拒絕請求。
大線程池
以上圖表描述了當大量的線程在 Web 應用程序中被建立時,阻塞 I/O 限制了應用程序。因爲大量的線程,線程切換將很是頻繁。應用程序的 CPU 使用率會爆滿,即便吞吐量沒有增長,因爲沒必要要的線程上下文切換。由於上下文切換形成的請求被中斷,響應時間降級。
最佳線程池大小
以上圖表描述了當最佳線程池大小在 Web 應用程序中被建立的時,阻塞 I/O 限制了應用程序。CPU 獲得有效使用,並由良好的吞吐量和更少的線程上下文切換。咱們注意到響應時間是適合因爲請求被高效率的處理(不多的中斷)。
在大部分 Web 應用程序中,一些類型的 web 請求相對於其餘類型的 web 請求須要更長的時間來處理。最慢的請求將夯住全部的請求,並下降整個應用程序的性能。
兩種方法來處理這個問題:
肯定一個阻塞 I/O Web 應用程序的最佳線程池大小是一個很是困難的任務。一般經過進行一些性能運行完成。有幾個線程池在 Web 應用程序中會更加複雜化肯定最佳線程池大小的過程。