tomcat 性能调优

2023-06-30

本文主要是 tomcat 性能调优 相关的知识问答,如果你也了解,请帮忙补充。

参考知识1 java性能优化原则:代码运算性能 内存回收 应用配置(影响java程序注意原因是垃圾回收)

代码层优化:避免过多的循环嵌套 调用和复杂逻辑

Tomcat调优主要内容

1.增加最大连接数

2.调整工作模式

3.启用gzip压缩

4.调整JVM内存大小

5.作为web服务器时 与Apache整合或Nginx

6.合理选择垃圾回收算法

7.尽量使用较新版的JDK

生产环境实例

<connector p=""

maxThreads="1000"

minSpareThreads="100"

maxSpareThreads="200"

acceptCount="900"

disableUploadTimeout="true"

connectionTimeout="20000"

URIEncoding="UTF-8"

enableLookups="false"

redirectPort="8443"

compression="on"

compressionMinSize="1024"

compressableMimeType="text/html,text/xml,text/css,text/javascript"/>

参数说明:

org.apache.coyote.http11.Http11NioProtocol:调整工作模式为Nio

maxThreads:最大线程数,默认150。增大值避免队列请求过多,导致响应缓慢。

minSpareThreads:最小空闲线程数

maxSpareThreads:最大空闲线程数,如果超过这个值,会关闭无用的线程。

acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。

disableUploadTimeout:禁用上传超时时间

connectionTimeout:连接超时,单位毫秒,0代表不限制

URIEncoding:URI地址编码使用UTF-8

enableLookups:关闭dns解析,提高响应时间

compression:启用压缩功能

compressionMinSize:最小压缩大小,单位Byte

compressableMimeType:压缩的文件类型

Tomcat的三种工作模式: Bio、Nio和Apr 工作原理分别为

Bio(Blocking I/O):默认工作模式 阻塞式I/O操作 没有任何优化技术处理 性能比较低

Nio(New I/O or Non-Blocking):非阻塞式I/O操作 有BIO更好的并发处理性能

Apr(apache portable runtime,apache可移植运行库):首选工作模式 主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库

Tomcat利用基于APR库Tomcat-native来实现操作系统级别控制 提供一种优化技术和非阻塞式I/O操作 大大提高并发处理能力

但是需要安装APR和Tomcat-native库

Java性能问题主要来自于jvm jvm GC也比较复杂

1、jvm内存划分为年轻代(Young Generation)、年老代 Old Generation)、永久代(Permanent Generation)

2、年轻代又分为Eden和Survivor区。Survivor区由FromSpace和ToSpace组成。Eden区占大容量,Survivor两个区占小容量,默认8:2

3、堆内存Heap=年轻代+年老代 非堆内存=永久代

4、堆内存用途:存放的是对象 垃圾收集器就是收集这些对象的 然后根据GC算法回收

5、非堆内存用途:JVM本身使用 存放一些类型 方法 常量 属性等

6、年轻代:新生成的对象首选放到年轻代的E区中 当E区满时 经过GC后 还存活的对象被复制到Survivor区的FromSpace中 如果survivor区满

会再被复制到survivor区的ToSpace区 如果还有存活的对象 会再被复制到老年代

7、老年代:在年轻代中经过GC后还存活的对象会被复制到老年代中 当老年代空间不足时 jvm会对老年代进行完全的垃圾回收(Full GC)

如果GC后 还是无法存放从survivor区复制过来的对象 就会出现OOM

8、永久代:也称为方法区 存放静态类型数据 比如类 方法 属性等

垃圾回收算法

1、标记 清除

2、复制

3、标记 整理

垃圾收集器

单线程/多线程收集器

GMS收集器

JAVA_OPTS="-server -Xms1024m -Xmx1536m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParallelGCThreads=8 XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -Xloggc:../logs/gc.log"

参数 描述

-Xms 堆内存初始大小 单位M、G

-Xmx 堆内存最大允许大小 一般不要大于物理内存的80%

-XX:PermSize 非堆内存初始大小 一般应用设置初始化200M 最大1024M就够了

-XX:MaxPermSize 非堆内存最大允许值

-XX:+UseParallelGCThreads=8 并行收集器线程数 同时有多少个线程进行垃圾回收 一般与CPU数量相等

-XX:+UseParalle101dGC 指定老年代为并行收集

-XX:+UseConcMarkSweepGC CSM收集器

-XX:+UseCMSCCompactAtFullCollection 开启内存空间压缩和整理 防止过多内存碎片

-XX:CMSFullGCsBeforeCompaction=0 表示多少次Full GC后开始压缩和整理 0表示每次Full GC后立即执行压缩和整理

-XX:CMSInitiatingOccupancyFracetion=80% 表示老年代内存空间使用80%时开始执行CMS收集 防止过多的Full GC

注意:不是jvm内存设置越大越好 具体还是根据项目对象实际占内存大小而定 可以通过java自带的分析工具来查看

如果设置过大 会增加回收实际 从而增加暂停应用时间

gzip压缩作用:节省服务器流量和提高网站访问速度 客户端请求服务器资源后 服务器将资源文件压缩 再返回给客户端 有客户端的浏览器负责压缩并浏览

Apache和Tomcat结合

由于Tomcat处理静态文件能力远远不足Apache 所有用Apache处理静态文件 Tomcat负责处理jsp

session会话的保持

TomcatSessionID持久化三种方法

session粘性:通过浏览器cookie绑定sessionID 通过sticky模式将同一session请求分片到同一Tomcat上

session复制:tomcat通过广播形式将session同步到其它Tomcat节点 并且Linux下要手动开启开放广播地址 不宜后端节点过多

session保持数据库(memcache redis):将sessionID保存在共享的数据库中

OOM异常的几个原因

老年代内存不足:java.lang.OutOfMemoryError:Javaheapspace

永久代内存不足:java.lang.OutOfMemoryError:PermGenspace

代码bug 占用内存无法及时回收
相似知识
Spark性能调优篇七之JVM相关参数调整 参考知识1        由于Spark程序是运行在JVM基础之上的,所以我们这一篇来讨论一下关于JVM的一些优化操作。
什么时候才用的到jvm调优,为什么要调优,有人能指教一下吗 JVM是最好的软件工程之一,它为Java提供了坚实的基础,许多流行语言如Kotlin、Scala、Clojure、Groovy都使用JVM作为运行基础。一个专业的Java工程师必须要了解并掌握JVM,
Flink性能调优(一) 参考知识1Flink是依赖内存计算,计算过程中内存不够对Flink的执行效率影响很大。可以通过监控GC(GarbageCollection),评估内存使用及剩余情况来判断内存是否变成性能瓶颈,并根据情
2022-02-24-Spark-44(性能调优通用调优) 参考知识1计算负载主要由Executors承担,Driver主要负责分布式调度,调优空间有限,因此对Driver端的配置项我们不作考虑通过如下参数就可以明确有多少CPU资源被划拨给Spark用于分布式
JVM性能调优-G1 参考知识1本篇是对Java官网G1收集器调优的精简版。针对G1垃圾的收集阶段可能出现的问题,非合理内存分配,大对象占用,FullGC等问题作出解决方式和操作参数。G1是一个吞吐量和时间延迟之间相互平衡
JVM性能调优指南(一) 参考知识1-help-server-client-version-showversion-cp-classpath调整为完全解释执行编译模式:调整为编译执行编译模式:最后一行的mixedmode表明J
2022-02-26-Spark-46(性能调优SparkUI) 参考知识1ExecutorsTab的主要内容如下,主要包含“Summary”和“Executors”两部分。这两部分所记录的度量指标是一致的,其中“Executors”以更细的粒度记录着每一个Exec
jvm性能调优都做了啥 JVM是最好的软件工程之一,它为Java提供了坚实的基础,许多流行语言如Kotlin、Scala、Clojure、Groovy都使用JVM作为运行基础。一个专业的Java工程师必须要了解并掌握JVM,