- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Java線(xiàn)程數究竟設多少合理
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)程數是不是設置的越大越好?
回答:肯定不是的。
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)程模型,有助于理解服務(wù)并發(fā)的原理,一般來(lái)說(shuō)互聯(lián)網(wǎng)常見(jiàn)的服務(wù)線(xiàn)程模型有如下兩種:
如上圖,大部分Web-Server與服務(wù)框架都是使用這樣的一種 IO線(xiàn)程與Worker線(xiàn)程通過(guò)隊列解耦 類(lèi)線(xiàn)程模型:
這個(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ā)”。
任何地方都沒(méi)有阻塞,這種線(xiàn)程模型只需要設置很少的線(xiàn)程數就能夠做到很高的吞吐量,Lighttpd有一種單進(jìn)程單線(xiàn)程模式,并發(fā)處理能力很強,就是使用的的這種模型。該模型的缺點(diǎn)是:
however,這個(gè)模型不是今天討論的重點(diǎn)。
了解工作線(xiàn)程的工作模式,對量化分析線(xiàn)程數的設置非常有幫助:
上圖是一個(gè)典型的工作線(xiàn)程的處理過(guò)程,從開(kāi)始處理start到結束處理end,該任務(wù)的處理共有7個(gè)步驟:
分析整個(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í)間共分為三部分:
最后一起來(lái)回答工作線(xiàn)程數設置為多少合理的問(wèn)題。
通過(guò)上面的分析,Worker線(xiàn)程在執行的過(guò)程中,有一部計算時(shí)間需要占用CPU,另一部分等待時(shí)間不需要占用CPU,通過(guò)量化分析,例如打日志進(jìn)行統計,可以統計出整個(gè)Worker線(xiàn)程執行過(guò)程中這兩部分時(shí)間的比例,例如:
得到的結果是,這個(gè)線(xiàn)程計算和等待的時(shí)間是1:1,即有50%的時(shí)間在計算(占用CPU),50%的時(shí)間在等待(不占用CPU):
N核服務(wù)器,通過(guò)執行業(yè)務(wù)的單線(xiàn)程分析出本地計算時(shí)間為x,等待時(shí)間為y,則工作線(xiàn)程數(線(xiàn)程池線(xiàn)程數)設置為 N*(x+y)/x
,能讓CPU的利用率最大化。
一般來(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í)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站