Tomcat优化
# 1. Tomcat内存优化
Tomcat 内存优化主要是对 tomcat 启动参数优化,在启动时告诉 JVM 我要一块大内存(调优内存是最直接的方式),可以在启动脚本 catalina.sh 中设置 java_OPTS 参数。
JAVA_OPTS参数说明:
-server 启用jdk 的 server 版
-Xms java虚拟机初始化时的最小内存
-Xmx java虚拟机可使用的最大内存
-XX: PermSize 内存永久保留区域
-XX:MaxPermSize 内存最大永久保留区域
2
3
4
5
服务器参数配置:
现公司服务器内存一般都可以加到最大2G ,所以可以采取以下配置:
JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’
# 2. Tomcat 线程优化
在Tomcat 配置文件 server.xml 中优化线程和并发处理能力。
<Connector port="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000" 客户请求最大线程数
minSpareThreads="100" Tomcat初始化时创建的 socket 线程数
maxSpareThreads="1000" Tomcat连接器的最大空闲 socket 线程数
minProcessors="100" 服务器创建时的最小处理线程数
maxProcessors="1000" 服务器同时最大处理线程数
enableLookups="false" 若设为true,则支持域名解析,可把 ip 地址解析为主机名
compression="on" 打开压缩功能
compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 压缩类型
connectionTimeout="20000" 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间
URIEncoding="utf-8" URL统一编码
acceptCount="1000" 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )
redirectPort="8443" 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
disableUploadTimeout="true"/>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 3. Tomcat IO优化
Tomcat有三种工作模式:Bio、Nio(Aio)和Apr
同步阻塞IO(JAVA BIO):
同步并阻塞,服务器实现模式为一个连接一个线程(one connection one thread 想想都觉得恐怖,线程可是非常宝贵的资源),当然可以通过线程池机制改善.
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解.
JAVA NIO:
又分为同步非阻塞IO,异步阻塞IO 与BIO最大的区别one request one thread.可以复用同一个线程处理多个connection(多路复用).
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持.
异步非阻塞IO(Java NIO2,又叫AIO):
主要与NIO的区别主要是操作系统的底层区别.可以做个比喻:比作快递,NIO就是网购后要自己到官网查下快递是否已经到了(可能是多次),然后自己去取快递;AIO就是快递员送货上门了(不用关注快递进度)。
AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持.
在server.xml中实现对Tomcat的IO切换.
<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
enableLookups="false"
redirectPort="8443" />
2
3
4
5
6
APR
APR是从操作系统级别来解决异步的IO问题,大幅度的提高性能. (http://apr.apache.org/).
APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP Server 2.x的核心.能更好地和其它本地web技术集成,总体上让Java更有效率作为一个高性能web服务器平台而不是简单作为后台容器.
在产品环境中,特别是直接使用Tomcat做WEB服务器的时候,应该使用Tomcat Native来提高其性能.如果不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,并发的线程数量明显下降,从原来的300可能会马上下降到只有几十,新的请求会毫无阻塞的进来.
在局域网环境测,就算是400个并发,也是一瞬间就处理/传输完毕,但是在真实的Internet环境下,页面处理时间只占0.1%都不到,绝大部分时间都用来页面传输.如果不用APR,一个线程同一时间只能处理一个用户,势必会造成阻塞。所以生产环境下用apr是非常必要的.
安装Apache Tomcat Native Library,直接启动就支持apr(http://tomcat.apache.org/native-doc/)它本身是基于APR的. 具体安装方法可以参考其他博客和文章. 排除代码问题Tomcat优化到这个层次,可以应对大部分性能需求.
工作模式原理涉及到了网络I/O模型知识:
**阻塞式I/O模型:**应用进程调用recv函数系统调用时,如果等待要操作的数据没有发送到内核缓冲区,应用进程将阻塞,不能接收其他请求。反之,内核recv端缓冲区有数据,内核会把数据复制到用户空间解除阻塞,继续处理下一个请求。(内核空间(缓冲区)--用户空间(系统调用))
**非阻塞式I/O模型:**应用进程设置成非阻塞模式,如果要操作的数据没有发送到内核缓冲区,recv系统调用返回一个错误,应用进程利用轮询方式不断检查此操作是否就绪,如果缓冲区中有数据则返回,I/O操作同时不会阻塞应用进程,期间会继续处理新请求。
**I/O****复用模型:**阻塞发生在select/poll的系统调用上,而不是阻塞在实际的I/O系统调用上。能同时处理多个操作,并检查操作是否就绪,select/epoll函数发现有数据就绪后,就通过实际的I/O操作将数据复制到应用进程的缓冲区中。
**异步I/O模型:**应用进程通知内核开始一个异步I/O操作,并让内核在整个操作(包括数据复制缓冲区)完成后通知应用进程,期间会继续处理新请求。
**I/O****操作分为两个阶段:**第一个阶段等待数据可用,第二个阶段将数据从内核复制到用户空间。
**前三种模型的区别:**第一阶段阻塞式I/O阻塞在I/O操作上,非阻塞式I/O轮询,I/O复用阻塞在select/poll或epoll上。第二阶段都是一样的。而异步I/O的两个阶段都不会阻塞进程。