成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

線程數,512是否合理?

開發 系統
一般來說,非CPU密集型的業務,瓶頸都在后端數據庫訪問或者RPC調用,本地CPU計算的時間很少,所以設置幾十或者幾百個工作線程是能夠提升吞吐量的。

?Web-Server有個配置,工作線程數。

Service一般也有個配置,工作線程數。

經驗豐富的架構師,懂得如何配置這些參數,使得系統的性能達到最優:有些業務設置為CPU核數的2倍,有些業務設置為CPU核數的8倍,有些業務設置為CPU核數的32倍。

“線程數”的設置依據,是本文要討論的問題。

工作線程數是不是設置的越大越好?

答案顯然是否定的:

  • 服務器CPU核數有限,能夠同時并發的線程數有限,單核CPU設置1000個工作線程沒有意義;
  • 線程切換有開銷,如果線程切換過于頻繁,反而會使性能降低;

調用sleep()函數的時候,線程是否一直占用CPU?

不占用,休眠時會把CPU讓出來,給其他需要CPU資源的線程使用。

不止sleep,一些阻塞調用,例如網絡編程中的:

  • 阻塞accept(),等待客戶端連接;
  • 阻塞recv(),等待下游回包;

都會讓出CPU資源。

單核CPU,設置多線程有意義么?

單核CPU,設置多線程能否提高并發性能?

即使是單核,使用多線程也是有意義的,大多數情況也能提高并發:

  • 多線程編碼可以讓代碼更加清晰,例如:IO線程收發包,Worker線程進行任務處理,Timeout線程進行超時檢測;
  • 如果有一個任務一直占用CPU資源在進行計算,此時增加線程并不能增加并發,例如以下代碼會一直占用CPU,并使得CPU占用率達到100%:
 while(1){ i++; }
  • 通常來說,Worker線程一般不會一直占用CPU進行計算,此時即使CPU是單核,增加Worker線程也能夠提高并發,因為這個線程在休息的時候,其他的線程可以繼續工作;

常見服務線程模型有幾種?

了解常見的服務線程模型,有助于理解服務并發的原理,一般來說互聯網常見的服務線程模型有兩種:

  • IO線程與工作線程通過任務隊列解耦;
  • 純異步;

第一種,IO線程與工作線程通過隊列解耦類模型。

圖片

如上圖,大部分Web-Server與服務框架都是使用這樣的一種“IO線程與Worker線程通過隊列解耦”類線程模型:

  • 有少數幾個IO線程監聽上游發過來的請求,并進行收發包(生產者);
  • 有一個或者多個任務隊列,作為IO線程與Worker線程異步解耦的數據傳輸通道(臨界資源);
  • 有多個工作線程執行真正的任務(消費者);

這個線程模型應用很廣,符合大部分場景,這個線程模型的特點是,工作線程內部是同步阻塞執行任務的,因此可以通過增加Worker線程數來增加并發能力,今天要討論的重點是“該模型Worker線程數設置為多少能達到最大的并發”。

第二種,純異步線程模型。

沒有阻塞,這種線程模型只需要設置很少的線程數就能夠做到很高的吞吐量,該模型的缺點是:

  • 如果使用單線程模式,難以利用多CPU多核的優勢;
  • 程序員更習慣寫同步代碼,callback的方式對代碼的可讀性有沖擊,對程序員的要求也更高;
  • 框架更復雜,往往需要server端收發組件,server端隊列,client端收發組件,client端隊列,上下文管理組件,有限狀態機組件,超時管理組件的支持;

however,這個模型不是今天討論的重點。

第一類“IO線程與工作線程通過隊列解耦”類線程模型,工作線程的工作模式是怎么樣的?

了解工作線程的工作模式,對量化分析線程數的設置非常有幫助:

上圖是一個典型的工作線程的處理過程,從開始處理start到結束處理end,該任務的處理共有7個步驟:

  • 從工作隊列里拿出任務,進行一些本地初始化計算,例如http協議分析、參數解析、參數校驗等;
  • 訪問cache拿一些數據;
  • 拿到cache里的數據后,再進行一些本地計算,這些計算和業務邏輯相關;
  • 通過RPC調用下游service再拿一些數據,或者讓下游service去處理一些相關的任務;
  • RPC調用結束后,再進行一些本地計算,怎么計算和業務邏輯相關;
  • 訪問DB進行一些數據操作;
  • 操作完數據庫之后做一些收尾工作,同樣這些收尾工作也是本地計算,和業務邏輯相關;

分析整個處理的時間軸,會發現:

(1) 其中1,3,5,7步驟中(上圖中粉色時間軸),線程進行本地業務邏輯計算時需要占用CPU;

(2) 而2,4,6步驟中(上圖中橙色時間軸),訪問cache、service、DB過程中線程處于一個等待結果的狀態,不需要占用CPU,進一步的分解,這個“等待結果”的時間共分為三部分:

  • 請求在網絡上傳輸到下游的cache、service、DB;
  • 下游cache、service、DB進行任務處理;
  • cache、service、DB將報文在網絡上傳回工作線程;

如何量化分析,并合理設置工作線程數呢?

通過上面的分析,Worker線程在執行的過程中:

  • 有一部計算時間需要占用CPU;
  • 另一部分等待時間不需要占用CPU;

通過量化分析,例如打日志進行統計,可以統計出整個Worker線程執行過程中這兩部分時間的比例,例如:

  • 執行計算,占用CPU的時間(粉色時間軸)是100ms;
  • 等待時間,不占用CPU的時間(橙色時間軸)也是100ms;

得到的結果是,這個線程計算和等待的時間是1:1,即有50%的時間在計算(占用CPU),50%的時間在等待(不占用CPU):

  • 假設此時是單核,則設置為2個工作線程就可以把CPU充分利用起來,讓CPU跑到100%;
  • 假設此時是N核,則設置為2N個工作現場就可以把CPU充分利用起來,讓CPU跑到N*100%;

當當當當?。?!

結論來了:

N核服務器,通過執行業務的單線程分析出本地計算時間為x,等待時間為y,則工作線程數(線程池線程數)設置為 N*(x+y)/x,能讓CPU的利用率最大化。

一般來說,非CPU密集型的業務(加解密、壓縮解壓縮、搜索排序等業務是CPU密集型的業務),瓶頸都在后端數據庫訪問或者RPC調用,本地CPU計算的時間很少,所以設置幾十或者幾百個工作線程是能夠提升吞吐量的。?

責任編輯:趙寧寧 來源: 架構師之路
相關推薦

2025-06-27 10:25:43

2020-12-14 06:07:59

線程IO密集型CPU密集型

2013-04-01 15:34:46

2010-10-14 15:00:25

MySQL服務器

2021-10-26 07:42:49

Go線程數GMP

2021-07-20 08:12:55

CPU核數線程數

2023-08-15 15:33:29

線程池線程數

2017-07-10 16:23:29

線程CPU單核

2022-03-14 07:32:06

線程池拒絕策略自定義

2024-03-21 13:59:06

圖像研究

2024-05-06 08:17:50

線程池機制線程數

2018-04-27 10:35:08

Tomcat連接數線程池

2009-04-02 11:54:17

2019-12-02 10:19:33

云計算IT云變更

2024-11-08 09:34:54

2023-12-05 07:54:18

Java 7ThreadPool

2024-05-08 00:00:00

核心線程數隊列

2009-02-18 19:54:49

vsftp下載速度限制用戶

2023-01-03 19:11:09

CPUI/O速度

2024-08-02 11:51:03

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美黑人一级爽快片淫片高清 | 午夜精品一区二区三区在线视频 | 国产乱码精品1区2区3区 | 成人福利影院 | 黄色一级大片在线免费看产 | 91视频观看 | 一区二区三区av夏目彩春 | 一区二区三区免费 | 91社影院在线观看 | 国产成人99久久亚洲综合精品 | 一区二区三区精品在线视频 | 成人久草 | av午夜电影| 欧美在线色视频 | 91精品国产色综合久久 | 国产精品自拍av | 午夜一级黄色片 | 久久久精品一区 | www亚洲精品 | 超碰成人免费 | 91玖玖| 亚洲天堂999 | 国产成人精品综合 | 国产高清精品一区二区三区 | 日本一区二区不卡 | 欧美一区二不卡视频 | 二区不卡| 日韩高清国产一区在线 | 黄色一级特级片 | 日本久草 | 蜜桃传媒一区二区 | 精品亚洲一区二区 | 中文字幕在线观看精品 | 精品一二三区在线观看 | 亚洲综合在线播放 | 一区在线视频 | 视频一区在线 | 精品一区二区三区在线观看国产 | 伊人网综合在线观看 | 天天爽一爽| 黄页网址在线观看 |