Tomcat 通常是JavaWeb开发中默认的开发环境,但是Tomcat的默认配置在作为生产环境时,很难满足我们的需求,很多方面都是可以优化的,尤其是内存和线程的配置,默认都很低。
下面结合资料和实际工作中的情况,从内存、并发、缓存、IO四个方面分析下优化的方法。
一、Tomcat内存优化
内存优化,也就是对JVM的参数进行优化,优化的文件是
Windows 操作系统下的catalina.bat 和 Linux 操作系统下的catalina.sh,主要是对其中的 java_OPTS 参数 设置:
JAVA_OPTS参数说明 :
-server: 启用jdk 的 server 版;
-Xms: java虚拟机初始化时的最小内存,JVM初始化堆的大小;
-Xmx: java虚拟机可使用的最大内存,JVM堆的最大值;
-XX: PermSize 内存永久保留区域
-XX: MaxPermSize 内存最大永久保留区域
现公司服务器内存一般都可以加到最大2G ,所以可以采取以下配置:
JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’
配置完成后重启Tomcat ,通过以下命令进行查看配置是否生效:
(1)首先查看Tomcat 进程号:
sudo lsof -i:9027
可以看到Tomcat 进程号是 12222
(2)查看是否配置生效:
sudo jmap – heap 12222
可以看到MaxHeapSize 等参数已经生效
二、Tomcat并发优化
1.Tomcat连接相关参数
在Tomcat 配置文件 server.xml 中的
<Connector port="8090" protocol="HTTP/1.1" maxHttpHeaderSize="8192" minProcessors="100" maxProcessors="1000" acceptCount="1000" redirectPort="8443"
disableUploadTimeout="true"/>
(1)参数说明
maxThreads 客户请求最大线程数 ,即最多同时处理X个连接
minSpareThreads Tomcat 初始化时创建的 socket 线程数 ,初始化X个连接
maxSpareThreads Tomcat 连接器的最大空闲 socket 线程数 ,表示如果最多可以有X个线程,一旦超过X个,则会关闭不在需要的线程
enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名
redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝同时不能小于maxSpareThreads数
connectionTimeout 连接超时
minProcessors 服务器创建时的最小处理线程数
maxProcessors 服务器同时最大处理线程数
URIEncoding URL统一编码
(2)配置示例
<Connector port="8090" protocol="HTTP/1.1" maxHttpHeaderSize="8192"
maxThreads="1000" minSpareThreads="100" maxSpareThreads="1000"
minProcessors="100" maxProcessors="1000" enableLookups="false"
URIEncoding="utf-8" acceptCount="1000" redirectPort="8443"
disableUploadTimeout="true"/>
三、Tomcat缓存优化
(1)参数说明
compression 打开压缩功能
compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType 压缩类型
connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间
(2)配置示例
<Connector port="8090" protocol="HTTP/1.1" maxHttpHeaderSize="8192"
maxThreads="1000" minSpareThreads="100" maxSpareThreads="1000"
minProcessors="100" maxProcessors="1000" enableLookups="false"
compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000" URIEncoding="utf-8" acceptCount="1000"
redirectPort="8443" disableUploadTimeout="true"/>
四、Tomcat IO优化
Tomcat通讯协议支持http1.0和1.1,默认走的是BIO通讯模式
顺便熟悉下Java中对几种IO方式:
Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理
Tomcat中IO优化的配置方法:
在server.xml中 ,将
<Connector connectionTimeout="20000" port="8066" protocol="HTTP/1.1" redirectPort="8448"/>
改为:
<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>
其中的 protocol=”org.apache.coyote.http11.Http11NioProtocol” ,表示以 NIO模式启动。
参考文章:https://blog.youkuaiyun.com/centre10/article/details/50639693