|
在慢速網(wǎng)絡(luò)上Tomcat線程數(shù)開到300以上的水平,不配APR,基本上300個(gè)線程狠快就會(huì)用滿,以后的請(qǐng)求就只好等待。但是配上APR之后,Tomcat將以JNI的形式調(diào)用Apache HTTP服務(wù)器的核心動(dòng)態(tài)鏈接庫(kù)來處理文件讀取或網(wǎng)絡(luò)傳輸操作,這時(shí)并發(fā)的線程數(shù)量明顯下降,從原來的300可能會(huì)馬上下降到只有幾十,新的請(qǐng)求會(huì)毫無阻塞的進(jìn)來。
一、Tomcat運(yùn)行模式介紹
Tomcat 有三種(bio,nio.apr) 運(yùn)行模式,首先來簡(jiǎn)單介紹下:
(1)BIO
BIO(blocking I/O),顧名思義,即阻塞式I/O操作,表示Tomcat使用的是傳統(tǒng)的Java I/O操作(即java.io包及其子包)。Tomcat在默認(rèn)情況下,就是以bio模式運(yùn)行的。遺憾的是,就一般而言,bio模式是三種運(yùn)行模式中性能最低的一種。我們可以通過Tomcat Manager來查看服務(wù)器的當(dāng)前狀態(tài)。
(2)NIO
NIO是Java SE 1.4及后續(xù)版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個(gè)基于緩沖區(qū)、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統(tǒng)I/O操作(bio)更好的并發(fā)運(yùn)行性能。想運(yùn)行在該模式下,直接修改server.xml里的Connector節(jié)點(diǎn),修改protocol為:
1 2 3 4 5 6 | <Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
enableLookups="false"
redirectPort="8443" />
|
(3)APR
(Apache Portable Runtime/Apache可移植運(yùn)行庫(kù)),是Apache HTTP服務(wù)器的支持庫(kù)。你可以簡(jiǎn)單地理解為,Tomcat將以JNI的形式調(diào)用Apache HTTP服務(wù)器的核心動(dòng)態(tài)鏈接庫(kù)來處理文件讀取或網(wǎng)絡(luò)傳輸操作,從而大大地提高Tomcat對(duì)靜態(tài)文件的處理性能。 Tomcat apr也是在Tomcat上運(yùn)行高并發(fā)應(yīng)用的首選模式。要tomcat支持apr,必須要安裝apr和native,這樣tomcat可以利用apache的apr接口,使用操作系統(tǒng)的部分本地操作,從而提升性能。
二、linux下配置tomcat+apr+native
2.1 安裝包準(zhǔn)備
- jdk-7u76-linux-x64.tar.gz(必須JDK1.7以上才支持apr)
- apr-1.5.2.tar.gz
- apr-util-1.5.4.tar.gz
- apache-tomcat-7.0.56.tar.gz(解壓之后其bin目錄下包含tomcat-native的安裝包)
2.2 安裝JDK
2.2.1 解壓
1 | tar -zxvf jdk-7u76-linux-x64.tar.gz
|
2.2.2 創(chuàng)建/usr/local/java文件夾
2.2.3 移動(dòng)到/usr/local/java
1 | mv jdk1.7.0_76 /usr/local/java
|
2.2.4 添加環(huán)境變量
再最后添加上
1 2 3 4 | #jdk1.7
export JAVA_HOME=/usr/local/java/jdk1.7.0_76
export CLASSPATH=$JAVA_HOME/lib/
export PATH=/usr/local/ruby/bin:$PATH:$JAVA_HOME/bin
|
注:如果用戶以非root賬號(hào)安裝jdk,那么需要在root賬號(hào)下配置jdk。此時(shí)jdk的配置路徑可以與非root賬號(hào)的配置路徑相同。配置完成后,保證echo $JAVA_HOME非空。示例如下:
1 2 | export JAVA_HOME=/opt/jdk1.7.0_79
export CLASSPATH=$JAVA_HOME/lib/
|
2.2.5 重啟環(huán)境變量,使配置生效
查看是否生效

2.3安裝APR
apr和apr-util的安裝,必須以root身份來進(jìn)行。需要安裝apr-1.5.2.tar.gz和apr-util-1.5.4.tar.gz
2.3.1 解壓apr-1.5.2.tar.gz和apr-util-1.5.4.tar.gz
1 2 | tar -zxvf apr-1.5.2.tar.gz
tar -zxvf apr-util-1.5.4.tar.gz
|
2.3.2 檢測(cè)、編譯、安裝
進(jìn)入到apr-1.5.2,執(zhí)行如下命令:
1 | ./configure --prefix=/usr/local/apr && make && make install
|
注:/user/local路徑為后續(xù)native的默認(rèn)安裝路徑,請(qǐng)不要做修改。
進(jìn)入到apr-util-1.5.4,執(zhí)行如下命令:
1 | ./configure --with-apr=/usr/local/apr/ --prefix=/usr/local/apr-utils && make && make install
|
2.4 修改最大文件句柄數(shù)和打開文件的數(shù)目
由于打開文件會(huì)比較多,所以要考慮修改默認(rèn)打開文件數(shù)目
2.4.1 修改/etc/sysctl.conf
1 2 | net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.ip_nonlocal_bind = 1
|
2.4.2 在/etc/security/limits.conf最后增加如下兩行記錄
1 2 | * soft nofile 65535
* hard nofile 65535
|
2.4.3 加載bridge模塊
2.4.4 重新載入sysctl,使其改變生效
2.4.5 再退出重新登陸,用ulimit -a查看

可以看到open files已經(jīng)由默認(rèn)的1024變成了65535。
2.5 安裝tomcat-native
2.5.1 解壓tomcat-native.tar.gz
1 | tar -zxvf tomcat-native.tar.gz
|
2.5.2 進(jìn)入到解壓后的目錄
1 | cd tomcat-native-1.1.31-src/jni/native
|
2.5.3 檢測(cè)、編譯、安裝
1 | ./configure --with-apr=/usr/local/apr/bin/apr-1-config --with-java-home=/opt/jdk1.7.0_79 && make && make install
|
其中加粗部分可以根據(jù)實(shí)際情況調(diào)整。
2.5 配置tomcat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | <?xml version='1.0' encoding='utf-8'?>
<Server port="9016" shutdown="SHUTDOWN">
<!--關(guān)閉https安全驗(yàn)證 -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<!--The connectors can use a shared executor, you can define one or more named thread pools-->
<!-- 配置線程 -->
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="25"
maxIdleTime="4000"
/>
<!-- 配置apr -->
<Connector executor="tomcatThreadPool"
port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
URIEncoding="UTF-8" enableLookups="false" acceptCount="50"
connectionTimeout="1000" maxKeepAliveRequests="250"
redirectPort="8443" />
<Connector port="9109" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- 配置訪問日志格式 -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
|
同時(shí)在catalina.sh文件中增加如下配置:
1 2 | JAVA_HOME="/opt/jdk1.7.0_79"
CATALINA_OPTS=-Djava.library.path=/usr/local/apr/lib
|
完成配置后,啟動(dòng)tomcat,出現(xiàn)以下提示則表示配置成功:

參見:http://www.cnblogs.com/zishengY/p/7101616.html
|