国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

別再糾結線程池大小線程數量了,沒有固定公式的

開發 后端
一個CPU核心,單位時間內只能執行一個線程的指令 那么理論上,我一個線程只需要不停的執行指令,就可以跑滿一個核心的利用率。

 可能很多人都看到過一個線程數設置的理論:

  •  CPU 密集型的程序 - 核心數 + 1
  •  I/O 密集型的程序 - 核心數 * 2

不會吧,不會吧,真的有人按照這個理論規劃線程數?

線程數和CPU利用率的小測試

拋開一些操作系統,計算機原理不談,說一個基本的理論(不用糾結是否嚴謹,只為好理解):一個CPU核心,單位時間內只能執行一個線程的指令 那么理論上,我一個線程只需要不停的執行指令,就可以跑滿一個核心的利用率。

來寫個死循環空跑的例子驗證一下:

測試環境:AMD Ryzen 5 3600, 6 - Core, 12 - Threads 

  1. public class CPUUtilizationTest {  
  2.  public static void main(String[] args) {  
  3.   //死循環,什么都不做  
  4.   while (true){  
  5.   }  
  6.  }  
  7.  
  8. 復制代碼 

運行這個例子后,來看看現在CPU的利用率:

從圖上可以看到,我的3號核心利用率已經被跑滿了

那基于上面的理論,我多開幾個線程試試呢? 

  1. public class CPUUtilizationTest {  
  2.  public static void main(String[] args) {  
  3.   for (int j = 0; j < 6; j++) {  
  4.    new Thread(new Runnable() {  
  5.     @Override  
  6.     public void run() {  
  7.      while (true){  
  8.      }  
  9.     }  
  10.    }).start();  
  11.   }  
  12.  }  
  13.  
  14. 復制代碼 

此時再看CPU利用率,1/2/5/7/9/11 幾個核心的利用率已經被跑滿:

那如果開12個線程呢,是不是會把所有核心的利用率都跑滿?答案一定是會的:

如果此時我把上面例子的線程數繼續增加到24個線程,會出現什么結果呢?

從上圖可以看到,CPU利用率和上一步一樣,還是所有核心100%,不過此時負載已經從11.x增加到了22.x(load average解釋參考scoutapm.com/blog/unders…),說明此時CPU更繁忙,線程的任務無法及時執行。

現代CPU基本都是多核心的,比如我這里測試用的AMD 3600,6核心12線程(超線程),我們可以簡單的認為它就是12核心CPU。那么我這個CPU就可以同時做12件事,互不打擾。

如果要執行的線程大于核心數,那么就需要通過操作系統的調度了。操作系統給每個線程分配CPU時間片資源,然后不停的切換,從而實現“并行”執行的效果。

但是這樣真的更快嗎?從上面的例子可以看出,一個線程就可以把一個核心的利用率跑滿。如果每個線程都很“霸道”,不停的執行指令,不給CPU空閑的時間,并且同時執行的線程數大于CPU的核心數,就會導致操作系統更頻繁的執行切換線程執行,以確保每個線程都可以得到執行。

不過切換是有代價的,每次切換會伴隨著寄存器數據更新,內存頁表更新等操作。雖然一次切換的代價和I/O操作比起來微不足道,但如果線程過多,線程切換的過于頻繁,甚至在單位時間內切換的耗時已經大于程序執行的時間,就會導致CPU資源過多的浪費在上下文切換上,而不是在執行程序,得不償失。

上面死循環空跑的例子,有點過于極端了,正常情況下不太可能有這種程序。

大多程序在運行時都會有一些 I/O操作,可能是讀寫文件,網絡收發報文等,這些 I/O 操作在進行時時需要等待反饋的。比如網絡讀寫時,需要等待報文發送或者接收到,在這個等待過程中,線程是等待狀態,CPU沒有工作。此時操作系統就會調度CPU去執行其他線程的指令,這樣就完美利用了CPU這段空閑期,提高了CPU的利用率。

上面的例子中,程序不停的循環什么都不做,CPU要不停的執行指令,幾乎沒有啥空閑的時間。如果插入一段I/O操作呢,I/O 操作期間 CPU是空閑狀態,CPU的利用率會怎么樣呢?先看看單線程下的結果: 

  1. public class CPUUtilizationTest {  
  2.  public static void main(String[] args) throws InterruptedException {  
  3.   for (int n = 0; n < 1; n++) {  
  4.    new Thread(new Runnable() {  
  5.     @Override  
  6.     public void run() {  
  7.      while (true){  
  8.                         //每次空循環 1億 次后,sleep 50ms,模擬 I/O等待、切換  
  9.       for (int i = 0; i < 100_000_000l; i++) {   
  10.       }  
  11.       try {  
  12.        Thread.sleep(50);  
  13.       }  
  14.       catch (InterruptedException e) {  
  15.        e.printStackTrace();  
  16.       }  
  17.      }  
  18.     }  
  19.    }).start();  
  20.   }  
  21.  }  
  22.  
  23. 復制代碼 

哇,唯一有利用率的9號核心,利用率也才50%,和前面沒有sleep的100%相比,已經低了一半了。現在把線程數調整到12個看看:

單個核心的利用率60左右,和剛才的單線程結果差距不大,還沒有把CPU利用率跑滿,現在將線程數增加到18:

此時單核心利用率,已經接近100%了。由此可見,當線程中有 I/O 等操作不占用CPU資源時,操作系統可以調度CPU可以同時執行更多的線程。

現在將I/O事件的頻率調高看看呢,把循環次數減到一半,50_000_000,同樣是18個線程:

此時每個核心的利用率,大概只有70%左右了。

線程數和CPU利用率的小總結

上面的例子,只是輔助,為了更好的理解線程數/程序行為/CPU狀態的關系,來簡單總結一下:

  •  一個極端的線程(不停執行“計算”型操作時),就可以把單個核心的利用率跑滿,多核心CPU最多只能同時執行等于核心數的“極端”線程數
  •  如果每個線程都這么“極端”,且同時執行的線程數超過核心數,會導致不必要的切換,造成負載過高,只會讓執行更慢
  •  I/O 等暫停類操作時,CPU處于空閑狀態,操作系統調度CPU執行其他線程,可以提高CPU利用率,同時執行更多的線程
  •  I/O 事件的頻率頻率越高,或者等待/暫停時間越長,CPU的空閑時間也就更長,利用率越低,操作系統可以調度CPU執行更多的線程

線程數規劃的公式

前面的鋪墊,都是為了幫助理解,現在來看看書本上的定義。《Java 并發編程實戰》介紹了一個線程數計算的公式:

公式很清晰,現在來帶入上面的例子試試看:

如果我期望目標利用率為90%(多核90),那么需要的線程數為:

核心數12 * 利用率0.9 * (1 + 50(sleep時間)/50(循環50_000_000耗時)) ≈ 22

現在把線程數調到22,看看結果:

現在CPU利用率大概80+,和預期比較接近了,由于線程數過多,還有些上下文切換的開銷,再加上測試用例不夠嚴謹,所以實際利用率低一些也正常。

把公式變個形,還可以通過線程數來計算CPU利用率:

Ucpu=

線程數22 / (核心數12 * (1 + 50(sleep時間)/50(循環50_000_000耗時))) ≈ 0.9

雖然公式很好,但在真實的程序中,一般很難獲得準確的等待時間和計算時間,因為程序很復雜,不只是“計算”。一段代碼中會有很多的內存讀寫,計算,I/O 等復合操作,精確的獲取這兩個指標很難,所以光靠公式計算線程數過于理想化。

真實程序中的線程數

那么在實際的程序中,或者說一些Java的業務系統中,線程數(線程池大小)規劃多少合適呢?

先說結論:沒有固定答案,先設定預期,比如我期望的CPU利用率在多少,負載在多少,GC頻率多少之類的指標后,再通過測試不斷的調整到一個合理的線程數

比如一個普通的,SpringBoot 為基礎的業務系統,默認Tomcat容器+HikariCP連接池+G1回收器,如果此時項目中也需要一個業務場景的多線程(或者線程池)來異步/并行執行業務流程。

此時我按照上面的公式來規劃線程數的話,誤差一定會很大。因為此時這臺主機上,已經有很多運行中的線程了,Tomcat有自己的線程池,HikariCP也有自己的后臺線程,JVM也有一些編譯的線程,連G1都有自己的后臺線程。這些線程也是運行在當前進程、當前主機上的,也會占用CPU的資源。

所以受環境干擾下,單靠公式很難準確的規劃線程數,一定要通過測試來驗證。

流程一般是這樣:

    1. 分析當前主機上,有沒有其他進程干擾

    2. 分析當前JVM進程上,有沒有其他運行中或可能運行的線程

    3. 設定目標

        a. 目標CPU利用率 - 我最高能容忍我的CPU飆到多少?

        b. 目標GC頻率/暫停時間 - 多線程執行后,GC頻率會增高,最大能容忍到什么頻率,每次暫停時間多少?

        c. 執行效率 - 比如批處理時,我單位時間內要開多少線程才能及時處理完畢

        d. ……

    4. 梳理鏈路關鍵點,是否有卡脖子的點,因為如果線程數過多,鏈路上某些節點資源有限可能會導致大量的線程在等待資源(比如三方接口限流,連接池數量有限,中間件壓力過大無法支撐等)

    5. 不斷的增加/減少線程數來測試,按最高的要求去測試,最終獲得一個“滿足要求”的線程數**

而且而且而且!不同場景下的線程數理念也有所不同:

  1.  Tomcat中的maxThreads,在Blocking I/O和No-Blocking I/O下就不一樣
  2.  Dubbo 默認還是單連接呢,也有I/O線程(池)和業務線程(池)的區分,I/O線程一般不是瓶頸,所以不必太多,但業務線程很容易稱為瓶頸
  3.  Redis 6.0以后也是多線程了,不過它只是I/O 多線程,“業務”處理還是單線程

所以,不要糾結設置多少線程了。沒有標準答案,一定要結合場景,帶著目標,通過測試去找到一個最合適的線程數。

可能還有同學可能會有疑問:“我們系統也沒啥壓力,不需要那么合適的線程數,只是一個簡單的異步場景,不影響系統其他功能就可以”

很正常,很多的內部業務系統,并不需要啥性能,穩定好用符合需求就可以了。那么我的推薦的線程數是:CPU核心數

附錄

Java 獲取CPU核心數 

  1. Runtime.getRuntime().availableProcessors()//獲取邏輯核心數,如6核心12線程,那么返回的是12  
  2. 復制代碼 

Linux 獲取CPU核心數 

  1. # 總核數 = 物理CPU個數 X 每顆物理CPU的核數   
  2. # 總邏輯CPU數 = 物理CPU個數 X 每顆物理CPU的核數 X 超線程數  
  3. # 查看物理CPU個數  
  4. cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l  
  5. # 查看每個物理CPU中core的個數(即核數)  
  6. cat /proc/cpuinfo| grep "cpu cores"| uniq  
  7. # 查看邏輯CPU的個數  
  8. cat /proc/cpuinfo| grep "processor"| wc -l  
  9. 復制代碼 

 

責任編輯:龐桂玉 來源: 數據庫開發
相關推薦

2010-03-18 15:15:08

Java線程池

2025-06-27 10:25:43

2024-10-21 18:12:14

2019-09-09 09:50:27

設置Java線程池

2012-05-15 02:18:31

Java線程池

2012-06-14 10:21:31

線程線程池Java

2025-01-03 08:40:53

Java并發編程Guava庫

2023-05-19 08:01:24

Key消費場景

2021-09-11 15:26:23

Java多線程線程池

2025-08-04 09:00:00

線程池拒絕策略開發

2025-09-24 17:05:02

2023-11-22 08:37:40

Java線程池

2023-06-07 13:49:00

多線程編程C#

2019-09-26 10:19:27

設計電腦Java

2024-07-15 08:20:24

2020-12-10 08:24:40

線程池線程方法

2023-10-13 08:20:02

Spring線程池id

2022-12-07 10:56:23

線程池監控執行超時

2023-10-12 08:29:06

線程池Java

2021-06-24 08:02:35

線程池Java代碼
點贊
收藏

51CTO技術棧公眾號

亚洲欧美日韩在线综合| 91cn在线观看| 午夜一区不卡| 1769国产精品| 成人软件在线观看| 精品国产乱码久久久久久夜甘婷婷 | 亚洲综合不卡| 亚洲一区二区中文| 日本毛片在线免费观看| 日韩影院在线观看| 亚洲人成五月天| 有码中文亚洲精品| 亚洲天堂资源| 欧美精品一区二区三区蜜臀| 日韩伦理在线观看| 一本大道av伊人久久综合| 大胆高清日本a视频| 中文在线资源观看网站视频免费不卡| 杨幂一区欧美专区| 国产精一品亚洲二区在线视频| 日韩欧美一区二区在线观看| 日韩精品亚洲专区| 神马影院午夜我不卡影院| 日韩精品欧美精品| 亚洲欧美久久234| 国产经典欧美精品| 大陆av在线播放| 久久综合久久久久88| 午夜免费一区二区| 亚洲国产电影在线观看| 天天干天天玩天天操| 亚洲免费高清视频在线| 簧片在线观看| 欧美日韩一级大片网址| av网站免费在线观看| 国产自产在线视频| 久久精品二区亚洲w码| 日韩一区二区在线| 国产精品一区久久久| 欧美一级精品片在线看| 亚洲在线观看视频| 日产国产欧美视频一区精品| 致1999电视剧免费观看策驰影院| 国产精品影视天天线| 久章草在线视频| 亚洲色图一区二区三区| 中文字幕在线免费专区| 欧美日韩中文一区| 欧美调教sm| 欧美黑人xxxx| 天天天综合网| 韩国黄色一级大片| 国产精品区一区二区三| 久久精品蜜桃| 精品丝袜一区二区三区| 久久午夜影院| 精品久久久久久亚洲| 成人的网站免费观看| 黄色国产网站在线观看| 制服丝袜中文字幕亚洲| 精品自拍视频| 国产精品国内视频| 日本欧美加勒比视频| 性chinese极品按摩| 欧美日韩久久一区| 在线日韩三级| a级国产乱理论片在线观看99| 激情图片小说一区| 久草在线新资源| 亚洲欧洲日韩国产| 日韩综合精品| 久无码久无码av无码| 色婷婷综合五月| 91成人福利社区| 精品欧美一区二区三区久久久| 99久久婷婷国产综合精品| 日韩av成人| 欧美成年人视频| 国产日韩欧美一区在线| 成色在线视频| 中文字幕精品一区二区精品| 黄色av一区| 制服影音先锋| 国产香蕉一区二区三区在线视频 | 国产一区影院| 国产精品久久久久免费| 26uuu亚洲婷婷狠狠天堂| 国内精品不卡| 热久久这里只有| 国产成人av在线影院| 搞黄视频免费在线观看| 性色av一区二区三区红粉影视| 日韩精品电影一区亚洲| 在线国产视频观看| 成人97在线观看视频| 久久久久免费| 无人视频在线观看免费| 久久在线精品视频| 日韩中文字幕一区二区三区| 国产美女在线播放| 久久影院中文字幕| 美女免费视频一区二区| 国产福利在线看| 国产69精品久久久| 国产成人免费视频| 婷婷在线播放| 91网免费观看| 亚洲制服丝袜在线| 一区二区亚洲视频| 日本手机在线视频| 亚洲电影av在线| 亚洲欧美日本国产专区一区| 中文字幕在线一二| 欧美夜福利tv在线| 久久久久久亚洲综合影院红桃| 英国三级经典在线观看| 免费看污久久久| 欧洲av一区二区嗯嗯嗯啊| 日韩夫妻性生活xx| 国产三级av在线| 国产成+人+综合+亚洲欧美丁香花| 国产欧美日韩精品一区| 亚洲国产伊人| 国产欧美在线一区| 中文字幕日韩欧美精品在线观看| 国产在线一区二区综合免费视频| а√天堂资源地址在线下载| 91成人在线看| 在线观看不卡一区| 欧美日韩国产亚洲一区| 在线免费激情视频| 国产区亚洲区欧美区| 亚洲精品成a人| 亚洲福利网站| 人妻无码视频一区二区三区| 久久99久久99精品中文字幕| 99精品欧美一区二区三区小说| 亚瑟国产精品| 99视频免费| 国产欧美一区二区三区四区| 五月天激情小说综合| 久久久久久影院| av影片在线看| 青青草国产精品| 亚洲国模精品一区| 久久国产视频网| 日韩欧美一区二区三区免费观看| 131美女爱做视频| 国内精品中文字幕| 无吗不卡中文字幕| 亚洲精彩视频| 任你弄在线视频免费观看| 日韩欧美在线一区二区| 精品性高朝久久久久久久| 成人丝袜高跟foot| 加勒比色老久久爱综合网| 神马午夜dy888| 国产一区二区三区高清| 亚洲激情国产精品| 久久久久久亚洲综合| 久久91精品| 麻豆网在线观看| 少妇人妻在线视频| 国产精品久久电影观看| 91精品国产aⅴ一区二区| 国产福利一区二区三区视频| 红杏视频成人| 岛国在线视频| 污污污污污污www网站免费| 欧美高清在线视频观看不卡| 午夜精品福利一区二区蜜股av| 久久中文字幕一区二区三区| 成人黄色毛片| 亚洲第一区视频| 中文字幕精品—区二区日日骚| 欧美黄色片在线观看| 日本丰满少妇一区二区三区| 国产精品一区二区男女羞羞无遮挡| 激情视频极品美女日韩| 成年人视频网站在线| 91免费国产精品| 国产日韩欧美中文| 日韩高清av一区二区三区| 日韩一区中文字幕| 国产精品s色| 国产国产一区| 四虎影视精品成人| 性生活免费观看视频| 国产精品99久久久久久www| 亚洲第一国产精品| 一区二区在线观看av| 免费不卡在线视频| 精品九九在线| 高清欧美日韩| av资源网在线观看| 99热一区二区| 一区二区三区在线视频看| 国产日韩欧美电影在线观看| 中文字幕av一区| 欧美色老头old∨ideo|