摘要:在慢速網絡上Tomcat線程數開到300以上的水平,不配APR,基本上300個線程狠快就會用滿,之後的請求就只好等待。可是配上APR以後,Tomcat將以JNI的形式調用Apache HTTP服務器的核心動態連接庫來處理文件讀取或網絡傳輸操做,這時併發的線程數量明顯降低,從原來的300可能會立刻降低到只有幾十,新的請求會毫無阻塞的進來。java
Tomcat 有三種(bio,nio.apr) 運行模式,首先來簡單介紹下linux
bio
bio(blocking I/O),顧名思義,即阻塞式I/O操做,表示Tomcat使用的是傳統的Java I/O操做(即java.io包及其子包)。Tomcat在默認狀況下,就是以bio模式運行的。遺憾的是,就通常而言,bio模式是三種運行模式中性能最低的一種。咱們能夠經過Tomcat Manager來查看服務器的當前狀態。web
nio
是Java SE 1.4及後續版本提供的一種新的I/O操做方式(即java.nio包及其子包)。Java nio是一個基於緩衝區、並能提供非阻塞I/O操做的Java API,所以nio也被當作是non-blocking I/O的縮寫。它擁有比傳統I/O操做(bio)更好的併發運行性能。apache
想運行在該模式下,直接修改server.xml裏的Connector節點,修改protocol爲 api
<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" URIEncoding="UTF-8" useBodyEncodingForURI="true" enableLookups="false" redirectPort="8443" />
apr
(Apache Portable Runtime/Apache可移植運行庫),是Apache HTTP服務器的支持庫。你能夠簡單地理解爲,Tomcat將以JNI的形式調用Apache HTTP服務器的核心動態連接庫來處理文件讀取或網絡傳輸操做,從而大大地提升Tomcat對靜態文件的處理性能。 Tomcat apr也是在Tomcat上運行高併發應用的首選模式。tomcat
要tomcat支持apr,必需要安裝apr和native,這樣tomcat能夠利用apache的apr接口,使用操做系統的部分本地操做,從而提高性能。安全
Tomcat的運行模式有3種.修改他們的運行模式.3種模式的運行是否成功,能夠看他的啓動控制檯,或者啓動日誌.或者登陸他們的默認頁面http://localhost:8080/查看其中的服務器狀態。 ruby
接下來介紹linux下tomcat+apr+native配置服務器
jdk-7u76-linux-x64.tar.gz(必須JDK1.7以上才支持apr)cookie
apr-1.5.2.tar.gz
apr-util-1.5.4.tar.gz
apache-tomcat-7.0.56.tar.gz(解壓以後其bin目錄下包含tomcat-native的安裝包)
這是運行Tomcat的首要環境,因此這一步最早執行。
tar -zxvf jdk-7u76-linux-x64.tar.gz
mkdir -p /usr/local/java
mv jdk1.7.0_76 /usr/local/java
vi /etc/profile
再最後添加上
#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
source /etc/profile
查看是否生效
出現如下字樣則表示安裝成功,接下來安裝tomcat
tar -zxvf apache-tomcat-7.0.56.tar.gz
mv apache-tomcat-7.0.56 tomcat7
我這裏tomcat是放在/home目錄下
vi /home/tomcat7/bin/catalina.sh
在裏面添加
JAVA_OPTS="-server -Xms1024M -Xmx1024M -XX:PermSize=512M -XX:MaxNewSize=512M -XX:MaxPermSize=512M"
vi /home/tomcat7/conf/server.xml
添加上
<!-- 配置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" />
下面貼出一個server.xml完整的配置
<?xml version='1.0' encoding='utf-8'?> <Server port="9016" shutdown="SHUTDOWN"> <!--關閉https安全驗證 --> <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>
cd /home/tomcat7/bin
tar -zxvf tomcat-native.tar.gz
cd tomcat-native-1.1.31-src/jni/native
./configure --with-apr=/usr/local/apr/bin/apr-1-config --with-java-home=/usr/local/java/jdk1.7.0_76 && make && make install
須要安裝apr-1.5.2.tar.gz和apr-util-1.5.4.tar.gz
tar -zxvf apr-1.5.2.tar.gz tar -zxvf apr-util-1.5.4.tar.gz
./configure --prefix=/usr/local/apr && make && make install
./configure --with-apr=/usr/local/apr/ --prefix=/usr/local/apr-utils && make && make install
因爲打開文件會比較多,因此要考慮修改默認打開文件數目
net.ipv4.ip_local_port_range = 10240 65535 net.ipv4.ip_nonlocal_bind = 1
* soft nofile 65535 * hard nofile 65535
modprobe bridge
sysctl -p
能夠看到open files已經由默認的1024變成了65535
/home/tomcat7/bin/startup.sh
出現如下提示則表示配置成功
3.1、啓動tomcat時報「The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/local/apr/lib」