最近一些朋友通過書籍找到我,問了一些關于tomcat中BIO和NIO的問題,這裡列一下友善需要的朋友。後續也将前面有朋友問的問題整理下。。
隻把 Tomcat 的 bio 模式改為 nio 模式,是否能提高伺服器的吞吐量?發現在配置一樣的情況下,兩種模式壓出來的吞吐量差不多。
要看你系統是不是整個都異步化了,因為tomcat的nio隻是将網絡io異步化了,就是接收和讀寫異步化了,但是網絡封包接受完後還是要交給業務線程池,如果你的業務是阻塞或者說較耗時的話是沒辦法提升你整個的吞吐量的,除非将整個項目都異步化,現在壓起來如果你的cpu如果還打滿的話就可以繼續優化,但如果bio都能打滿cpu就說明已經到實體極限了,沒啥好優化的了,隻能在代碼層去優化了。
在做tomcat nio 模式壓測時發現并發量大時,一開始接收不了請求,到後面才慢慢恢複,這是什麼導緻的?
應該不會接收不了,隻是接收不過來,nio的接受線程一般是cpu數,一下很多請求可能需要一些時間來接收。
後來又能慢慢穩定,tps能夠上去是什麼是情況?
因為長連接配接,接收工作隻做一次。
對比與 nio ,bio 一開始能接收的量比 nio 大,怎麼解釋?
bio接收是線程池裡面的線程接收的,也就是說你的線程池如果設為600,就有600個線程能接收,自然就大了,但是nio是隻有cpu數個線程負責接收的。
nio 的優勢是什麼?是不是 nio 模式下 tomcat 預設能保持10000條連接配接,而 bio 模式則達不到。
簡單地說,nio 模式最大化壓榨了CPU,把時間片更好利用起來。通俗地說,bio hlod住連接配接不幹活也占用線程,nio hold住連接配接不幹活也沒關系,讓需要處理的連接配接執行就行了。
壓測時是短連接配接還是長連接配接?
一般工具都是長連接配接的,就像你用了連接配接池,池裡面的連接配接。基本不會有工具每請求一次都建立立 jdbc 連接配接,不然一個連接配接光建立都得毫秒到秒級别。可以用 netstat 看下你的連接配接情況的。
nio 模式是不是更适合做 tcp 長連接配接,用少量線程 hold 住大量的連接配接,節省資源。但 tomcat 現在都是短連接配接,nio 抗并發并沒有比 bio 強?
nio 适合大量長連接配接,而且大部分隻 hold 不處理的場景,如果你能将你的項目異步化的話 nio 肯定比 bio 扛得多。你用 bio 其實壓測時是打不滿 CPU 的,是以采用 nio 來壓榨 CPU,如果你 bio 都能打滿 CPU,那就沒必要搞 nio 和異步化了,因為實體極限了,沒啥好搞的了,隻能去優化代碼。
bio 模式下将最大線程數不斷調大,直到打滿 CPU,這種情況和 nio 異步比較,更傾向于哪一種?
達到峰值後會導緻接收不了連接配接,作業系統層的連接配接隊列滿了則會拒絕連接配接。另外一個是,你不可能開很多線程,bio 開太多線程可能會直接卡死,線程切換花銷很大,主要是要将阻塞的環節異步出來,這樣線程就能高效幹活了。nio 模式我個人覺得還是比 bio 高效很多,因為 bio 模式光網絡讀寫就可能塞很長時間了,而 nio 負責網絡 io 的異步化,其他異步化要自己考慮。
以下是廣告
========廣告時間========
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/74080321" target="_blank">為什麼寫《Tomcat核心設計剖析》</a>
=========================
歡迎關注:
