Tomcat作为一款常用的web容器,对其进行优化是提升性能的重要手段;对其进行优化可以从以下方面入手:
- 调整内存;
- 调整线程池(Executor);
- 调整连接器(Connector);
- 调整运行模式;
调整内存
如果内存设置过小,极有可能导致项目无法启动,会报OOM异常;所以可以适当增大内存;
Windows下修改Tomcat_Home/bin/catalina.sh
文件,在@echo off
下添加如下配置;
Linux下修改Tomcat_Home/bin/catalina.bat
文件,在cygwin=false
之前添加如下配置;
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m"
参数详解:
-
-server:一定要作为第一个参数,在多个 CPU 时性能佳,还有一种叫 -client 的模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或开发调试,在 32 位环境下直接运行 Java 程序默认启用该模式。Server 模式的特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境,在具有 64 位能力的 JDK 环境下默认启用该模式,可以不配置该参数;
-
-Xms: Java虚拟机初始化时堆的最小内存,一般与 Xmx配置为相同值,这样的好处是GC不必再为扩展内存空间而消耗性能;
-
-Xmx: 表示最大 Java 堆大小,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃,因此一般建议堆的最大值设置为可用内存的最大值的80%。如何知道我的 JVM 能够使用最大值,使用java -Xmx512M -version 命令来进行测试,然后逐渐的增大512的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息,默认值为物理内存的 1/4,默认(MinHeapFreeRatio参数可以调整)空余堆内存大于 70% 时,JVM 会减少堆直到-Xms 的最小限制。
-
-XX:PermSize: Java虚拟机永久代大小;
-
-XX:MaxPermSize:Java虚拟机永久代大小最大值;
在idea、eclipse等开发工具中设置见解决内存溢出OutOfMemoryError异常
调整线程池(Executor)
打开Tomcat_home/conf/server.xml
文件,配置Executor,参数如下:
<Executor
name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="20"
maxSpareThreads="50"/>
参数详解:
- name:线程池名称,用于Connector中指定;
- namePrefix:所创建的每个线程的名称前缀;
- maxThreads:线程池中最大线程数;
- minSpareThreads:最小空闲线程数,是tomcat启动时初始化的线程数;
- maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程。
注:
- 该部分配置也可以直接配置在Connector中,但是不可重复配置;
- 上述配置的参数,最大线程数要根据实际情况合理设置,并不是越大越好,设置越大会耗费内存和cpu,导致cpu疲于切换线程上下文,无力提供请求服务。
调整连接器(Connector)
Connector是连接器,负责接收客户的请求,以及向客户端回送响应的消息。所以Connector的优化是重要部分。
打开Tomcat_home/conf/server.xml
文件,配置Connector,参数如下:
<Connector
port="8080"
redirectPort="8443"
executor="tomcatThreadPool"
protocol="HTTP/1.1"
URIEncoding = "UTF-8"
connectionTimeout="20000"
enableLookups="false"
minProcessors="100"
maxProcessors="1000"
disableUploadTimeout = "false"
connectionUploadTimeout = "150000"
<!-- 与压缩相关额配置 -->
compression = "on"
compressionMinSize = "2048"
compressableMimeType = "text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"
/>
参数详解:
- executor:指定使用的执行器(线程池);
- URIEncoding:指定tomcat容器的url编码格式;
- connectionTimeout:网络连接超时,单位:毫秒,设置为 0 表示永不超时;
- enableLookups:是否支持域名解析,建议设置为false,减少性能损耗;
- minProcessors/maxProcessors:服务器初始化时创建的最小/最大线程数,与上述Executor中不同的是,一个是线程池的配置,而这是服务器的配置;
- disableUploadTimeout:上传时是否启用超时机制;
- connectionUploadTimeout :上传超时时间,与上面一个配置搭配使用
以下配置都与压缩相关,一般为了提升性能,都会对代码进行动静分离,将html、图片等静态交由Nginx处理,此时就不需要进行这部分配置;
- compression:是否启用压缩功能;
- compressionMinSize:压缩文件的最小值,只有当文件大于这个值时才会对其进行压缩;
- compressableMimeType:压缩类型,指定对哪些文件进行压缩。
调整运行模式
主要是对Connector中protocol参数进行调整;tomcat主要有三种模式:
-
BIO:同步阻塞IO,服务器实现模式为每有一个连接就创建一个线程来处理,并不适合高并发,适用于连接数少的架构;
-
NIO:非阻塞IO,可以复用一个线程处理多个连接(多路复用),适用于连接数多且短的架构;
-
APR:全称 Apache Portable Runtime,是Tomcat生产环境运行的首选方式,APR是从操作系统级别解决异步 IO 问题,APR 的本质就是使用 JNI 技术调用操作系统底层的 IO 接口,所以需要提前安装所需要的依赖。
更多参数上优化可以查阅官方文档:
https://tomcat.apache.org/tomcat-7.0-doc/config/http.html
https://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html