降落相应韶光 : 提高系统吞吐量(QPS) : QPS (每秒要求量) T(事务) PS (每秒处理事务的数量) 提高做事的可用性:
性能优化的原则
详细情形详细剖析集腋成裘
性能剖析工具
JConsole jvm性能监控平台: 紧张监控 内存和CPU的情形JMeter 分布式性能测试工具: 相应韶光、吞吐量、缺点率
性能优化测试指标

精确率、CPU霸占率、QPS、JVM
3.1 Tomcat 性能测试
我们利用JMeter来进行测试:
3.2 Tomcat 性能优化3.2.1Tomcat配置调优1.禁用AJP连接默认状态下,Tomcat会启动AJP做事,占用8009端口。AJP是什么?有什么浸染呢?AJP(Apache JServer Protocol) 是为Tomcat与HTTP做事器之间通信而定制的协议,能供应较高的通信速率和效率。Tomcat虽然是一个javaWeb做事器,可以对静态资源进行解析,但它最紧张的浸染是供应Servlet 和 Jsp容器,对静态资源的解析肯定不如一些专业的Http做事器 如:apache、nginx 。以是常日生产环境会把Tomcat和其他http做事器搭配利用, 所有要求都访问http做事器,如果访问的资源是Servlet或Jsp则http做事器将要求交由Tomcat处理,如果静态资源 http做事器直接处理, ajp便是apache做事器和tomcat做事器通信的紧张协议,nginx 和 浏览器是不支持这个协议的,以是如果你不该用Tomcat和Apache做事器整合的话,这个AJP协议做事是没必要开启的。
ajp便是下面这行代码来配置,紧张注释它就可以禁用AJP
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
2.Connector 连接器的选择
Tomcat 连接器的三种办法: bio、nio 和 apr,三种办法性能差别很大,apr 的性能最优, bio 的性能最差。而 Tomcat 7 利用的 Connector 默认就启用的 Apr 协议,但须要系统安装 Apr 库,否则就会利用 bio 办法。
BIO:
一个线程处理一个要求。缺陷:并发量高时,线程数较多,摧残浪费蹂躏资源。
Tomcat7或以下,在Linux系统中默认利用这种办法。
NIO:
利用Java的异步IO处理,可以通过少量的线程处理大量的要求。
Tomcat8在Linux系统中默认利用这种办法。
Tomcat7必须修正Connector配置来启动:
APR:
即Apache Portable Runtime,从操作系统层面办理io壅塞问题。
Tomcat7或Tomcat8在Win7或以上的系统中启动默认利用这种办法。
Linux如果安装了apr和native,Tomcat直接启动就支持apr。
tomcat8 供应了nio2,效率要比nio快些,以是如果是tomcat8之前的版本推举利用nio ,如果是tomcat8及之后的版本利用nio2
APR( Apache Portable Runtime) 供应卓越的伸缩性,更强的性能以及跟原生做事器技能更好的集成。
如果利用APR要担保1.配置文件中引入了APR的监听 2.做事器上安装APR的干系软件
linux配置APR:
安装依赖
yum install apr-devel yum install openssl-devel yum install gcc yum install make
安装APR包
进入 apache-tomcat-8.5.39/bin 实行命令 tar -xzvf tomcat-native.tar.gz
输入命令 cd tomcat-native-1.2.21-src/native/
进入到native文件夹下
实行命令 ./configure && make && make install
安装后会涌现这个界面,表示安装成功,并给出了安装后的目录位置
通过上图我们可以看到 我们还须要配置两个环境变量
输入命令使环境变量生效 source /etc/profile
修正server.xml 配置
启动tomcat查看日志
进入到 /logs目录 实行命令 tail -f -n 200 catalina.out
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" connectionTimeout="20000" redirectPort="8443"/>
Connector参数阐明
URIEncoding:指定 Tomcat 容器的 URL 编码格式,措辞编码格式这块倒不如其它 WEB 做事器软件配置方便,须要分别指定。
口试可以说:设置连接超时时间,当后台涌现问题,连接可以及时断掉
connnectionTimeout: 网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。常日可设置为 30000 毫秒(30秒),可根据检测实际情形,适当修正。
enableLookups: 是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为false,则直接返回IP地址,为了提高处理能力,应设置为 false。
disableUploadTimeout:上传时是否利用超机遇制。
connectionUploadTimeout:上传超时时间,毕竟文件上传可能须要花费更多的韶光,这个根据你自己的业务须要自己调,以使Servlet有较长的韶光来完成它的实行,须要与上一个参数一起合营利用才会生效。
acceptCount:指定当所有可以利用的处理要求的线程数都被利用时,可传入连接要求的最大行列步队长度,超过这个数的要求将不予处理,默认为100个。
keepAliveTimeout:长连接最大保持韶光(毫秒),表示不才次要求过来之前,Tomcat 保持该连接多久,默认是利用 connectionTimeout 韶光,-1 为不限定超时。
maxKeepAliveRequests:表示在做事器关闭之前,该连接最大支持的要求数。超过该要求数的连接也将被关闭,1表示禁用,-1表示不限定个数,默认100个,一样平常设置在100~200之间。
口试可以说压缩:连接器参数开启相应数据压缩
compression:是否对相应的数据进行 GZIP 压缩,off:表示禁止压缩;on:表示许可压缩(文本将被压缩)、force:表示所有情形下都进行压缩,默认值为off,压缩数据后可以有效的减少页面的大小,一样平常可以减小1/3旁边,节省带宽。compressionMinSize:表示压缩相应的最小值,只有当相应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值便是2048KB。compressableMimeType:压缩类型,指定对哪些类型的文件进行数据压缩。
noCompressionUserAgents="gozilla, traviata": 对付以下的浏览器,不启用压缩。
参考配置
连接器的详细参考配置: <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" connectionTimeout="30000" enableLookups="false" disableUploadTimeout="false" connectionUploadTimeout="150000" acceptCount="300" keepAliveTimeout="120000" maxKeepAliveRequests="1" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png" redirectPort="8443" />
3.Executor线程池调度
默认配置下,Tomcat 会为每个连接器创建一个绑定的线程池(最大线程数 200),做事启动时,默认创建了 5 个空闲线程随时等待用户要求
默认情形:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/>
修正连接池:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="100" maxSpareThreads="50" maxIdleTime="60000"/>机器比较好情形:最小线程数不超过<100,最大线程数不超过<500
然后,修正<Connector …>节点,增加 executor 属性,调度为
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" connectionTimeout="20000" redirectPort="8443"/>
Executor参数阐明:
maxThreads,最大并发数,默认设置 200,一样平常建议在 500 ~ 800,根据硬件举动步伐和业务来判断minSpareThreads,Tomcat 初始化时创建的线程数,默认设置 25prestartminSpareThreads,在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不即是 true,minSpareThreads 的值就没啥效果了maxQueueSize,最大的等待行列步队数,超过则谢绝要求
3.2.2 JVM参数调优Tomcat是一款Java运用,那么JVM的配置便与其运行性能密切干系,而JVM优化的重点则集中在内存分配和GC策略的调度上,由于内存会直接影响做事的运行效率和吞吐量,JVM垃圾回收机制则会不同程度地导致程序运行中断。可以根据运用程序的特点,选择不同的垃圾回收策略,调度JVM垃圾回收策略,可以极大减少垃圾回收次数,提升垃圾回收效率,改进程序运行性能。
1) JVM内存参数参数
参数浸染
优化建议
-server
启动Server,以做事端模式运行
做事端模式建议开启
-Xms
最小堆内存
建议与-Xmx设置相同
-Xmx
最大堆内存
建议设置为可用内存的80%
-XX:MetaspaceSize
元空间初始值
-XX:MaxMetaspaceSize
元空间最大内存
默认无限
-XX:NewSize
新生代初始值
-XX:MaxNewSize
新生代最大内存
默认16M
-XX:NewRatio
年轻代和老年代大小比值,取值为整数,默认为2
不建议修正
-XX:SurvivorRatio
Eden区与Survivor幸存者区大小的比值,取值为整数,默认为8
不建议修正
-Xms:Java虚拟机初始化时堆的最小内存,一样平常与 Xmx配置为相同值,这样的好处是GC不必再为扩展内存空间而花费性能;
可以利用JDK自带的工具进行验证,这些工具都在/bin目录下:1)jps:用来显示本地的java进程,以及进程号,进程启动的路径等。2)jmap:不雅观察运行中的JVM 物理内存的占用情形,包括Heap size , Perm size等。进入命令行模式后,进入JAVA_HOME/bin目录下,然后输入jps命令:
free -m 命令查看当前做事器的可用内存JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:SurvivorRatio=8"
2) GC策略
JVM垃圾回收性能有以下两个紧张的指标:
吞吐量:事情韶光(打消GC韶光)占总韶光的百分比, 事情韶光并不仅是程序运行的韶光,还包含内存分配韶光。停息韶光:测试韶光段内,由垃圾回收导致的运用程序停滞相应次数/韶光。不同的运用程序, 对付垃圾回收会有不同的需求。 JVM 会根据运行的平台、做事器资源配置情形选择得当的垃圾网络器、堆内存大小及运行时编译器。如无法知足需求, 参考以下准则:
A. 程序数据量较小,选择串行网络器。
B. 运用运行在单核处理器上且没有停息韶光哀求, 可交由JVM自行选择或选择串行网络器。
C. 如果考虑运用程序的峰值性能, 没有停息韶光哀求, 可以选择并行网络器。
D. 如果运用程序的相应韶光比整体吞吐量更主要, 可以选择并发网络器。
查看Tomcat中的默认的垃圾网络器:
1). 在tomcat/bin/catalina.sh的配置中, 加入如下配置
JAVA_OPTS=" -Djava.rmi.server.hostname=192.168.18.129 -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.rmi.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
2). 打开 jconsole , 查看远程的tomcat的概要信息
连接远程tomcat
GC参数:
参数
描述
-XX:+UseSerialGC
启用串行网络器
-XX:+UseParallelGC
启用并行垃圾网络器,配置了该选项,那么 -XX:+UseParallelOldGC默认启用
-XX:+UseParallelOldGC
FullGC 采取并行网络,默认禁用。如果设置了 -XX:+UseParallelGC则自动启用
-XX:+UseParNewGC
年轻代采取并行网络器,如果设置了 -XX:+UseConcMarkSweepGC选项,自动启用
-XX:+ParallelGCThreads
年轻代及老年代垃圾回收利用的线程数。默认值依赖于JVM利用的CPU个数
-XX:+UseConcMarkSweepGC
并发垃圾网络器 对付老年代,启用CMS垃圾网络器。 当并行网络器无法知足运用的延迟需求是,推举利用CMS或G1网络器。启用该选项后, -XX:+UseParNewGC 自动启用。
-XX:+UseG1GC
启用G1网络器。 G1是做事器类型的网络器, 用于多核、大内存的机器。它在保持高吞吐量的情形下,高概率知足GC停息韶光的目标。
我们也可以在测试的时候,将JVM参数调度之后,将GC的信息打印出来,便于为我们进行参数调度供应依据,详细参数如下:
选项
描述
-XX:+PrintGC
打印每次GC的信息
-XX:+PrintGCApplicationConcurrentTime
打印末了一次停息之后所经由的韶光, 即相应并发实行的韶光
-XX:+PrintGCApplicationStoppedTime
打印GC时运用停息韶光
-XX:+PrintGCDateStamps
打印每次GC的日期戳
-XX:+PrintGCDetails
打印每次GC的详细信息
-XX:+PrintGCTaskTimeStamps
打印每个GC事情线程任务的韶光戳
-XX:+PrintGCTimeStamps
打印每次GC的韶光戳
在bin/catalina.sh的脚本中 , 追加如下配置 :
JAVA_OPTS="-XX:+UseConcMarkSweepGC -XX:+PrintGCDetails"
64位系统 centos 6.4 内存8G做事器 -server -Xms6000M -Xmx6000M -Xmn500M -XX:MetaspaceSize=500M -XX:MaxMetaspaceSize=500M -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0-Xnoclassgc-XX:+DisableExplicitGC-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:CMSInitiatingOccupancyFraction=80 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log
3.2.3 Tomcat架构调优
前面我们已经通过系统、jvm、和tomcat自身大大提升的tomcat的性能,但tomcat的性能是有极限的,Tomcat理论支持500旁边并发,以是接下来我们会聊聊在如何合理利用tomcat上,实际上也便是架构的 层面聊聊如果优化。这里面我们紧张谈论两个优化思路:动静分离、Tomcat集群
就须要搭建Tomcat的集群,而目前比较流程的做法便是通过Nginx来实现Tomcat集群的负载均衡。
动静分离:
Tomcat紧张处理servlet、jsp占上风,项目中静态资源(图片、视频、.CSS、.html、.js)访问,耗费要求连接,把静态资源放在Nginx做事器中,静态要求不经由Tomcat,不占并发数。
Nginx是一款自由的、开源的、高性能的HTTP做事器和反向代理做事器;同时也是一个IMAP、POP3、SMTP代理做事器;Nginx可以作为一个HTTP做事器进行网站的发布处理,其余Nginx可以作为反向代理进行负载均衡的实现。优点:1、可以高并发连接官方测试Nginx能够支撑5万并发连接,实际生产环境中可以支撑2~4万并发连接数。2、内存花费少Nginx+PHP(FastCGI)做事器,在3万并发连接下,开启10个Nginx进程花费150MB内存,15MB10=150MB,开启的64个PHP-CGI进程花费1280内存,20MB64=1280MB,加上系统自身花费的内存,统共花费不到2GB的内存。 3、本钱低廉购买F5BIG-IP、NetScaler等硬件负载均衡交流机,须要十多万到几十万公民币,而Nginx为开源软件,采取的是2-clause BSD-like协议,可以免费试用,并且可用于商业用场。4、配置文件非常大略网络和程序一样普通易懂,纵然,非专用系统管理员也能看懂。5、内置的康健检讨功能如果NginxProxy后真个某台Web做事器宕机了,不会影响前真个访问。6、节省带宽支持GZIP压缩,可以添加浏览器本地缓存的Header头。7、稳定性高用于反向代理,宕机的概率微乎其微。8、支持热支配Nginx支持热支配,它的自动特殊随意马虎,并且,险些可以7天24小时不间断的运行,纵然,运行数个月也不须要重新启动,还能够在不间断做事的情形下,对软件版本进行升级。
Nginx反向代理配置:
Tomcat集群:
大佬参考地址:https://www.cnblogs.com/liaokailin/p/3968891.html
修正Tomcat默认端口号tomcat默认的端口号(缺省端口),怎么修正
tomcat默认的端口是8080
修正Server.xml中 Connector的port属性即可,
如果同一个tomcat要启动多个tomcat ,还须要修正Server里面的port端口 以及Connector AJP协议的port端口
<Server port="8006" shutdown="SHUTDOWN"><Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" redirectPort="8443" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
tomcat中支配项目的办法
支配的三种方案:
1.直接将web项目 或 war包 拷贝至webapps目录下即可:
2.在配置文件Server.xml中找到标签,在里面 加高下面一句:
<Context docBase="项目的路径" path="虚拟目录" />
3.conf/Catalina/localhost 创建 xxx.xml文件,在文件中指定项目路径,该项目的访问路径 即文件的名字
<Context docBase="项目的路径" />
PS:ROOT文件夹内是根目录下的项目,访问该项目不须要加虚拟目录
tomcat中运行的生产项目,涌现问题如何排查?
涌现问题首先去tomcat的logs目录下,查看日志文件中有没有什么缺点信息。
catalina.201X-XX-XX.log记录启动时日志信息
localhost.201X-XX-XX.log记录各个webapp下项目的日志信息
tail -f fileName #会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。
如:日志中创造
java.lang.StackOverflowError非常,这个是栈内存溢出
可能在哪些地方发生内存泄露了,如果通过非常能够找到溢出的发生地,则优化对应代码。
如果没有创造,则可以通过 JvisualVM 等工具监控Tomcat的运行情形
学习更多JAVA知识与技巧,关注与私信博主(学习)免费学习领取JAVA 课件,源码,安装包,还有最新
大厂口试资料等等等