為什麼說IO密集型業務,執行緒數是CPU數的2倍?
原創:小姐姐味道(微信公眾號ID:xjjdog),歡迎分享,非公眾號轉載保留此宣告。
I/O密集型業務,執行緒數量要設定成 CPU 的 2 倍!
也不知道這是哪本書的坑爹理論,現在總有一些小青年老拿著這樣的定理來說教。說的信誓旦旦,毋庸置疑,彷彿是權威的化身。討論時把這樣的理論當作前提,真的是受害不淺。
但可惜的是,這樣的理論站不住腳。我只需要一個簡單的反問,它就不攻自破:
Tomcat的預設執行緒數是多少呢?
它既不是 CPU 的 2 倍,也不是什麼其他數值。在某些高併發的服務中,它的核心執行緒數,可能達到數千甚至上萬。對於一個Tomcat來說,它處理的大多數都是I/O密集型的業務,可以說是最好的實踐場景。
要明白這個執行緒數設定的玄機,就必須瞭解I/O請求的特點。I/O請求不僅僅指的是磁碟讀寫,在網際網路服務中更多指的是網路I/O請求。
I/O請求的速度,要遠低於CPU執行的速度。大部分I/O請求,在發起之後,就進入等待狀態,這個等待狀態不會浪費CPU,所以一臺機器在同一時刻支援的I/O請求,可以很多。
如果I/O請求的速度比較快,和CPU的耗時對等的時候,我們把處理I/O的執行緒數,設定成 CPU 的 2倍,是合理的。但現實中並沒有這麼多如果,我們要處理秒成千上萬的I/O請求,註定了它的耗時要比CPU多的多。
像RPC元件,比如Dubbo服務端,也會設定一個比較大的執行緒數(比如600);Feign這種就更不用多說了,短連線意味著更多執行緒數的支援。這都是些最佳實踐。
雖然I/O執行緒數量增多,會造成非常頻繁的上下文切換,進而影響效率。但在網際網路應用中,它卻是一個優秀的解決方案。
更優秀的解決方式也有,那就是使用協程。協程是使用者態的執行緒,是對普通執行緒更細粒度的劃分。它是在使用者態執行的,由使用者自行排程,所以也就避免了頻繁的上下文切換問題。
但協程在Java中還不成熟,它依然是Golang語言的誘人特性。使用Golang開發的Web服務,可以採用更少的執行緒來支援大量I/O密集型的請求。
綜上所述,標題的表述並不正確,而且錯的離譜。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024923/viewspace-2930749/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 為什麼說執行緒太多,cpu切換執行緒會浪費很多時間?執行緒
- 如何檢視CPU核數和執行緒數?CPU的核心數、執行緒數的關係和區別執行緒
- 為什麼有人說 Python 多執行緒是雞肋?Python執行緒
- 檢視伺服器CPU的個數、CPU的核數、多核超執行緒數伺服器執行緒
- 為什麼?為什麼StringBuilder是執行緒不安全的?UI執行緒
- 為什麼redis是單執行緒的以及為什麼這麼快?Redis執行緒
- redis是單執行緒的,為什麼這麼快Redis執行緒
- Loom會造成CPU密集型執行緒的不公平排程OOM執行緒
- 當我們在說“併發、多執行緒”,說的是什麼?執行緒
- 為什麼 Random.Shared 是執行緒安全的random執行緒
- Redis為什麼是單執行緒?為什麼有如此高的效能?Redis執行緒
- 使用 setTimeout 拆解一些 CPU 密集型的執行任務
- 【多執行緒與高併發】Java守護執行緒是什麼?什麼是Java的守護執行緒?執行緒Java
- 什麼是Python執行緒?Python執行緒如何建立?Python執行緒
- 什麼是多執行緒?Python多執行緒有什麼優勢?執行緒Python
- 24. 一個普通main方法的執行,是單執行緒模式還是多執行緒模式?為什麼?AI執行緒模式
- 4核8執行緒和6核6執行緒的CPU哪個好?電腦CPU核數多和執行緒多的區別執行緒
- 使用Rustlang的Async Tokio執行時處理CPU密集型任務Rust
- Redis是單執行緒的,但Redis為什麼這麼快?Redis執行緒
- 【高併發】面試官問我:為什麼區域性變數是執行緒安全的?面試變數執行緒
- 什麼是程式(執行緒)同步執行緒
- 什麼是執行緒安全和執行緒不安全執行緒
- 29-HashMap 為什麼是執行緒不安全的?HashMap執行緒
- python為什麼要用執行緒Python執行緒
- suging閒談-netty 的非同步非阻塞IO執行緒與業務執行緒分離Netty非同步執行緒
- 執行緒池管理(1)-為什麼需要執行緒池執行緒
- redis為什麼用單執行緒不用多執行緒Redis執行緒
- Web Worker執行緒的限制是什麼?Web執行緒
- JDK21的虛擬執行緒是什麼?和平臺執行緒什麼關係?JDK執行緒
- Netty是什麼,Netty為什麼速度這麼快,執行緒模型分析Netty執行緒模型
- .net使用Task多執行緒執行任務 .net限制執行緒數量執行緒
- 執行緒池中的最大執行緒數、核心執行緒數和佇列大小的合理設定執行緒佇列
- 核心數與執行緒的區別是什麼? 如何保障自已? 【伺服器篇】執行緒伺服器
- 根據CPU核數合理設定執行緒池大小執行緒
- Java中的執行緒池用過吧?來說說你是怎麼理解執行緒池吧?Java執行緒
- 聊聊redis單執行緒為什麼能做到高效能和io多路複用到底是個什麼鬼Redis執行緒
- 什麼叫執行緒安全,舉例說明。執行緒
- 什麼是線上優雅停機和調整執行緒池引數?執行緒