Tomcat - Tomcat 網(wǎng)絡(luò)通信模型剖析 & 并發(fā)參數(shù)解讀

      網(wǎng)友投稿 874 2022-05-28

      文章目錄

      什么是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

      Tomcat - Tomcat 網(wǎng)絡(luò)通信模型剖析 & 并發(fā)參數(shù)解讀

      看下 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 iterator = keyCount > 0 ? selector.selectedKeys().iterator() : null; // Walk through the collection of ready keys and dispatch // any active event. while (iterator != null && iterator.hasNext()) { SelectionKey sk = iterator.next(); NioSocketWrapper attachment = (NioSocketWrapper)sk.attachment(); // Attachment may be null if another thread has called // cancelledKey() if (attachment == null) { iterator.remove(); } else { iterator.remove(); processKey(sk, attachment); } }//while //process timeouts timeout(keyCount,hasEvents); }//while getStopLatch().countDown(); }

      影響 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)容。

      上一篇:個人linux博文的目錄匯總帖
      下一篇:Nginx——配置文件詳解
      相關(guān)文章
      亚洲一级毛片免观看| 久久久久久亚洲精品成人| 亚洲精品二三区伊人久久| 亚洲成a人片在线网站| 亚洲国产一区在线| 99久久精品国产亚洲| 亚洲宅男永久在线| 精品日韩亚洲AV无码一区二区三区 | 亚洲日韩中文字幕日韩在线| 亚洲区不卡顿区在线观看| 亚洲精品久久久www| 色噜噜AV亚洲色一区二区| 亚洲午夜久久久影院| 亚洲AV综合色一区二区三区| 亚洲欧洲日产国码久在线观看| 亚洲高清在线视频| 亚洲小说图片视频| 亚洲一日韩欧美中文字幕在线| 亚洲欧美国产精品专区久久| 亚洲AV色无码乱码在线观看| 亚洲高清视频一视频二视频三| 久久精品夜色噜噜亚洲A∨| 亚洲精品亚洲人成在线观看| 亚洲AV本道一区二区三区四区| 7777久久亚洲中文字幕蜜桃| 亚洲人成电影在线观看青青| 久久亚洲精品国产精品婷婷 | 亚洲AV无码成人专区片在线观看| 亚洲色图在线观看| 亚洲国产午夜精品理论片| 亚洲看片无码在线视频 | 老司机亚洲精品影院| 亚洲人成电影在线观看网| 亚洲精品V天堂中文字幕| 亚洲?V无码乱码国产精品| 亚洲无码在线播放| 亚洲韩国在线一卡二卡| 亚洲综合激情五月丁香六月| 日韩亚洲精品福利| 亚洲色欲久久久综合网| 亚洲天堂一区二区|