Tomcat - Tomcat 網(wǎng)絡(luò)通信模型剖析 & 并發(fā)參數(shù)解讀
文章目錄
什么是IO
Tomcat 支持四種線程模型
Tomcat 如何使用指定IO模型
Tomcat BIO VS NIO
BIO
NIO
影響 BIO/NIO線程數(shù)量的多少的因素
Tomcat connector 并發(fā)參數(shù)解讀
什么是IO
IO是指為數(shù)據(jù)傳輸所提供的輸入輸出流,其輸入輸出對象可以是:文件、網(wǎng)絡(luò)服務(wù)、內(nèi)存等。
舉個例子,假設(shè)應(yīng)用在從硬盤中讀取一個大文件過程中, CPU會與硬盤一樣出于高負荷狀態(tài)么?
CPU 沒有太高的增漲 。 通常情況下IO操作是比較耗時的,所以為了高效的使用硬件,應(yīng)用程序可以用一個專門線程進行IO操作,而另外一個線程則利用CPU的空閑去做其它計算。這種為提高應(yīng)用執(zhí)行效率而采用的IO操作方法即為IO模型。
Tomcat 支持四種線程模型
Tomcat 如何使用指定IO模型
配置 server.xml 文件當中的
默認配置 8.0 protocol=“HTTP/1.1” 8.0 之前是 BIO 8.0 之后是NIO
BIO: protocol ="org.apache.coyote.http11.Http11Protocol"
NIO: protocol ="org.apache.coyote.http11.Http11NioProtocol"
AIO: protocol ="org.apache.coyote.http11.Http11Nio2Protocol"
APR: protocol ="org.apache.coyote.http11.Http11AprProtocol"
tomcat 8 以前 默認的是 BIO , 8 默認是 NIO
Tomcat BIO VS NIO
在高并發(fā)場景下BIO與NIO的線程數(shù)的變化
生產(chǎn)環(huán)境上,模擬了處理較慢的過程。
為什么差異這么大呢?
我們先看下這兩種模型的區(qū)別
BIO
源碼翻一翻
我們下個Tomcat 7的版本
https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.99/src/
7嘛 ,默認的BIO, 對應(yīng)的class org.apache.coyote.http11.Http11Protocol.java
看下 Http11Protocol構(gòu)造函數(shù)
public Http11Protocol() { endpoint = new JIoEndpoint(); cHandler = new Http11ConnectionHandler(this); ((JIoEndpoint) endpoint).setHandler(cHandler); setSoLinger(Constants.DEFAULT_CONNECTION_LINGER); setSoTimeout(Constants.DEFAULT_CONNECTION_TIMEOUT); setTcpNoDelay(Constants.DEFAULT_TCP_NO_DELAY); }
重點 JIoEndpoint ------> Java I/O Endpoint
對應(yīng)JIoEndpoint 中的
熟悉吧 Socket, 同步阻塞。
繼續(xù)
這個getExecutor()獲取的 就是 那個線程池,用來處理任務(wù)的
怎么處理的呢? 繼續(xù)
NIO
老套路
下載 apache-tomcat-8.5.55-src
Http11NioProtocol的構(gòu)造函數(shù)
重點 NioEndpoint
Acceptor 和 SocketProcessor 大致形同, 主要在于Poller .
先看看Acceptor ,和BIO一樣 ,有點不一樣的是,Acceptor 交個 Poller處理
進入
添加事件
public class Poller implements Runnable { }
那就看run方法
public void run() { // Loop until destroy() is called 輪詢 while (true) { boolean hasEvents = false; try { if (!close) { hasEvents = events(); // > 0 說明有socket需要處理 if (wakeupCounter.getAndSet(-1) > 0) { //if we are here, means we have other stuff to do //do a non blocking select keyCount = selector.selectNow(); } else { keyCount = selector.select(selectorTimeout); } wakeupCounter.set(0); } if (close) { events(); timeout(0, false); try { selector.close(); } catch (IOException ioe) { log.error(sm.getString("endpoint.nio.selectorCloseFail"), ioe); } break; } } catch (Throwable x) { ExceptionUtils.handleThrowable(x); log.error("",x); continue; } //either we timed out or we woke up, process events first if ( keyCount == 0 ) hasEvents = (hasEvents | events()); Iterator
影響 BIO/NIO線程數(shù)量的多少的因素
BIO
線程數(shù)量 會受到 客戶端阻塞、網(wǎng)絡(luò)延遲、業(yè)務(wù)處理慢===>線程數(shù)會更多
NIO
線程數(shù)量 會受到業(yè)務(wù)處理慢===>線程數(shù)會更多
Tomcat connector 并發(fā)參數(shù)解讀
Java Tomcat 網(wǎng)絡(luò)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。