I/O密集和CPU密集型的工作負載之間有什麼區別
CPU密集與IO密集型區別
CPU 密集型(I/O bound)
CPU密集型也叫計算密集型,指的是系統的硬碟、記憶體效能相對CPU要好很多,此時,系統運作大部分的狀況是CPU Loading 100%,CPU要讀/寫I/O(硬碟/記憶體),I/O在很短的時間就可以完成,而CPU還有許多運算要處理,CPU Loading很高。
CPU密集的意思是該任務需要大量的運算,而沒有阻塞,CPU一直全速執行。CPU密集任務只有在真正的多核CPU上才可能得到加速(通過多執行緒),而在單核CPU上,無論你開幾個模擬的多執行緒該任務都不可能得到加速,因為CPU總的運算能力就那些。
CPU 使用率較高(例如:計算一些複雜的運算,邏輯處理等情況)非常多的情況下,執行緒數一般只需要設定為CPU核心數的執行緒個數就可以了。 這一型別多出現在開發中的一些業務複雜計算和邏輯處理過程中。
I/O 密集型(I/O bound)
IO密集型指的是系統的CPU效能相對硬碟、記憶體要好很多,此時,系統運作,大部分的狀況是CPU在等I/O (硬碟/記憶體) 的讀/寫操作,此時CPU Loading並不高。I/O bound的程式一般在達到效能極限時,CPU佔用率仍然較低。這可能是因為任務本身需要大量I/O操作,而pipeline做得不是很好,沒有充分利用處理器能力。
CPU 使用率較低,程式中會存在大量的 I/O 操作佔用時間,導致執行緒空餘時間很多,所以通常就需要開CPU核心數兩倍的執行緒。當執行緒進行 I/O 操作 CPU 空閒時,啟用其他執行緒繼續使用 CPU,以提高 CPU 的使用率。例如:資料庫互動,檔案上傳下載,網路傳輸等。
執行緒等待時間所佔比例越高,需要越多執行緒,啟用其他執行緒繼續使用CPU,以此提高CPU的利用率;執行緒 CPU 時間所佔比例越高,需要越少的執行緒,這一型別在開發中主要出現在一些計算業務頻繁的邏輯中。
方法一:
由於IO密集型任務執行緒並不是一直在執行任務,則應配置儘可能多的執行緒,如CPU核數*2
方法二:
IO密集型,即該任務需要大量的IO,即大量的阻塞。在單執行緒上運IO密集型的任務會導致浪費大量的CPU運算能力浪費在等待。所以在IO密集型任務中使用多執行緒可以大大的加速程式執行,即使在單核CPU上,這種加速主要就是利用了被浪費掉的阻塞時間。
IO密集型時,大部分執行緒都阻塞,故需要多配置執行緒數:
參考公式:CPU核數 /(1 - 阻係數)
比如8核CPU:8/(1 - 0.9)=80個執行緒數
阻塞係數在0.8~0.9之間
總結:
1.一個計算為主的程式(CPU密集型程式),多執行緒跑的時候,可以充分利用起所有的 CPU 核心數,比如說 8 個核心的CPU ,開8 個執行緒的時候,可以同時跑 8 個執行緒的運算任務,此時是最大效率。但是如果執行緒遠遠超出 CPU 核心數量,反而會使得任務效率下降,因為頻繁的切換執行緒也是要消耗時間的。因此對於 CPU 密集型的任務來說,執行緒數等於 CPU 數是最好的了。
2.如果是一個磁碟或網路為主的程式(IO密集型程式),一個執行緒處在 IO 等待的時候,另一個執行緒還可以在 CPU 裡面跑,有時候 CPU 閒著沒事幹,所有的執行緒都在等著 IO,這時候他們就是同時的了,而單執行緒的話此時還是在一個一個等待的。我們都知道 IO 的速度比起 CPU 來是很慢的。此時執行緒數等於CPU核心數的兩倍是最佳的。
核心執行緒數計算公式
IO密集型:核心執行緒數= CPU核數/ (1-阻塞係數)
CPU密集型:核心執行緒數= CPU核數+1
IO密集型:核心執行緒數= CPU核數*2