Tomcat优化

最近由于工作上的原因,需要对 Tomcat 并发进行优化。之前也做过一次 Tomcat 优化,但并没有记录下来,趁着最近不忙,学习并记录一下优化的过程。

Tomcat 中的三种运行模式之运行模式的优化

修改 Tomcat 的运行模式:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 修改为NIO模式:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
     connectionTimeout="20000"
     redirectPort="8443" />

验证成功方式:Tomcat 日志控制台最后
如果是 http-bio-8080 是 bio
如果是 http-nio-8080 是 nio

1、BIO(阻塞式):Tomcat 的默认模式,该模式性能较低,没有经过任何优化处理和支持,一个线程处理一个请求。缺点:并发量过大时,线程数较多,浪费资源。Tomcat7 及以下版本,在 linux 系统中默认使用该模式。

2、NIO-Non-blocking IO(非阻塞IO):Java NIO 可以让你非阻塞的使用 IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。Tomcat8 在Linux系统中默认使用这种方式。

3、APR:Apache Portable Runtime,从操作系统层面解决io阻塞问题。Tomcat7 或 Tomcat8 在 Win7 或以上的系统中启动默认使用这种方式。Linux 如果安装了 apr 和 native,Tomcat 直接启动就支持 apr。

Tomcat 执行器(线程池)的优化

Tomcat 默认是没有启用线程池的,在 Tomcat 中每一个用户请求都是一个线程,所以我们可以使用线程池来提高性能。Tomcat 的前段有一个调度线程,会将用户的请求放入线程池中,一定时间后线程池中的用户请求任务就变为工作线程。

1、开启线程池:打开 server.xml 中关于线程池的配置

<Executor name="TomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="600" minSpareThreads="10"/>

重要参数说明:

name:共享线程池的名字。这是 Connector 为了共享线程池要引用的名字,该名字必须唯一。默认值:None;

namePrefix:在 JVM 上,每个运行线程都可以有一个 name 字符串。这一属性为线程池中每个线程的 name 字符串设置了一个前缀,Tomcat 将把线程号追加到这一前缀的后面。默认值:Tomcat-exec-;

maxThreads:该线程池可以容纳的最大线程数。默认值:200;

maxIdleTime:在 Tomcat 关闭一个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。只有当前活跃的线程数大于 minSpareThread 的值,才会关闭空闲线程。默认值:60000(一分钟)。

minSpareThreads:Tomcat 应该始终打开的最小不活跃线程数。默认值:25。

2、引用线程池

<Connector
     executor="TomcatThreadPool"

     port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
     connectionTimeout="20000"
     redirectPort="8443"

     maxThreads="1000"
     minSpareThreads="100"
     acceptCount="1000"
     maxConnections="1000"
     maxHttpHeaderSize="8192"
     tcpNoDelay="true"
     compression="on"
     disableUploadTimeout="true"
     enableLookups="false"
     URIEncoding="UTF-8"
     />

maxThreads:最大线程数
minSpareThreads:最小线程数
acceptCount:接受最大队列长度
maxConnections:最大连接数
connectionTimeout:超时等待时间 毫秒
maxHttpHeaderSize:请求头最大值
tcpNoDelay:如果为true,服务器socket会设置TCP_NO_DELAY选项,在大多数情况下可以提高性能。缺省情况下设为true
compression:是否开启压缩GZIP on开启 off 关闭 forde:所有情况下都压缩
disableUploadTimeout:限定上传时间
enableLookups:关闭DNS反向查询,DNS反查很耗时间

Tomcat 优化之禁用AJP连接器实现动静分离

AJP:协议是一个面向包的。web 服务器和 servlet 容器通过 TCP 链接进行交互,为了节省 SOCKET 创建的昂贵代价,WEB服务器会尝试维护一个永久 TCP 链接到 Servlet 容器,并在多个请求和响应周期过程会重用链接。

由于 Tomcat 服务器相对于 Nginx 服务器在处理静态资源上效率较低。因此我们的网站服务器一般是 Nginx+Tomcat,Nginx 负责处理静态资源,因此 AJP 协议我们在使用 Nginx+Tomcat 架构时可以关闭它来进行效率的优化。

注释 Tomcat server.xml 中 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 即可。

Tomcat 中 JVM 参数优化

对jvm参数的优化我们主要是对堆内存的优化

Linux 下 catalina.sh 在一大段注释的下面,正文配置的上面加入:

JAVA_OPTS="-server -Xmx2688M -Xms2688M -Xmn960M -XX:MaxTenuringThreshold=10 -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:MaxMetaspaceSize=512m -XX:MetaspaceSize=512m"

最后推荐一个可以在线对 JVM 参数进行优化的网站:http://xxfox.perfma.com

本文由个人 hexo 博客 co2fe.com 迁移
date: 2018-12-12 10:54:47

posted @ 2018-12-28 15:55  LiuChengloong  阅读(1190)  评论(0编辑  收藏  举报