分布式架构 Tomcat优化
Tomcat 模式策略
Tomcat优化简介
1.Tomcat默认配置已优化过,主要根据业务场景调整其内存配置,需要JVM基础,本 文不在阐述,合理分配Tomcat内存,优化 Tomcat启动设置catalina.sh中的 JAVA_OPTS,常见参数如下
- -server :启动JDK的Server版 -Xms:虚拟机初始化最小内存
-Xmx:虚拟机可使用最大内存(建议物理内存80%)
-Xmn:新生代内存,一般设置为Xmx的3、4分之一
-XX:PermSize:持久带初始值
-XX:MaxPermSize:持久带最大内存(默认32M)
-XX:MaxNewSize:新生代最大内存(默认16M)
-Xss1024k 设置线程大小
-XX:+HeapDumpOnOutOfMemoryError ,系统发生内存溢出,生产dump文件
-XX:-OmitStackTraceInFastThrow 强制要求JVM始终抛出含堆栈的异常
-XX:-+DisableExplicitGC 禁止system.gc
-XX:SurvivorRatio Eden区域和Survivor区域占比,如等于8,8:1:1
参数说明:
- 正常情况设置-Xms、-Xmx相等避免每次GC后调整堆大小,因默认空余堆内存小于40%时,JVM会增大堆直到-Xmx的最大限制,空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制
- 查看堆内存是否生效,jmap -heap tomcat进程号
2.Tomcat本身配置优化,server.xml中配置端口 配置
- 1.maxConnections 最大连接数,对于BIO模式默认等于maxThreads,对于NIO模式默认10000,对于APR/native 默认是8192
- 2.maxThreads 最大线程数,即同时处理任务个数,默认是200
- 3.acceptCount 当处理任务线程数达到最大时,接收队列请求个数,默认是100
- 4.maxQueueSize: 最大的等待队列数,超过则拒绝请求
- 5.maxHttpHeaderSize:默认4K,http请求响应的Header的最大限制,(Nginx/F5由于Http头部小而导致出现400问题)
- 6.maxPostSize:设置由容器解析的URL参数的最大长度,-1(小于0)为禁用这个属性,默认为2097152(2M),0是不限制。nginx-设置client_max_body_size,0不限制,Jetty–》200K
- 7.compression:启用gzip压缩
- 8.noCompressionUserAgents:排除浏览器
- 9.compressionMinSize:超过这个大小进行压缩,默认2048(2k)
- 10.compressableMimeType:需要压缩的response类型,根据情况设置
- 11.URIEncoding :Tomcat在解析参数的时候(UTF-8)去解码,默认ISO-8859-1
- 12.connectionTimeout 网络连接超时,单位毫秒,设置-1永不超时
3. 单台Tomcat优化到瓶颈后,搭建Tomcat集群,组合提供外界服务
优化说明:
可参考官网 https://tomcat.apache.org/tomcat-8.0-doc/config/http.html#NIO2_specific_configuration
- 如果要加大并发连接数,应该同时增大maxThreads和acceptCount,建议设置一样
- WebServer允许最大连接数还受限于操作系统内核参数,通过 ulimit -a 查看(open files默认1024)
- protocol 有三种模式BIO/NIO/APR,参考顶部上图
BIO 最稳定最老一种连接器,采同步阻塞方式,每个线程绑定每个http请求,直到http请求响应返回,如果http客户端请求是keep-alive
连接一直保持直到到达timeout超时,期间不能用于其它请求处理。综合性能较低
NIO是java的同步非阻塞I/O技术
NIO2是java-jdk1.7以后推出异步非阻塞I/O技术
APR是是C语言编写的非阻塞I/O,需要安装apr和native,安装启动后支持,大幅度可以提高性能
安装如下
http://apr.apache.org/download.cgi下载
进入cd apr-1.5.0/
./configura --prefix=/usr/local/apr
make、make install
安装apr-iconv
进入cd apr-iconv-1.5.3/
./configura --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr
make、make install
安装apr-util
进入cd apr-util-1.5.3/
./configura --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-iconv=/usr/local/apr-iconv/bin/apriconv
make、make install
安装tomcat-native,tomcat-bin下自带
tar zxvf tomcat.native.tar.gz
cd tomcat-native-1.1.29-src/jni/native
./configura --with-apr=/usr/local/apr
make、make install
安装完毕后设置apr环境变量
进入tomcat-bin,打开catalina.sh 在文件的#!/bin/sh添加内容,不会破坏tomcat其它环境配置,如下:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib export LD_LIBRARY_PATH
设置protocol 为apr模式后启动tomcat,可以查看日志
init Load APR based Apache Tomcat Native…
笔者本地通过3种模式多次测试,结果如下
./ab -n1000 -c100 http://localhost:8080/demo/query
BRO / NIO / NIO2 /APR
400 450 570 600
扩充Tomcat集群知识
多个Tomcat之间组合一起,协同完成工作,要做集群面临http session等问题,如何在多个Tomcat都有效?
-
使用Tomcat自带cluster方式,多个tomcat之间实时复制session信息,优点:配置简单,缺点:并发情况效率低
利用前端代理服务器某些策略,比如Nginx基于IP的HASH路由策略,保证相同IP从始至终路由到同一个Tomcat上,优点:配置简单,缺点: 容易造成热点访问,存在单点风险。
多个同个局域网公网IP发起请求可能都会访问到TC1,一旦TC1挂掉,Session数据会丢失 -
Tomcat的session集中管理,存储到公有缓存中如:redis,前端利用Nginx做负载均衡,优点:系统可以进行水平扩展,同时可保证较高的性能,目前比较成熟 spring-session运用此原理
笔者推荐使用第二种,稳定性能高
总结:
Tomcat优化,分为两方面,jvm参数调优、Tomcat运行模式及参数调优。针对不同系统调整相关参数后需要进行压力测试,找到稳定峰值平衡点。
笔者建议 优化顺序
1.优化单台
2.单台瓶颈后,搭建集群多台提供外界服务
作者简介:张程 技术研究
更多文章请关注微信公众号:zachary分解狮 (frankly0423)