自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

線程數(shù),512是否合理?

開(kāi)發(fā) 系統(tǒng)
一般來(lái)說(shuō),非CPU密集型的業(yè)務(wù),瓶頸都在后端數(shù)據(jù)庫(kù)訪問(wèn)或者RPC調(diào)用,本地CPU計(jì)算的時(shí)間很少,所以設(shè)置幾十或者幾百個(gè)工作線程是能夠提升吞吐量的。

?Web-Server有個(gè)配置,工作線程數(shù)。

Service一般也有個(gè)配置,工作線程數(shù)。

經(jīng)驗(yàn)豐富的架構(gòu)師,懂得如何配置這些參數(shù),使得系統(tǒng)的性能達(dá)到最優(yōu):有些業(yè)務(wù)設(shè)置為CPU核數(shù)的2倍,有些業(yè)務(wù)設(shè)置為CPU核數(shù)的8倍,有些業(yè)務(wù)設(shè)置為CPU核數(shù)的32倍。

“線程數(shù)”的設(shè)置依據(jù),是本文要討論的問(wèn)題。

工作線程數(shù)是不是設(shè)置的越大越好?

答案顯然是否定的:

  • 服務(wù)器CPU核數(shù)有限,能夠同時(shí)并發(fā)的線程數(shù)有限,單核CPU設(shè)置1000個(gè)工作線程沒(méi)有意義;
  • 線程切換有開(kāi)銷,如果線程切換過(guò)于頻繁,反而會(huì)使性能降低;

調(diào)用sleep()函數(shù)的時(shí)候,線程是否一直占用CPU?

不占用,休眠時(shí)會(huì)把CPU讓出來(lái),給其他需要CPU資源的線程使用。

不止sleep,一些阻塞調(diào)用,例如網(wǎng)絡(luò)編程中的:

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

都會(huì)讓出CPU資源。

單核CPU,設(shè)置多線程有意義么?

單核CPU,設(shè)置多線程能否提高并發(fā)性能?

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

  • 多線程編碼可以讓代碼更加清晰,例如:IO線程收發(fā)包,Worker線程進(jìn)行任務(wù)處理,Timeout線程進(jìn)行超時(shí)檢測(cè);
  • 如果有一個(gè)任務(wù)一直占用CPU資源在進(jìn)行計(jì)算,此時(shí)增加線程并不能增加并發(fā),例如以下代碼會(huì)一直占用CPU,并使得CPU占用率達(dá)到100%:
 while(1){ i++; }
  • 通常來(lái)說(shuō),Worker線程一般不會(huì)一直占用CPU進(jìn)行計(jì)算,此時(shí)即使CPU是單核,增加Worker線程也能夠提高并發(fā),因?yàn)檫@個(gè)線程在休息的時(shí)候,其他的線程可以繼續(xù)工作;

常見(jiàn)服務(wù)線程模型有幾種?

了解常見(jiàn)的服務(wù)線程模型,有助于理解服務(wù)并發(fā)的原理,一般來(lái)說(shuō)互聯(lián)網(wǎng)常見(jiàn)的服務(wù)線程模型有兩種:

  • IO線程與工作線程通過(guò)任務(wù)隊(duì)列解耦;
  • 純異步;

第一種,IO線程與工作線程通過(guò)隊(duì)列解耦類模型。

圖片

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

  • 有少數(shù)幾個(gè)IO線程監(jiān)聽(tīng)上游發(fā)過(guò)來(lái)的請(qǐng)求,并進(jìn)行收發(fā)包(生產(chǎn)者);
  • 有一個(gè)或者多個(gè)任務(wù)隊(duì)列,作為IO線程與Worker線程異步解耦的數(shù)據(jù)傳輸通道(臨界資源);
  • 有多個(gè)工作線程執(zhí)行真正的任務(wù)(消費(fèi)者);

這個(gè)線程模型應(yīng)用很廣,符合大部分場(chǎng)景,這個(gè)線程模型的特點(diǎn)是,工作線程內(nèi)部是同步阻塞執(zhí)行任務(wù)的,因此可以通過(guò)增加Worker線程數(shù)來(lái)增加并發(fā)能力,今天要討論的重點(diǎn)是“該模型Worker線程數(shù)設(shè)置為多少能達(dá)到最大的并發(fā)”。

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

沒(méi)有阻塞,這種線程模型只需要設(shè)置很少的線程數(shù)就能夠做到很高的吞吐量,該模型的缺點(diǎn)是:

  • 如果使用單線程模式,難以利用多CPU多核的優(yōu)勢(shì);
  • 程序員更習(xí)慣寫(xiě)同步代碼,callback的方式對(duì)代碼的可讀性有沖擊,對(duì)程序員的要求也更高;
  • 框架更復(fù)雜,往往需要server端收發(fā)組件,server端隊(duì)列,client端收發(fā)組件,client端隊(duì)列,上下文管理組件,有限狀態(tài)機(jī)組件,超時(shí)管理組件的支持;

however,這個(gè)模型不是今天討論的重點(diǎn)。

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

了解工作線程的工作模式,對(duì)量化分析線程數(shù)的設(shè)置非常有幫助:

上圖是一個(gè)典型的工作線程的處理過(guò)程,從開(kāi)始處理start到結(jié)束處理end,該任務(wù)的處理共有7個(gè)步驟:

  • 從工作隊(duì)列里拿出任務(wù),進(jìn)行一些本地初始化計(jì)算,例如http協(xié)議分析、參數(shù)解析、參數(shù)校驗(yàn)等;
  • 訪問(wèn)cache拿一些數(shù)據(jù);
  • 拿到cache里的數(shù)據(jù)后,再進(jìn)行一些本地計(jì)算,這些計(jì)算和業(yè)務(wù)邏輯相關(guān);
  • 通過(guò)RPC調(diào)用下游service再拿一些數(shù)據(jù),或者讓下游service去處理一些相關(guān)的任務(wù);
  • RPC調(diào)用結(jié)束后,再進(jìn)行一些本地計(jì)算,怎么計(jì)算和業(yè)務(wù)邏輯相關(guān);
  • 訪問(wèn)DB進(jìn)行一些數(shù)據(jù)操作;
  • 操作完數(shù)據(jù)庫(kù)之后做一些收尾工作,同樣這些收尾工作也是本地計(jì)算,和業(yè)務(wù)邏輯相關(guān);

分析整個(gè)處理的時(shí)間軸,會(huì)發(fā)現(xiàn):

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

(2) 而2,4,6步驟中(上圖中橙色時(shí)間軸),訪問(wèn)cache、service、DB過(guò)程中線程處于一個(gè)等待結(jié)果的狀態(tài),不需要占用CPU,進(jìn)一步的分解,這個(gè)“等待結(jié)果”的時(shí)間共分為三部分:

  • 請(qǐng)求在網(wǎng)絡(luò)上傳輸?shù)较掠蔚腸ache、service、DB;
  • 下游cache、service、DB進(jìn)行任務(wù)處理;
  • cache、service、DB將報(bào)文在網(wǎng)絡(luò)上傳回工作線程;

如何量化分析,并合理設(shè)置工作線程數(shù)呢?

通過(guò)上面的分析,Worker線程在執(zhí)行的過(guò)程中:

  • 有一部計(jì)算時(shí)間需要占用CPU;
  • 另一部分等待時(shí)間不需要占用CPU;

通過(guò)量化分析,例如打日志進(jìn)行統(tǒng)計(jì),可以統(tǒng)計(jì)出整個(gè)Worker線程執(zhí)行過(guò)程中這兩部分時(shí)間的比例,例如:

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

得到的結(jié)果是,這個(gè)線程計(jì)算和等待的時(shí)間是1:1,即有50%的時(shí)間在計(jì)算(占用CPU),50%的時(shí)間在等待(不占用CPU):

  • 假設(shè)此時(shí)是單核,則設(shè)置為2個(gè)工作線程就可以把CPU充分利用起來(lái),讓CPU跑到100%;
  • 假設(shè)此時(shí)是N核,則設(shè)置為2N個(gè)工作現(xiàn)場(chǎng)就可以把CPU充分利用起來(lái),讓CPU跑到N*100%;

當(dāng)當(dāng)當(dāng)當(dāng)?。?!

結(jié)論來(lái)了:

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

一般來(lái)說(shuō),非CPU密集型的業(yè)務(wù)(加解密、壓縮解壓縮、搜索排序等業(yè)務(wù)是CPU密集型的業(yè)務(wù)),瓶頸都在后端數(shù)據(jù)庫(kù)訪問(wèn)或者RPC調(diào)用,本地CPU計(jì)算的時(shí)間很少,所以設(shè)置幾十或者幾百個(gè)工作線程是能夠提升吞吐量的。?

責(zé)任編輯:趙寧寧 來(lái)源: 架構(gòu)師之路
相關(guān)推薦

2020-12-14 06:07:59

線程IO密集型CPU密集型

2013-04-01 15:34:46

2010-10-14 15:00:25

MySQL服務(wù)器

2021-10-26 07:42:49

Go線程數(shù)GMP

2021-07-20 08:12:55

CPU核數(shù)線程數(shù)

2023-08-15 15:33:29

線程池線程數(shù)

2022-03-14 07:32:06

線程池拒絕策略自定義

2017-07-10 16:23:29

線程CPU單核

2024-03-21 13:59:06

圖像研究

2024-05-06 08:17:50

線程池機(jī)制線程數(shù)

2018-04-27 10:35:08

Tomcat連接數(shù)線程池

2009-04-02 11:54:17

2024-11-08 09:34:54

2024-05-08 00:00:00

核心線程數(shù)隊(duì)列

2023-01-03 19:11:09

CPUI/O速度

2009-02-18 19:54:49

vsftp下載速度限制用戶

2023-12-05 07:54:18

Java 7ThreadPool

2019-12-02 10:19:33

云計(jì)算IT云變更

2024-08-02 11:51:03

2011-12-22 13:02:38

綠色機(jī)房合理建設(shè)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)