最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java線程數(shù)究竟設(shè)多少合理

 更新時(shí)間:2021年04月22日 15:51:13   作者:JiaJian  
這篇文章主要介紹了Java線程數(shù)究竟設(shè)多少合理,對(duì)線程感興趣的同學(xué),可以參考下

需求緣起

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

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

一些共性認(rèn)知

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

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

回答:肯定不是的。

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

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

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

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

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

回答:即使是單核,使用多線程也是有意義的。

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

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

while(1){ i++; }

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

通常來(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ù)線程模型有如下兩種:

1. 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ù)的(回想一下tomcat線程中是怎么執(zhí)行Java程序的,dubbo工作線程中是怎么執(zhí)行任務(wù)的),因此可以通過(guò)增加Worker線程數(shù)來(lái)增加并發(fā)能力,今天要討論的重點(diǎn)是:“該模型Worker線程數(shù)設(shè)置為多少能達(dá)到最大的并發(fā)”。

2. 純異步線程模型

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

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

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

工作線程的工作模式

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

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

  1. 從工作隊(duì)列里拿出任務(wù),進(jìn)行一些本地初始化計(jì)算,例如http協(xié)議分析、參數(shù)解析、參數(shù)校驗(yàn)等
  2. 訪問(wèn)cache拿一些數(shù)據(jù)
  3. 拿到cache里的數(shù)據(jù)后,再進(jìn)行一些本地計(jì)算,這些計(jì)算和業(yè)務(wù)邏輯相關(guān)
  4. 通過(guò)RPC調(diào)用下游service再拿一些數(shù)據(jù),或者讓下游service去處理一些相關(guān)的任務(wù)
  5. RPC調(diào)用結(jié)束后,再進(jìn)行一些本地計(jì)算,怎么計(jì)算和業(yè)務(wù)邏輯相關(guān)
  6. 訪問(wèn)DB進(jìn)行一些數(shù)據(jù)操作
  7. 操作完數(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í)間共分為三部分:

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

量化分析并合理設(shè)置工作線程數(shù)

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

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

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

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

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

結(jié)論

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

經(jīng)驗(yàn)

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

以上就是Java線程數(shù)究竟設(shè)多少合理的詳細(xì)內(nèi)容,更多關(guān)于Java線程數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決mybatis竟然報(bào)Invalid value for getInt()的問(wèn)題

    解決mybatis竟然報(bào)Invalid value for getInt()的問(wèn)題

    使用mybatis遇到一個(gè)非常奇葩的問(wèn)題,總是報(bào)Invalid value for getInt()的問(wèn)題,怎么解決呢?下面小編通過(guò)場(chǎng)景分析給大家代來(lái)了mybatis報(bào)Invalid value for getInt()的解決方法,感興趣的朋友參考下吧
    2021-10-10
  • SLF4J報(bào)錯(cuò)解決:No SLF4J providers were found的問(wèn)題

    SLF4J報(bào)錯(cuò)解決:No SLF4J providers were found的

    這篇文章主要介紹了SLF4J報(bào)錯(cuò)解決:No SLF4J providers were found的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 如何解決java.lang.IllegalStateException: Target host is null的問(wèn)題

    如何解決java.lang.IllegalStateException: Target host&n

    文章描述了通過(guò)MocoRunner模擬接口,并使用properties文件和ResourceBundle讀取配置文件進(jìn)行g(shù)et請(qǐng)求的過(guò)程,在執(zhí)行過(guò)程中遇到了目標(biāo)主機(jī)為空的錯(cuò)誤,通過(guò)檢查和修正url拼接問(wèn)題解決了該錯(cuò)誤
    2024-12-12
  • springboot集成@DS注解實(shí)現(xiàn)數(shù)據(jù)源切換的方法示例

    springboot集成@DS注解實(shí)現(xiàn)數(shù)據(jù)源切換的方法示例

    本文主要介紹了springboot集成@DS注解實(shí)現(xiàn)數(shù)據(jù)源切換的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • springboot啟動(dòng)流程過(guò)程

    springboot啟動(dòng)流程過(guò)程

    Spring Boot 簡(jiǎn)化了 Spring 框架的使用,通過(guò)創(chuàng)建 `SpringApplication` 對(duì)象,判斷應(yīng)用類型并設(shè)置初始化器和監(jiān)聽(tīng)器,在 `run` 方法中,讀取配置并加載到 `Environment` 中,通過(guò) Spring 事件機(jī)制和 `EnvironmentPostProcessor` 處理配置
    2025-02-02
  • springboot動(dòng)態(tài)加載Echarts柱狀圖

    springboot動(dòng)態(tài)加載Echarts柱狀圖

    這篇文章主要為大家詳細(xì)介紹了springboot動(dòng)態(tài)加載Echarts柱狀圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • java性能分析jconsole詳解

    java性能分析jconsole詳解

    這篇文章主要介紹了java性能分析jconsole詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • ScheduledThreadPoolExecutor巨坑解決

    ScheduledThreadPoolExecutor巨坑解決

    這篇文章主要為大家介紹了使用ScheduledThreadPoolExecutor遇到的巨坑解決示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • SpringBoot實(shí)現(xiàn)動(dòng)態(tài)加載外部Jar流程詳解

    SpringBoot實(shí)現(xiàn)動(dòng)態(tài)加載外部Jar流程詳解

    這篇文章主要介紹了SpringBoot動(dòng)態(tài)加載外部Jar的流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-05-05
  • Java抽象類、繼承及多態(tài)和適配器的實(shí)現(xiàn)代碼

    Java抽象類、繼承及多態(tài)和適配器的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java抽象類、繼承及多態(tài)和適配器的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

东平县| 勃利县| 中卫市| 江阴市| 调兵山市| 临城县| 山西省| 泸溪县| 长治市| 五峰| 大余县| 嫩江县| 台南市| 潼关县| 固镇县| 井陉县| 呈贡县| 正阳县| 乌兰浩特市| 东乌| 临桂县| 长岭县| 桃园县| 民县| 大理市| 武冈市| 大埔区| 莒南县| 麻江县| 辉南县| 建始县| 吴江市| 乌鲁木齐市| 阜南县| 茌平县| 宜昌市| 玉环县| 合山市| 南阳市| 吴堡县| 交城县|