在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待。但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,这时并发的线程数量明显下降,从原来的300可能会马上下降到只有几十,新的请求会毫无阻塞的进来。
一、Tomcat运行模式介绍
Tomcat 有三种(bio,nio.apr) 运行模式,首先来简单介绍下:
(1)BIO
BIO(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。我们可以通过Tomcat Manager来查看服务器的当前状态。
(2)NIO
NIO是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。想运行在该模式下,直接修改server.xml里的Connector节点,修改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可移植运行库),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。要tomcat支持apr,必须要安装apr和native,这样tomcat可以利用apache的apr接口,使用操作系统的部分本地操作,从而提升性能。
二、linux下配置tomcat+apr+native
2.1 安装包准备
2.2 安装JDK
2.2.1 解压
1 | tar -zxvf jdk-7u76-linux-x64.tar.gz |
2.2.2 创建/usr/local/java文件夹
1 | mkdir -p /usr/local/java |
2.2.3 移动到/usr/local/java
1 | mv jdk1.7.0_76 /usr/local/java |
2.2.4 添加环境变量
1 | vi /etc/profile |
再最后添加上
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账号安装jdk,那么需要在root账号下配置jdk。此时jdk的配置路径可以与非root账号的配置路径相同。配置完成后,保证echo $JAVA_HOME非空。示例如下:
1 2 | export JAVA_HOME=/opt/jdk1.7.0_79 export CLASSPATH=$JAVA_HOME/lib/ |
2.2.5 重启环境变量,使配置生效
1 | source /etc/profile |
查看是否生效
2.3安装APR
apr和apr-util的安装,必须以root身份来进行。需要安装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 检测、编译、安装
进入到apr-1.5.2,执行如下命令:
1 | ./configure --prefix=/usr/local/apr && make && make install |
注:/user/local路径为后续native的默认安装路径,请不要做修改。
进入到apr-util-1.5.4,执行如下命令:
1 | ./configure --with-apr=/usr/local/apr/ --prefix=/usr/local/apr-utils && make && make install |
2.4 修改最大文件句柄数和打开文件的数目
由于打开文件会比较多,所以要考虑修改默认打开文件数目
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模块
1 | modprobe bridge |
2.4.4 重新载入sysctl,使其改变生效
1 | sysctl -p |
2.4.5 再退出重新登陆,用ulimit -a查看
可以看到open files已经由默认的1024变成了65535。
2.5 安装tomcat-native
2.5.1 解压tomcat-native.tar.gz
1 | tar -zxvf tomcat-native.tar.gz |
2.5.2 进入到解压后的目录
1 | cd tomcat-native-1.1.31-src/jni/native |
2.5.3 检测、编译、安装
1 | ./configure --with-apr=/usr/local/apr/bin/apr-1-config --with-java-home=/opt/jdk1.7.0_79 && make && make install |
其中加粗部分可以根据实际情况调整。
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" > <!--关闭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> |
同时在catalina.sh文件中增加如下配置:
1 2 | JAVA_HOME= "/opt/jdk1.7.0_79" CATALINA_OPTS=-Djava.library.path=/usr/local/apr/lib |
完成配置后,启动tomcat,出现以下提示则表示配置成功:
联系客服