对于 Javaweb 开发人员而言, Tomcat 已成为默认的 Web 服务器, 但是在生产环境下使用 Tomcat 部署应用, 我们如果采用 Tomcat 默认的配置, 尤其是内存和线程的配置, 其配置都很低, 容易成为性能瓶颈, 所以我们需要对 Tomcat 服务器进行优化, 提升其运行性能, 下面我们一起来看看 Tomcat 如何优化?
一, Tomcat 内存优化, 启动时告诉 JVM 需要多大内存(调优内存是最直接的方式)
Windows 下的 catalina.bat
Linux 下的 catalina.sh
在该文件中配置 jvm 的内存空间, 如: JAVA_OPTS='-Xms256m -Xmx512m'
-XmsJVM 初始化堆的大小
-XmxJVM 堆的最大值, 实际参数大小根据服务器配置或者项目具体设置;
二, Tomcat 线程优化 在 server.xml 中配置
比如:
connectionTimeout="20000" />
maxSpareThreads="X" 表示如果最多可以有 X 个线程, 一旦超过 X 个, 则会关闭不在需要的线程
acceptCount="X" 当同时连接的人数达到 maxThreads 时, 还可以排队, 队列大小为 X. 超过 X 就不处理
三, Tomcat IO 优化
1: 同步阻塞 IO(JAVA BIO) 同步并阻塞, 服务器实现模式为一个连接一个线程(one connection one thread 想想都觉得恐怖, 线程可是非常宝贵的资源), 当然可以通过线程池机制改善.
2:JAVA NIO 又分为同步非阻塞 IO, 异步阻塞 IO 与 BIO 最大的区别 one request one thread. 可以复用同一个线程处理多个 connection(多路复用).
3: 异步非阻塞 IO(Java NIO2 又叫 AIO) 主要与 NIO 的区别主要是操作系统的底层区别, 可以做个比喻: 比作快递, NIO 就是网购后要自己到官网查下快递是否已经到了(可能是多次), 然后自己去取快递; AIO 就是快递员送货上门了(不用关注快递进度).
BIO 方式适用于连接数目比较小且固定的架构, 这种方式对服务器资源要求比较高, 并发局限于应用中, JDK1.4 以前的唯一选择, 但程序直观简单易理解.
NIO 方式适用于连接数目多且连接比较短 (轻操作) 的架构, 比如聊天服务器, 并发局限于应用中, 编程比较复杂, JDK1.4 开始支持.
AIO 方式使用于连接数目多且连接比较长 (重操作) 的架构, 比如相册服务器, 充分调用 OS 参与并发操作, 编程比较复杂, JDK7 开始支持.
在 server.xml 中
- connectionTimeout="20000"
- URIEncoding="UTF-8"
- useBodyEncodingForURI="true"
- enableLookups="false"
- redirectPort="8443" />
实现对 Tomcat 的 IO 切换.
四, 大杀器 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 优化到这个层次, 可以应对大部分性能需求;
最后, 优化的前提条件是良好的代码质量和设计.
来源: http://server.51cto.com/sOS-590374.htm