Tomcat是一個小型的輕量級應用服務器,也是JavaEE開發人員最常用的服務器之一。不過,許多開發人員不知道的是,Tomcat Connector(Tomcat連接器)有bio、nio、apr三種運行模式,那麼這三種運行模式有什麼區別呢,我們又如何修改Tomcat Connector的運行模式來提高Tomcat的運行性能呢?
下面,我們先大致瞭解Tomcat Connector的三種運行模式。
bio
bio(blocking I/O),顧名思義,即阻塞式I/O操作,表示Tomcat使用的是傳統的Java I/O操作(即java.io
包及其子包)。Tomcat在默認情況下,就是以bio模式運行的。遺憾的是,就一般而言,bio模式是三種運行模式中性能最低的一種。我們可以通過Tomcat Manager來查看服務器的當前狀態。【點擊這裏可以查看Tomcat Manager用戶配置的相關信息】
nio
nio(new I/O),是Java SE 1.4及後續版本提供的一種新的I/O操作方式(即java.nio
包及其子包)。Java nio是一個基於緩衝區、並能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O
的縮寫。它擁有比傳統I/O操作(bio)更好的併發運行性能。要讓Tomcat以nio模式來運行也比較簡單,我們只需要在Tomcat安裝目錄/conf/server.xml
文件中將如下配置:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
中的protocol屬性值改爲org.apache.coyote.http11.Http11NioProtocol
即可:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" />
此時,我們就可以在Tomcat Manager中看到當前服務器狀態頁面的HTTP協議的Connector運行模式已經從http-bio-8080
變成了http-nio-8080
。
apr
apr(Apache Portable Runtime/Apache可移植運行時),是Apache HTTP服務器的支持庫。你可以簡單地理解爲,Tomcat將以JNI的形式調用Apache HTTP服務器的核心動態鏈接庫來處理文件讀取或網絡傳輸操作,從而大大地提高Tomcat對靜態文件的處理性能。 Tomcat apr也是在Tomcat上運行高併發應用的首選模式。如果我們的Tomcat不是在apr模式下運行,在啓動Tomcat的時候,我們可以在日誌信息中看到類似如下信息:
2013-8-6 16:17:49 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: xxx/xxx(這裏是路徑信息)
Tomcat apr運行模式的配置是三種運行模式之中相對比較麻煩的一種。據官方文檔所述,Tomcat apr需要以下三個組件的支持:
- APR library[APR庫]
- JNI wrappers for APR used by Tomcat (libtcnative)[簡單地說,如果是在Windows操作系統上,就是一個名爲tcnative-1.dll的動態鏈接庫文件]
- OpenSSL libraries[OpenSSL庫]
此外,與配置nio運行模式一樣,也需要將對應的Connector
節點的protocol
屬性值改爲org.apache.coyote.http11.Http11AprProtocol
。 不過,上述繁瑣的操作都是Tomcat 7.0.30之前的版本才需要這樣配置,從Tomcat 7.0.30版本開始,Tomcat已經自帶了tcnative-1.dll
等文件,並且默認就是在Tomcat apr模式下運行,因此我們只需要下載最新版本的Tomcat直接使用即可。
此外,即使不使用Tomcat Manager,我們也可以區分出Tomcat當前的運行模式。如果以不同的Connector模式啓動,在Tomcat的啓動日誌信息中一般會包含類似如下的不同內容,我們只需要根據這些信息即可判斷出當前Tomcat的運行模式:
bio
信息: Starting ProtocolHandler ["http-bio-8080"] 2013-8-6 16:17:50 org.apache.coyote.AbstractProtocol start
nio
信息: Starting ProtocolHandler ["http-nio-8080"] 2013-8-6 16:59:53 org.apache.coyote.AbstractProtocol start
apr
信息: Starting ProtocolHandler ["http-apr-8080"] 2013-8-6 17:03:07 org.apache.coyote.AbstractProtocol start
Tomcat 6.x版本從6.0.32開始就默認支持apr。 Tomcat 7.x版本從7.0.30開始就默認支持apr。 因此,如果讀者使用的Tomcat版本比較陳舊的話,強烈建議升級到最新的穩定版本。