1. 程式人生 > >Tomcat Connector的三種運行模式

Tomcat Connector的三種運行模式

tomcat連接器 per OS 連接 rman sdn keyword 大量 pre

Tomcat Connector(Tomcat連接器)有bio、nio、apr三種運行模式。

BIO

bio(blocking I/O)是指阻塞式I/O操作,Tomcat在默認情況下就是以bio模式運行的。這可以從守護線程的信息看出來。
技術分享圖片

關於”阻塞式”的理解,我們回憶起org.apache.catalina.core.Catalina類中的await()方法,在執行ServerSocket.accept()方法後Tomcat容器會一直阻塞到有客戶端連接才會返回。每個客戶端連接過來後,服務端都會啟動一個線程去處理該客戶端的請求。

我先後通過兩個不同的瀏覽器頁面輸入”localhost:8005/request1”和”localhost:8005/request2”,控制臺打出如下信息:

十二月 02, 2016 8:58:57 下午 org.apache.catalina.core.StandardServer await
警告: StandardServer.await: Invalid command ‘GET /request1 HTTP/1.1‘ received
十二月 02, 2016 8:59:17 下午 org.apache.catalina.core.StandardServer await
警告: StandardServer.await: Invalid command ‘‘ received
十二月 02, 2016 8:59:33 下午 org.apache.catalina.core.StandardServer await
警告: StandardServer.await: Invalid command ‘GET /request2 HTTP/1.1‘ received
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

bio會有如下的缺點:
1.當客戶端多時,會創建大量的處理線程。每個線程都要占用棧空間和一些CPU時間。
2.阻塞可能帶來頻繁的上下文切換,而大部分的上下文切換是無意義的。
就一般而言,bio模式是三種運行模式中性能最低的一種。

NIO

nio(non-blocking I/O)是非阻塞I/O操作。nio是一個基於緩沖區並能提供非阻塞I/O操作的Java API,它擁有比bio更好的並發運行性能。要讓Tomcat以nio模式來運行也比較簡單,我們只需要修改下server.xml文件:
技術分享圖片

這時我們再查看下守護線程,Connector運行模式已經從http-bio-8080變成了http-nio-8080。

技術分享圖片

NIO的工作原理包括:
1.由一個專門的線程來處理所有的 I/O 事件、並負責分發。
2.事件驅動機制,而不再同步地去監視事件。
3.線程之間通過 wait,notify 等方式通訊。保證每次上下文切換都是有意義的,減少無謂的線程切換。

NIO采用了雙向通道(channel)進行數據傳輸,而不是單向的流(stream)。在通道上我們可以註冊指定的事件,一共有以下四種事件:
1.服務端接收客戶端連接事件OP_ACCEPT(16)
2.客戶端連接服務端事件 OP_CONNECT(8)
3.讀事件 OP_READ(1)
4.寫事件 OP_WRITE(4)
服務端和客戶端各自維護一個管理通道的對象,我們稱之為selector,該對象能檢測一個或多個通道上的事件。以服務端為例,如果服務端的selector上註冊了讀事件,某時刻客戶端給服務端發送了一些數據,BIO這時會調用read()方法阻塞地讀取數據,而NIO的服務端會在selector中添加一個讀事件。服務端的處理線程會輪詢地訪問selector,如果訪問selector時發現有感興趣的事件到達則處理這些事件;如果沒有感興趣的事件到達則處理線程會一直阻塞,直到感興趣的事件到達為止。

APR

apr(Apache portable Run-time libraries/Apache可移植運行庫)是Apache HTTP服務器的支持庫。在apr模式下,Tomcat將以JNI(Java Native Interface)的形式調用Apache HTTP服務器的核心動態鏈接庫來處理文件讀取或網絡傳輸操作,從而大大提高Tomcat對靜態文件的處理性能。Tomcat apr是在Tomcat上運行高並發應用的首選模式。

如果Tomcat不在apr模式下運行,在啟動Tomcat的時候,我們可以在日誌信息中看到類似如下信息:

十二月 02, 2016 8:24:09 下午 org.apache.catalina.core.AprLifecycleListener init
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: 
  • 1
  • 2

而要讓Tomcat以apr模式運行,對於Tomcat 7.0.30開始向後的版本,只需要再次修改protocol為”org.apache.coyote.http11.Http11AprProtocol”即可。而對於Tomcat 7.0.30之前的版本,還需要以下三個組件的支持:
1.APR library[APR庫]
2.JNI wrappers for APR used by Tomcat (libtcnative)[Windows操作系統上一個名為tcnative-1.dll的動態鏈接庫文件]
3.OpenSSL libraries[OpenSSL庫]

Tomcat Connector的三種運行模式