死磕併發之到底建立多少個執行緒合適

2021-10-05 05:42:27 字數 1013 閱讀 1186

使用多執行緒的目的就是提公升程式效能,在併發程式設計領域,提公升效能本質上就是提公升硬體的利用率,再具體點來說,就是提公升 i/o 的利用率和 cpu 的利用率。而解決的方案就是多執行緒

知道了解決方案,問題又來了,建立多少個執行緒合適呢?多了會造成cpu上下文切換,浪費資源不說效能還上不去,少了吧cpu利用率又上不去。接下來讓我們分析下到底建立多少個執行緒比較合適。

建立多少執行緒合適,要看多執行緒具體的應用場景。我們的程式一般都是 cpu 計算和 i/o 操作交叉執行的,由於 i/o 裝置的速度相對於 cpu 來說都很慢,所以大部分情況下,i/o 操作執行的時間相對於 cpu 計算來說都非常長,這種場景我們一般都稱為 i/o 密集型計算;和 i/o 密集型計算相對的就是 cpu 密集型計算了,cpu 密集型計算大部分場景下都是純 cpu 計算。i/o 密集型程式和 cpu 密集型程式,計算最佳執行緒數的方法是不同的。

cpu密集型:

理論上 執行緒的數量=cpu核數就是最合適的,不過在一般會設定為cpu核數 + 1,這樣因為偶爾的記憶體頁失效或者其他原因導致的執行緒阻塞,這個執行緒可以頂上,從保證cpu利用率。

i/o密集型:

如果 cpu 計算和 i/o 操作的耗時是 1:1,那麼 2 個執行緒是最合適的。如果 cpu 計算和 i/o 操作的耗時是 1:2,那多少個執行緒合適呢?

由此我們可得到乙個計算公式

單核計算方式:最佳執行緒數 =1 +(i/o 耗時 / cpu 耗時)

多核計算方式:最佳執行緒數 =cpu 核數 * [ 1 +(i/o 耗時 / cpu 耗時)]

i/o耗時和cpu耗時可通過工具apm來進行測試。公式只是用來參考,在專案中還需要根據業務來進行壓測結果來進行調整。

以上公式只針對單台伺服器部署單個應用的場景,有可能乙個伺服器會部署n個應用,這種就要根據具體場景來調整了。

多執行緒,到底該設定多少個執行緒?

不好了,線上伺服器超時嚴重,請求非常慢,好像報連線數too many了,怎麼辦?小夥伴們在反饋。一般我們的技術老大的處理方式,把連線數和執行緒池調大點,重啟,再觀察。往往這個方式是應急措施,治標不治本,因為不知道問題的原因。有個嚴重誤區,以為執行緒池設定太小了,調大點請求就會快了。今天就帶著小夥伴們...

多執行緒,到底該設定多少個執行緒?

不好了,線上伺服器超時嚴重,請求非常慢,好像報連線數too many了,怎麼辦?小夥伴們在反饋。一般我們的技術老大的處理方式,把連線數和執行緒池調大點,重啟,再觀察。往往這個方式是應急措施,治標不治本,因為不知道問題的原因。有個嚴重誤區,以為執行緒池設定太小了,調大點請求就會快了。今天就帶著小夥伴們...

多執行緒,到底該設定多少個執行緒?

不好了,線上伺服器超時嚴重,請求非常慢,好像報連線數too many了,怎麼辦?小夥伴們在反饋。一般我們的技術老大的處理方式,把連線數和執行緒池調大點,重啟,再觀察。往往這個方式是應急措施,治標不治本,因為不知道問題的原因。有個嚴重誤區,以為執行緒池設定太小了,調大點請求就會快了。今天就帶著小夥伴們...