国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java線(xiàn)程數究竟設多少合理

發(fā)布時(shí)間:2021-07-17 21:51 來(lái)源:腳本之家 閱讀:0 作者:JiaJian 欄目: 編程語(yǔ)言 歡迎投稿:712375056

目錄

          需求緣起

          Web-Server通常有個(gè)配置,最大工作線(xiàn)程數,后端服務(wù)一般也有個(gè)配置,工作線(xiàn)程池的線(xiàn)程數量,這個(gè)線(xiàn)程數的配置不同的業(yè)務(wù)架構師有不同的經(jīng)驗值,有些業(yè)務(wù)設置為CPU核數的2倍,有些業(yè)務(wù)設置為CPU核數的8倍,有些業(yè)務(wù)設置為CPU核數的32倍。

          “工作線(xiàn)程數”的設置依據是什么,到底設置為多少能夠最大化CPU性能,是本文要討論的問(wèn)題。

          一些共性認知

          在進(jìn)行進(jìn)一步深入討論之前,先以提問(wèn)的方式就一些共性認知達成一致。

          1、提問(wèn):工作線(xiàn)程數是不是設置的越大越好?

          回答:肯定不是的。

          • 一來(lái)服務(wù)器CPU核數有限,同時(shí)并發(fā)的線(xiàn)程數是有限的,1核CPU設置10000個(gè)工作線(xiàn)程沒(méi)有意義。
          • 線(xiàn)程切換是有開(kāi)銷(xiāo)的,如果線(xiàn)程切換過(guò)于頻繁,反而會(huì )使性能降低。

          2、提問(wèn):調用sleep()函數的時(shí)候,線(xiàn)程是否一直占用CPU?

          回答:不占用,等待時(shí)會(huì )把CPU讓出來(lái),給其他需要CPU資源的線(xiàn)程使用。

          不止調用sleep()函數,在進(jìn)行一些阻塞調用,例如網(wǎng)絡(luò )編程中的阻塞accept()【等待客戶(hù)端連接】和阻塞recv()【等待下游回包】也不占用CPU資源。

          3、提問(wèn):如果CPU是單核,設置多線(xiàn)程有意義么,能提高并發(fā)性能么?

          回答:即使是單核,使用多線(xiàn)程也是有意義的。

          多線(xiàn)程編碼可以讓我們的服務(wù)/代碼更加清晰,有些IO線(xiàn)程收發(fā)包,有些Worker線(xiàn)程進(jìn)行任務(wù)處理,有些Timeout線(xiàn)程進(jìn)行超時(shí)檢測。

          如果有一個(gè)任務(wù)一直占用CPU資源在進(jìn)行計算,那么此時(shí)增加線(xiàn)程并不能增加并發(fā),例如這樣的一個(gè)代碼:

          while(1){ i++; }

          該代碼一直不停的占用CPU資源進(jìn)行計算,會(huì )使CPU占用率達到100%。

          通常來(lái)說(shuō),Worker線(xiàn)程一般不會(huì )一直占用CPU進(jìn)行計算,此時(shí)即使CPU是單核,增加Worker線(xiàn)程也能夠提高并發(fā),因為這個(gè)線(xiàn)程在休息的時(shí)候,其他的線(xiàn)程可以繼續工作。

          常見(jiàn)服務(wù)線(xiàn)程模型

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

          1. IO線(xiàn)程與工作線(xiàn)程通過(guò)隊列解耦類(lèi)模型

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

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

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

          2. 純異步線(xiàn)程模型

          任何地方都沒(méi)有阻塞,這種線(xiàn)程模型只需要設置很少的線(xiàn)程數就能夠做到很高的吞吐量,Lighttpd有一種單進(jìn)程單線(xiàn)程模式,并發(fā)處理能力很強,就是使用的的這種模型。該模型的缺點(diǎn)是:

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

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

          工作線(xiàn)程的工作模式

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

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

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

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

          1)其中1,3,5,7步驟中【上圖中粉色時(shí)間軸】,線(xiàn)程進(jìn)行本地業(yè)務(wù)邏輯計算時(shí)需要占用CPU。
          2)而2,4,6步驟中【上圖中橙色時(shí)間軸】,訪(fǎng)問(wèn)cache、service、DB過(guò)程中線(xiàn)程處于一個(gè)等待結果的狀態(tài),不需要占用CPU。

          進(jìn)一步的分解,這個(gè)“等待結果”的時(shí)間共分為三部分:

          1. 請求在網(wǎng)絡(luò )上傳輸到下游的cache、service、DB。
          2. 下游cache、service、DB進(jìn)行任務(wù)處理。
          3. cache、service、DB將報文在網(wǎng)絡(luò )上傳回工作線(xiàn)程。

          量化分析并合理設置工作線(xiàn)程數

          最后一起來(lái)回答工作線(xiàn)程數設置為多少合理的問(wèn)題。

          通過(guò)上面的分析,Worker線(xiàn)程在執行的過(guò)程中,有一部計算時(shí)間需要占用CPU,另一部分等待時(shí)間不需要占用CPU,通過(guò)量化分析,例如打日志進(jìn)行統計,可以統計出整個(gè)Worker線(xiàn)程執行過(guò)程中這兩部分時(shí)間的比例,例如:

          1. 時(shí)間軸1,3,5,7【上圖中粉色時(shí)間軸】的計算執行時(shí)間是100ms 。
          2. 時(shí)間軸2,4,6【上圖中橙色時(shí)間軸】的等待時(shí)間也是100ms 。

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

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

          結論

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

          經(jīng)驗

          一般來(lái)說(shuō),非CPU密集型的業(yè)務(wù)(加解密、壓縮解壓縮、搜索排序等業(yè)務(wù)是CPU密集型的業(yè)務(wù)),瓶頸都在后端數據庫,本地CPU計算的時(shí)間很少,所以設置幾十或者幾百個(gè)工作線(xiàn)程也都是可能的。

          以上就是Java線(xiàn)程數究竟設多少合理的詳細內容,更多關(guān)于Java線(xiàn)程數的資料請關(guān)注腳本之家其它相關(guān)文章!

          免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

          国产成人精选在线观看不卡| 日韩欧美中文字幕公布| 亚洲美国产亚洲AV| 综合网日日天干夜夜久久| 精品国产一区AV天美传媒| 绿巨人APP下载汅API免费|