Tomcat 8.0的并发优化 - 优化server.xml的配置
Tomcat并发量与其配置息息相关, 一般的机器几百的并发量足矣, 如果设置太高可能引发各种问题, 内存、网络等问题也能在高并发下暴露出来, 因此, 配置参数的设置非常重要.
1 Tomcat的3种运行模式
1.1 BIO - 同步阻塞IO模式
BIO, 同步阻塞IO, 性能低, 没有经过任何优化处理和支持.
服务器实现模式为一个连接一个线程, 即客户端有连接请求时服务器端就需要启动一个线程进行处理, 如果这个连接不做任何事情会造成不必要的线程开销, 当然可以通过 线程池 机制改善.
适用场景: BIO方式适用于连接数比较小且固定的架构, 这种方式对服务器资源要求比较高, 有并发局限, JDK1.4之前的唯一选择.
1.2 NIO - 同步非阻塞IO模式
是Java SE 1.4及后续版本提供的一种新的IO操作方式(即java.nio包及其子包). Java NIO是一个基于缓冲区、并能提供非阻塞IO操作的Java API, 因此NIO也被看成是non-blocking IO(非阻塞式IO)的缩写, 它拥有比传统BIO操作更好的并发性能.
服务器实现模式为一个请求一个线程, 即客户端发送的连接请求都会注册到多路复用器上, 多路复用器轮询到连接有IO请求时才启动一个线程进行处理.
适用场景: 适用于连接数较多且连接比较时间短(轻操作)的架构, 比如聊天服务器. 这种方式的并发性能局限于应用中, 编程比较复杂.
目前Tomcat 8.x默认运行在NIO模式下.
1.3 APR - 可移植运行时模式
APR(Apache Portable Runtime, Apache可移植运行时), 是Apache HTTP服务器的一个支持库, 它提供了一组映射到底层操作系统的API, 如果操作系统不支持特定功能, APR库将提供仿真. 因此开发人员可以使用APR使程序真正跨平台移植.
此模式的安装步骤比较繁琐, 但却从操作系统层面解决了异步IO的问题, 能大幅度提高应用性能.
APR的本质是使用 JNI 技术调用操作系统底层的IO接口, 所以需要提前安装必要的依赖, 具体方式后续给出.
2 Tomcat的并发配置(配置Connector)
Tomcat的Connector是其接收HTTP请求的关键模块, 可以通过它来指定IO处理模式, 指定处理该Connector接收到的请求的线程数, 以及其他常用的HTTP策略.
配置路径: 在 ${TOMCAT_HOME}/conf/server.xml 文件的节点中进行配置.
2.1 使用线程池处理请求
使用线程池, 通过较少的线程资源来处理更多的请求, 从而提高Tomcat的请求处理能力.
前提: 要提前配置至少一个线程池来处理请求, 配置文件为${TOMCAT_HOME}/conf/server.xml.
其中Executor与Connector同级, 多个Connector可以使用同一个线程池来处理请求.
(1) 参考默认连接池配置:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
          maxThreads="150" minSpareThreads="4"/>
(2) 自定义线程池示例:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
          maxThreads="200" minSpareThreads="10" maxIdleTime="600000"
          prestartminSpareThreads="true" maxQueueSize="100"  />
(3) 线程池参数说明:
name: 线程池名称.
namePrefix: 创建的每个线程的名称前缀, 单独的线程名称为 namePrefix + threadNumber.
maxThreads: 线程池中最大并发线程数, 默认值为200, 一般建议设置400~ 800 , 要根据服务器配置和业务需求而定.
minSpareThreads: 最小活跃线程数, 也就是核心线程数, 不会被销毁, 会一直存在.
prestartminSpareThreads: 是否在启动程序时就生成minSpareThreads个线程, 默认为false, 即不启动. 若不设置为true, 则minSpareThreads的设置就不起作用了.
maxIdleTime: 线程最大空闲时间, 超过该时间后, 空闲线程会被销毁, 默认值为6000, 单位为毫秒.
maxQueueSize: 最大的等待队列数, 超过则拒绝请求. 默认值为int类型的最大值(Integer.MAX_VALUE), 等同于无限大. 一般不作修改, 避免发生部分请求未能被处理的情况.
threadPriority: 线程池中线程的优先级, 默认值为5, 取值范围: 1 ~ 10.
className:线程池的实现类, 未指定情况下, 默认实现类为org.apache.catalina.core.StandardThreadExecutor. 要自定义线程池就需要实现org.apache.catalina.Executor接口.
2.2 在Connector中使用线程池
Connector是Tomcat接收请求的入口, 每个Connector都有自己专属的监听端口.
  <Connector executor="tomcatThreadPool"
             port="8080" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443" />
(1) Connector的参数说明:
redirectPort="8443"# 基于SSL的端口, 在需要基于安全通道的场合, 比如当客户端的请求协议是HTTPS时, 将该请求转发到此端口.
minSpareThreads="25"# Tomcat连接器的最小空闲Socket线程数, 默认值为25. 如果当前没有空闲线程, 且没有超过maxThreads, 将一次性创建的空闲线程数量. Tomcat初始化时创建的线程数量也是此值.
maxSpareThreads="75"# 最大空闲线程数, 一旦创建的线程超过此值, Tomcat就会关闭不再需要的Socket线程, 默认值为50. 线程数可以大致用 "同时在线用户数、用户每秒操作次数、系统平均操作时间" 来计算.
keepAliveTimeout="6000"# 下次请求到来之前, Tomcat保持该连接6000ms.
maxKeepAliveRequests="10"# 该连接最大支持的请求数, 超过该请求数的连接也将被关闭(此时就会返回一个Connection: close头给客户端). 1表示禁用长连接, -1表示不限制连接个数, 默认为100, 一般设置在100~200之间.
acceptorThreadCount="1"# 用于接收连接的线程的数量, 默认值是1. 一般如果服务器是多核CPU时, 需要改配置为 2.
enableLookups="false"# 是否支持反查域名(即DNS解析), 默认为true. 为提高处理能力, 应设置为false.
disableUploadTimeout="true"# 上传时是否启用超时机制, 若为true, 则禁用上传超时.
connectionTimeout="20000"# 网络连接超时时间, 默认值为20000ms, 设置为0表示永不超时 —— 存在隐患. 通常可设置为30000ms.
URIEncoding="UTF-8"# 指定Tomcat容器的URL编码格式.
maxHttpHeaderSize="8192"# HTTP请求头信息的最大程度, 超过此长度的部分不予处理. 一般设置为8K即可.
maxPostSize="10485760"# 指定POST请求的内容大小, 单位为Byte, 默认大小为2097152(2MB), 10485760为10M. 如果要禁用限制, 可设置为-1.
compression="on"# 打开传输时压缩功能.
compressionMinSize="10240"# 启用压缩的输出内容大小, 默认为2048, 即2KB.
noCompressionUserAgents="gozilla, traviata"# 设置不启用压缩的浏览器
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"# 压缩的资源类型
(2) 补充说明:
① Tomcat 的压缩是在客户端请求服务器对应资源后, 从服务器端将资源文件压缩, 再输出到客户端, 由客户端的浏览器负责解压缩并浏览. 相对于普通的浏览过程(如浏览HTML、CSS、Javascript和Text), 它可以节省40%左右的流量. 更为重要的是, 它也可以对动态生成的网页(包括CGI、PHP、JSP、ASP、Servlet、SHTML等)进行压缩.
② 需要注意的是, 压缩会增加Tomcat的负担, 最好采用 Nginx + Tomcat 或 Apache + Tomcat 方式, 将压缩交由 Nginx / Apache 去完成. 在server.xml的节点配置(尚未验证使用):
<Service name="Catalina" />--- 处理所有直接由Tomcat服务器接收的web客户请求.<Service name="Apache" />--- 处理所有由Apahce服务器转发过来的Web客户请求.<Service name="Nginx" />--- 处理所有由Nginx服务器转发过来的Web客户端请求.
2.2 使用NIO模式处理请求
(1) 默认配置 - BlockingIO模型:
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
(2) 关于NIO的说明:
- 每个Web客户端请求对服务器端来说就是一个单独的线程, 客户端请求数量增多, 服务器端的处理线程数量也将增加, 对CPU而言, 将会在线程切换上消耗更多的时间. 而NIO则是使用单线程(单个CPU)或只使用少量的多线程(多CPU)来接受Socket, 而由线程池来处理堵塞在 Pipe 或 Queue 中的请求. 这样的话, 只要OS可以接受TCP连接, Web服务器就可以处理该请求 -- 大大提高了Web服务器的伸缩性.
 - Tomcat 8 下使用 NIO2, 即
 org.apache.coyote.http11.Http11Nio2Protocol更优.- Tomcat 6、7 下使用 NIO, 即
 org.apache.coyote.http11.Http11NioProtocol更优.
(3) NIO模型配置:
<Connector executor="tomcatThreadPool"
           port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
           connectionTimeout="20000"
           redirectPort="8443"
           maxPostSize="10485760"
           acceptorThreadCount="2" />
(4) 参数说明:
executor="..."  # 连接器使用的线程池名称.
port="..."      # 连接端口, URL中指定此端口进行访问.
protocol="..."  # 连接器使用的请求处理模式.
redirectPort="8443"   # 基于SSL的端口, 在需要基于安全通道的场合, 比如当客户端的请求协议是HTTPS时, 将该请求转发到此8443端口.
2.3 使用APR模式处理请求
可以简单地将APR模式理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库, 进行文件读取或网络传输操作, 从而大大地提高Tomcat对静态文件的处理性能.
APR是Tomcat上运行高并发应用的首选模式, 同时如果使用HTTPS方式传输, 也可以提升SSL的处理性能.
前面已经提到, APR模式会调用操作系统底层的IO接口, 所以需要安装必要的依赖.
(1) 安装OpenSSL:
安装命令如下:
yum -y install openssl-devel
(2) 安装APR组件:
第一步: 下载apr与apr-util安装包:
下载地址: http://apr.apache.org/download.cgi. 这里下载apr-1.6.3.tar.gz和apr-util-1.6.1.tar.gz, 然后将安装包上传至服务器, 这里上传至/usr/local目录下.第二步: 安装apr:
cd /usr/local
tar -zxf apr-1.6.3.tar.gz
cd apr-1.6.3
# 配置安装路径
./configure --prefix=/usr/local/apr
# 编译安装
make
make install
第三步: 安装apr-util:
cd /usr/local
tar -zxf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1
# 配置安装路径
./configure --prefix=/usr/local/apr-util--with-apr=/usr/local/apr
# 编译安装
make
make install
错误提示:
可能出现gcc依赖没有安装的错误, 可通过
yum install gcc命令安装.如果make过程中出错, 解决错误后重新安装前需要执行清理:
make clean, 然后再次尝试make及make install过程.如果抛出
xml/apr_xml.c:35:19: error: expat.h: No such file or directory, 说明缺少了expat库, 可执行下属命令安装:yum install expat-devel.第四步: 配置环境变量:
上面安装完后设置下环境变量:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib或者, 将/usr/local/apr/lib包路径添加到/etc/ld.so.conf文件中:
echo "/usr/local/apr/lib" >> /etc/ld.so.conf
(3) 安装tomcat-native组件:
tomcat-native组件可以看作是Tomcat与APR交互的中间环节.
第一步: 下载并解压native安装包:
前往
${TOMCAT_HOME}/bin目录下找到tomcat-native.tar.gz, 也可前往官网(http://tomcat.apache.org/download-native.cgi)下载其他版本, 推荐使用Tomcat自带的版本, 兼容性有更大保证.解压tomcat-native组件并安装, 或上传自己下载的native组件至服务器后, 再执行下述过程:
cd /usr/local/tomcat/bin/
tar -zxf tomcat-native.tar.gz
cd tomcat-native-1.2.14-src/native/
注意: 1.1.x版本中的目录是tomcat-native-1.1.x-src/jni/native.
第二步: 安装组件:
# 配置安装参数, 其中java-home可使用默认环境变量中的配置
./configure --with-apr=/usr/local/apr --with-ssl=yes
make
make install
(4) Tomcat整合APR:
第一步: 修改启动脚本
catalina.sh:
在${TOMCAT_HOME}/bin/catalina.sh文件的cygwin=false前(110行左右)加入下述启动参数:JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"
第二步: 修改容器配置文件server.xml:
查看
${TOMCAT_HOME}/conf/server.xml文件, 确保如下监听器没有被注释掉:<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
修改Connector选项:
<Connector port="8443"
protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" >
</Connector>
(5) 验证配置是否成功:
启动Tomcat, 在 ${TOMCAT_HOME}/logs/catalina.out 文件中查看日志信息:
如果出现下述内容, 说明APR组件安装不成功:
Sep 14, 2018 19:11:20 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:...
如果出现下述内容, 说明APR组件安装成功:
Sep 14, 2018 19:19:47 PM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.27 using APR version 1.6.3.
Sep 14, 2018 19:19:47 PM org.apache.catalina.core.AprLifecycleListener init
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
Sep 14, 2018 19:19:47 PM org.apache.catalina.core.AprLifecycleListener initializeSSL
INFO: OpenSSL successfully initialized (OpenSSL 1.0.1e-fips 11 Feb 2013)
Sep 14, 2018 19:19:47 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-apr-8080"]
Sep 14, 2018 19:19:47 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-apr-8009"]
Tomcat通过APR模式成功启动:
Sep 14, 2018 19:19:56 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-apr-8986"]
Sep 14, 2018 19:19:56 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-apr-8915"]
Sep 14, 2018 19:19:56 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 9421 ms
3 配置AJP连接器
AJP(Apache JServer Protocol)是为 Tomcat 与 HTTP 服务器之间通信而定制的协议, 能提供较高的通信速度和效率.
与案例说明: AJP v13 协议是面向包的, Web服务器和Servlet容器通过TCP连接来交互, 为了节省 创建Socket的昂贵代价, Web服务器会尝试维护一个永久的TCP连接到Servlet容器, 并在多个请求与响应周期过程内重用该TCP连接.
如果使用Apache架构, 就要用AJP连接器, 当Apache接收到动态网页请求时, 通过在配置中指定的端口号将请求发送给在此端口号上监听的AJP连接器组件.
如果不使用Tomcat + Apache, 而是用其他架构, 如Tomcat + Nginx, 就需要注销掉该连接器.
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />  -->
参考资料
版权声明
作者: 马瘦风
出处: 博客园 马瘦风的博客
您的支持是对博主的极大鼓励, 感谢您的阅读.
本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.
Tomcat 8.0的并发优化 - 优化server.xml的配置的更多相关文章
- Tomcat server.xml UTF-8配置
		
Tomcat server.xml UTF-8配置 <Connector port="8080" maxThreads="150" minSpareThr ...
 - web服务器专题:tomcat(二)模块组件与server.xml 配置文件
		
web服务器专题:tomcat(二)模块组件与server.xml 配置文件 回顾: Web服务器专题:tomcat(一) 基础模块 一个Server.xml的实例 <?xml version= ...
 - Unable to load configuration. - action - file:/C:/Program%20Files/Apache%20Software%20Foundation/Tomcat%209.0/webapps/Teacher04/WEB-INF/classes/struts.xml:9:54
		
发布一个struts2项目的时候tomcat显示下面这个错误,我的本能感觉就是我的struts.xml或者web.xml写错了,可是我字母找都没发现,于是百度一番,可是我对那些人的回答表示怀疑,感觉应 ...
 - tomcat中的server.xml文件配置了URIEncoding="UTF-8"需要注意的问题
		
1. get请求传递中文时本地连正式库访问都正常,正式环境下单独访问报错 代码: 请求:project/projectInfo/export/?cks=’项目类型 public String ...
 - tomcat Server.xml Context配置
		
有时候需要在tomcat里面做特殊的配置,来进行访问: 例如你的程序 名字是hello端口是80 这时候你要访问你的程序 就要用 localhost/hello 来访问了. 但是怎么直接用 loca ...
 - tomcat如何在server.xml中配置contexts
		
https://tomcat.apache.org/tomcat-8.5-doc/deployer-howto.html#A_word_on_Contexts 例如你的程序 名字是hello端口是80 ...
 - Tomcat server.xml常用配置  含有外带文件及默认host
		
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE server-xml [<!ENTITY ...
 - tomcat访问manager报404;server.xml中配置了Context path
		
<Context path="" docBase="crm" debug="0" reloadable="true" ...
 - tomcat中server.xml各项配置详解
		
详见大佬的文章,乐于做大佬文章的搬运工. http://www.cnblogs.com/starhu/p/5599773.html
 
随机推荐
- Rafy 领域实体框架简介
			
按照最新的功能,更新了最新版的<Rafy 领域实体框架的介绍>,内容如下: 本文包含以下章节: 简介 特点 优势 简介 Rafy 领域实体框架是一个轻量级 ORM 框架. 与一般的 ORM ...
 - shell脚本头,#!/bin/sh与#!/bin/bash的区别.
			
因为今天写了个小脚本,死活不成功,总是报文件或者目录不存在,问了一下我们马同学的正常写法,发现只有脚本头的区别,也就是今天本文要讲的#!/bin/sh与#!/bin/bash. 本文参考:https: ...
 - cross-env 兼容跨平台运行脚本
			
https://www.npmjs.com/package/cross-env 跨平台运行脚本 The problem Most Windows command prompts will choke ...
 - python3 爬去QQ音乐
			
import requests import re import json import os def get_name(singer): url = 'https://c.y.qq.com/soso ...
 - 如何识别企业内的“千里马”?
			
很多企业主都在感叹无法找到合适的优秀管理人才,却忽视了一条获得管理人才的捷径:内部培养.在员工中挑选具有领导潜质的人才,加以培养,必成企业栋梁,而且这样选拔的人才与企业的契合度.忠诚度方面都相对较高. ...
 - SVN使用指引(Windows)
			
SVN使用指引(本地服务器为Windows) 原:http://wiki.open.qq.com/wiki/SVN%E4%BD%BF%E7%94%A8%E6%8C%87%E5%BC%95%EF%BC% ...
 - Spring Webflux: Kotlin DSL [片断]
			
原文链接:https://dzone.com/articles/spring-webflux-kotlin-dsl-snippets 作者:Biju Kunjummen 译者:Jackie Tang ...
 - 为什么选择Spring Boot作为微服务的入门级微框架
			
摘要:1. Spring Boot是什么,解决哪些问题 1) Spring Boot使编码变简单 2) Spring Boot使配置变简单 3) Spring Boot使部署变简单 4) Spring ...
 - 在JavaWeb项目中URL中字符串加密解密方案
			
URL由来: 一般来说,URL只能使用英文字母.阿拉伯数字和某些标点符号,不能使用其他文字和符号.比如,世界上有英文字母的网址 “http://www.abc.com”,但是没有希腊字母的网址“htt ...
 - mysql可视化工具下载地址2017.6.27
			
https://www.baidu.com/s?tn=90117497_hao_pg&usm=1&wd=navicat+for+mysql&ie=utf-8&rsv_r ...