Tomcat Connector三種運行模式(BIO, NIO, APR)的比較和優化
這三種模式的不同之處如下:
BIO:
一個線程處理一個請求。缺點:并發量高時,線程數較多,浪費資源。
Tomcat7或以下,在Linux系統中默認使用這種方式。
NIO:
利用Java的異步IO處理,可以通過少量的線程處理大量的請求。
Tomcat8在Linux系統中默認使用這種方式。
Tomcat7必須修改Connector配置來啟動:
?????????connectionTimeout="20000" redirectPort="8443"/>
APR:
即Apache Portable Runtime,從操作系統層面解決io阻塞問題。
Linux如果安裝了apr和native,Tomcat7或Tomcat8在Linux系統中默認使用這種方式。
安裝apr和native
tar -xzf apr-1.6.3.tar.gz
cd apr-1.6.3/
./configure --prefix=/usr/local/apr
make
make install
tar -xaf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1/
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make
make install
cd apache-tomcat-7.0.88/bin/
tar -xzf tomcat-native.tar.gz
cd tomcat-native-1.2.16-src/
cd native/
./configure --with-apr=/usr/local/apr --with-java- ?home=/root/Java/jdk1.8.0_91
make
make install
vim /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
source /etc/profile
apache-tomcat-7.0.88/bin/catalina.sh run
apache-tomcat-8.0.12/bin/catalina.sh run
官方對這三種的區別的詳細說明:
??????????????????Java Blocking Connector ??Java Nio Blocking Connector ??APR/native Connector
?????????????????????????????BIO ????????????????????????NIO ??????????????????????APR
Classname ???????????????AjpProtocol ??????????????AjpNioProtocol ??????????AjpAprProtocol
Tomcat Version ??????????3.x onwards ????????????????7.x onwards ?????????????5.5.x onwards
Support Polling ?????????????NO ?????????????????????????YES ??????????????????????YES
Polling Size ????????????????N/A ??????????????????maxConnections ????????????maxConnections
Read Request Headers ?????Blocking ?????????????????Sim Blocking ??????????????????Blocking
Read Request Body ????????Blocking ?????????????????Sim Blocking ??????????????????Blocking
Write Response ???????????Blocking ?????????????????Sim Blocking ??????????????????Blocking
Wait for next Request ????Blocking ?????????????????Non Blocking ??????????????Non Blocking
Max Connections ???????maxConnections ?????????????maxConnections ????????????maxConnections
Tomcat啟動的時候,可以通過log看到Connector使用的是哪一種運行模式:
Starting ProtocolHandler ["http-bio-8080"]
Starting ProtocolHandler ["http-nio-8080"]
Starting ProtocolHandler ["http-apr-8080"]
大家可以測試下三種情況下系統cpu、內存的消耗情況