简介
Tomcat 请求处理流程
Tomcat 容器启动后,当有一个请求A进入时Tomcat会创建一个业务线程A去处理A的请求,当有一个请求B进入时会创建业务线程B处理请求。如果处理完成时业务线程就会回收。当请求太多的时候就会连接异常;所以优化第一个思路就是添加更多的业务线程,第二个是优化请求队列;
1. 线程池优化
线程池优化
参数 | 参数作用 | 建议优化 |
---|---|---|
maxConnections | 最大连接数 | 建议是系统允许的最大连接数 |
maxThreads | 最大线程数优化 | default 200,建议在500-700之间 |
acceptCount | 最大排队等待数 | 建议和最大线程数相同或者略低都可以 |
- maxConnections - 最大连接数
maxConnections 会受系统影响;Linux 可以通过ulimit -a 查看连接数(open files 就是系统最大连接数); 我们可以修改系统允许的最大连接数(etc/security/limits.conf 修改最大连接数);
soft nofiles 65535
hard nofiles 65535
-
添加maxConntions 的配置
2.1 如果CPU计算要求过高时,建议不需要配置过大(大数据spark)
2.2 如果CPU要求不是特别高时,建议配置(64G内存32核CPU)3000左右,配置后要做压力测试 -
配置地方(conf/server.xml)
<Connector port="80"
maxConntions="2000"
connectionTimeout="20000"
protocol="HTTP/1.1"
redirectPort="8443"
URIEncoding="UTF-8"/>
- maxThreads 最大线程数优化
默认值是200,建议500-700之间
<Connector port="80"
maxConntions="2000"
maxThreads="500"
connectionTimeout="20000"
protocol="HTTP/1.1"
redirectPort="8443"
URIEncoding="UTF-8"/>
- acceptCount 最大排队等待数
一个Tomcat 处理能力 = 最大线程数 + 最大排队等待数;
一般建议和最大线程数相同或者略低都可以
<Connector port="80"
maxConntions="2000"
maxThreads="500"
acceptCount="500"
connectionTimeout="20000"
protocol="HTTP/1.1"
redirectPort="8443"
URIEncoding="UTF-8"/>
2. Tomcat 内存优化
JVM 优化建议
参数 | 参数作用 | 优化建议 |
---|---|---|
-server | 启用Server | 服务器端建议开启 |
-Xms | 最小内存 | 建议与-Xmx相同 |
-Xmx | 最大内存 | 建议到可用内存的80% |
-XX:MetaspaceSize | 元空间初始值 | 建议和物理内存一致,也可以不用配置 |
-XX:MaxMetaspaceSize | 元空间最大内存 | 默认无限 |
-XX:MaxNewSize | 新生代最大内存 | 默认16M |
注意: MetaspaceSize,MaxMetaspaceSize 只有1.8 以上才有;
JVM 在bin/catalina.sh/bat 下
CATALINA_OPTS="-server -Xms1024m -Xms1024m -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -XX:MaxNewSize=512m"
注意:JAVA_OPTS 建议放在第一行;
可用通过java提供的jmap工具查看配置是否生效
jmap -heap 线程编号
3. 其他优化
Gzip 压缩网络参数,下载文件的时候压缩,保存传输效率更快,有三个重要参数:
- compression 是否开启Gzip 压缩;
- compressableMimeType 压缩类型;
- compressionMinSize 压缩后输出内容大小,默认是2048,2K;
Gzip 配置也是在conf目录下server.xml中的Connertor 中配置
<Connector URIEncoding="UTF-8"
connectionTimeout="20000"
port="80"
protocol="HTTP/1.1"
redirectPort="8443"
compression="true"
compressionMinSize="2048"/>
其他项配置
- enableLookups 开启反查域名
- connectionTimeout 网络连接超时阀值,默认是
- minSpareThreads 最小空闲线程数
<Connector URIEncoding="UTF-8"
connectionTimeout="20000"
port="80"
maxThreads="500"
minSpareThreads="100"
protocol="HTTP/1.1"
redirectPort="8443"
compression="true"
compressionMinSize="2048"/>
4. Tomcat 线程三种模式介绍
- BIO:最稳定最老的一个连接器,使用阻塞形式处理Request请求(Tomcat 7开始抛弃);
- NIO:使用Java的异步IO技术,进行非阻塞形式处理Request请求(Tomcat 8 默认);
- APR:原生C语言编写的非阻塞I/O,目前性能最理想。比NIO效率还高;
APR 安装步骤
APR 下载,需要下载APR,apr-util,apr-iconv 三个都需要下载; apr 安装需要依赖expat,expat-devel(yum install -y expat expat-devel)
安装顺序:先依赖包,然后apr,apr-iconv,apr-util;
apr 可以理解是tomcat 基础平台所以需要安装,类似JDK一样。有了JDK才能够开发;
-
apr 安装
1.1 解压至安装目录
1.2 ./configure -prefix=/user/local/apr
1.3 make
1.4 make install -
apr-iconv 安装
2.1 解压到安装目录
2.2 ./configure -prefix=/user/local/apr-iconv --with-apr=/user/local/apr
2.3 make
2.4 make install -
apr-util 安装
3.1 解压到安装目录
3.2 ./configure -prefix=/user/local/apr-util --with-apr=/user/local/apr --with-apr-iconv=/user/local/apr-iconv
3.3 make
3.4 make install -
Tomcat APR 配置
进入Tomcat bin目录下解压tomcat-native.tar.gz 进入native目录进行安装,安装指定apr目录,然后make & make install
./configure --with-apr=/user/local/apr
- 修改catalina.sh/catalina.bat
LD_LIBRARY_PATH 指定apr安装路径,这样是apr只在当前tomcat有效,apr安装默认是对所有生效
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/user/local/apr/lib export LD_LIBRARY_PATH
- 修改server.xml
protocol 修改为 Http11AprProtocol
<Connector URIEncoding="UTF-8"
connectionTimeout="20000"
port="80"
protocol="org.apache.coyote.http11.Http11AprProtocol"
redirectPort="8443"
compression="true"
compressionMinSize="2048"/>