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