一、Tomcat三种线程方式
1、BIO(默认)
BIO(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。
Tomcat在默认情况下,就是以BIO模式运行的。就一般而言,BIO模式是三种运行模式中性能最低的一种。我们可以通过Tomcat Manager来查看服务器的当前状态。
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。
2、NIO(标准)
NIO(New I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。
Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
3、APR(建议)
APR(Apache Portable Runtime/Apache可移植运行时),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。
Tomcat Apr也是在Tomcat上运行高并发应用的首选模式。
二、Tomcat三种线程配置
以下仅对Tomcat的线程配置做基本配置讲解,并未涉及到相关优化,具体优化请看第三、第四节。
1、BIO(默认)
就是默认的选项,不做改动。
修改配置文件为:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
截图:
2、NIO(标准)
让Tomcat以nio模式来运行也比较简单,我们只需要在:Tomcat安装目录/conf/server.xml文件中将Connector配置修改为如下图所示:
修改配置文件为:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000" redirectPort="8443" />
截图:
3、APR(建议)
如果你的系统对高并发有要求并且系统硬件性能好的话,建议使用此配置,否则建议使用JBoss或者其它容器吧。(个人建议)
首先修改配置文件为:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000" redirectPort="8443" />
截图:
三、Tomcat容器内优化
第二节对Tomcat的线程配置进行了基本的讲解,真正的优化要通过以下参数进行调整,下面参数配置可通用NIO\ARP模式,BIO模式请根据项目实际情况进行调整。
1、Connector具体配置:
性子急的可以直接把下面的配置拿去使用,红色字体请按自己的容器模式进行配置,别用错了,建议把后面的配置详情多看看,再按实际服务器配置进行调优,毕竟适合自己的才是最好的。
<Connector port="8082" protocol="org.apache.coyote.http11.Http11NioProtocol"
disableUploadTimeout="true"
connectionTimeout="20000"
useURIValidationHack="false"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
2、Connector参数说明:
- URIEncoding :指定Tomcat容器的URL编码格式,使得Tomcat可以解析含有中文名的文件的url。
- minSpareThreads :最小备用线程数,Tomcat启动时的初始化的线程数,即使没有使用也开这么多空线程等待。
- enableLookups :如果希望调用request.getRemoteHost()进行DNS查询,以返回远程客户的实际主机名,将enableLookups设为true。如果希望忽略DNS查询,仅仅返回IP地址,设为false(这样提高了性能)。缺省情况下,DNS查询是true的。
- disableUploadTimeout :上传时是否使用超时机制。
- connectionTimeout :网络连接超时,单位:毫秒。设置为0表示永不超时,通常可设置为20000毫秒,缺省值为60000(60秒)。
- maxThreads :tomcat可创建的最大线程数,即同时处理的任务个数(最大并发数),默认值为200
- acceptCount :当tomcat启动的线程数达到最大时(maxThreads的值),后续请求会被放入一个等待队列,这个队列的大小就是acceptCount 的值,如果这个队列也满了,就直接refuse connection,默认值为100。
- useURIValidationHack :设成"false"可以减少对一些url的不必要的检查从而减省开销(可参考tomcat源码)。
- compression :是否启用压缩 on为启用(文本数据压缩) off为不启用, force 压缩所有数据
- compressionMinSize :启用压缩的输出内容大小,当超过最小数据大小才进行压缩,默认为2KB。
- compressableMimeType :配置想压缩的数据类型,默认是 text/html,text/xml,text/plain
- noCompressionUserAgents :对于指定的浏览器,不启用压缩,例如:"gozilla, traviata"。
- redirectPort :如果Connector支持非SSL请求,在收到一个要求使用SSL传输的请求以后,Catalina会自动将该请求重定向到这里指定的端口号。
特别说明:
- minProcessors、maxProcessors、maxSpareThreads这三个参数在Tomcat7中已经去除,网上百度到大部分的配置都是错的,详情可参考官方文档。
- 关于Connector更多的参数配置请参考官网说明
- 使用compression、compressionMinSize、compressableMimeType、noCompressionUserAgents四个参数给Tomcat配置gzip压缩(HTTP压缩)功能可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,Javascript,Text,它可以节省40%左右的流量,更为重要的是,它可以对动态生成的包括CGI、PHP,JSP,ASP,Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。