詳解Tomcat三種運行模式(BIO, NIO, APR)的比較和場景分析

轉載於 http://server.51cto.com/sOS-595052.htm

概述

Tomcat8.0起已經默認nio模式,不需要做修改,BIO模式也已經拋棄了,今天主要介紹下tomcat的三種運行模式:BIO、NIO、ARP。

簡述及配置運行模式

1、bio:沒經過任何優化和處理,幾百併發性能極低下。
在這裏插入圖片描述
配置server.xml

<Connector port="8080" protocol="HTTP/1.1" 
 connectionTimeout="20000" 
 redirectPort="8443"  
URIEncoding="UTF-8"/> 

2、nio:利用java的異步io技術,no blocking IO技術.
在這裏插入圖片描述
配置server.xml

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" 
 connectionTimeout="20000" 
 redirectPort="8443"  
URIEncoding="UTF-8"/> 

3、apr模式
安裝最困難,操作系統級別的控制,但也是在Tomcat上運行高併發應用的首選模式。

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" 
 connectionTimeout="20000" 
 redirectPort="8443"  
URIEncoding="UTF-8"/> 

配置apr模式之後還需要安裝 apr 、 apr-utils 、tomcat-native包
(1)apr 安裝

# tar zxf apr-1.5.2.tar.gz -C /usr/local/src/ 
# cd /usr/local/src/apr-1.5.2/ 
# ./configure --prefix=/usr/local/apr && make && make install 

(2)apr-utils 安裝

# tar zxf apr-util-1.5.4.tar.gz -C /usr/local/src/ 
# cd /usr/local/src/apr-util-1.5.4/ 
# ./configure --with-apr=/usr/local/apr/ --prefix=/usr/local/apr-utils && make && make install

(3)tomcat-native安裝

# cd /usr/local/apache-tomcat-7.0.65/bin/ 
# tar zxf tomcat-native.tar.gz 
# cd tomcat-native-1.1.33-src/jni/native 
# ./configure --with-apr=/usr/local/apr --with-java-home=/usr/local/java/ && make && make install 

(4)配置APR環境變量

# vim /etc/profile 
新增配置以下配置 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib 
使配置生效 
# source /etc/profile 

BIO、NIO、AIO適用場景分析:

BIO方式適用於連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4以前的唯一選擇,但程序直觀簡單易理解。

NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持。

AIO方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與併發操作,編程比較複雜,JDK7開始支持。
這三種模式的不同之處如下:

BIO:
一個線程處理一個請求。缺點:併發量高時,線程數較多,浪費資源。

Tomcat7或以下,在Linux系統中默認使用這種方式。

NIO:
利用Java的異步IO處理,可以通過少量的線程處理大量的請求。

Tomcat8在Linux系統中默認使用這種方式。

APR:
即Apache Portable Runtime,從操作系統層面解決io阻塞問題。

Tomcat7或Tomcat8在Win7或以上的系統中啓動默認使用這種方式。

官方對這三種的區別的詳細說明:
在這裏插入圖片描述
Tomcat啓動的時候,可以通過log看到Connector使用的是哪一種運行模式:

Starting ProtocolHandler [“http-bio-8080”]
Starting ProtocolHandler [“http-nio-8080”]
Starting ProtocolHandler [“http-apr-8080”]

個人覺得在 tomcat bio、nio、apr 模式中,每種都會有各自適用的場合,也不能說哪個好那個不好,就像 tomcat 內存方面的配置,如果內存設置的過大,gc 垃圾回收機制就會變慢;如果內存設置的過小,tomcat又會出現內存溢出的情況,所以設置在一個合適的範圍很重要,不僅不會出錯,並且gc回收頻繁使性能達到一個最優的結果。當然,這也需要根據不同的場合進行不同的測試才能產生最優的結果!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章