《Tomcat架构解析》------学习笔记【Tomcat调优】

ps:感觉这一章满满的知识,所以记了大部分

Tomcat性能调优

主要有JVM优化Tomcat配置两个方面

一、JVM优化

JVM优化的重点集中在内存分配、GC策略调整上,因为JVM垃圾回收机制会不同程度地导致程序运行中断。选择不同的垃圾回收策略,调整JVM以及垃圾回收参数,可以极大地减少垃圾回收次数,提升垃圾回收效率,从而改善程序运行性能。

JVM垃圾回收性能主要有以下两个主要度量:

  1. 吞吐量:工作时间(排除GC时间)占总时间的百分比
  2. 暂停:测量时间段内,由垃圾回收导致的应用程序停止响应测次数。

 

JVM支持的性能相关选项(JDK8)【表格中红色字皆为具体数字值】

选项

描述

-Xmssize

初始堆的大。如不指定,初始化大小为分配的年轻代、老年代之和

-Xmxsize

最大堆内存。对于服务器端部署,-Xms和-Xmx经常设置为同一个值,这样可以节省程序运行过程中调整堆内存分配的耗时

-Xmnsize

年轻代的初始值及最大值,官方推荐该值为堆内存的1/4—1/2之间

-XX:NewSize=size

年轻代的初始值

-XX:MaxNewSize=size

年轻代的最大值

-XX:MetaspaceSize=size

元数据空间的初始值。持久代在JDK8被移除,因此-XX:PermSize禁用

-XX:MaxMetaspaceSize=size

分配用于类元数据的本地内存上限,默认不受限制。持久代在JDK8被移除,因此-XX:MaxPermSize禁用

-Xsssize

线程栈大小。默认值与平台相关【Linux/x64(64位):1024KB】

-XX:ThreadStackSize=size

等价于-Xss

-XX:NewRatio=ratio

设置年轻代与老年代的比值,取值为整数,默认:2

-XX:SurvivorRatio=ratio

Eden区与一个Survivor区的比值,取值为整数。默认:8

-XX:LargePageSizeInBytes=size

堆内存的内存页大小。默认:0,表示由JVM动态选择

-XX:+DisableExplicitGC

禁用System.gc。该参数只是禁止调用System.gc,但是在JVM需要时仍会执行垃圾回收

-XX:MaxTenuringThreshold=threshold

在新生代中对象经过MinorGC的次数达到threshold后仍然存活,就会晋升到旧生代,最大值是15.并行收集器的默认值15,CMS收集器默认值6

-XX:+AggressiveOpts

开启新的编译器性能优化选项,默认禁用实验性优化特征。实验性特征虽然会提高性能,但是会影响稳定性

-XX:+UseBiasedLocking

启用偏向锁,使得锁更偏爱上次使用到它的线程。在非竞争锁的场景下,即只有一个线程会被锁定对象,可以实现近乎无锁的开销

-Xnoclassgc

禁用类的垃圾回收,即类对象(Class)不会被回收

-XX:SoftRefLRUPolicyMSPerMB=time

每MB空闲堆内存中,SoftReference对象在最后一次引用后的存活时间(单位毫秒),默认1000,即1秒钟

-XX:MaxHeapFreeRatio=percent

垃圾回收之后,堆内存空闲空间最大允许百分比,超过该值,堆内存将收缩【该值越大à空闲空间越大à缩小堆空间】

-XX:MinHeapFreeRatio=percent

垃圾回收之后,堆内存空闲空间最大允许百分比,低于该值,堆内存将扩大【该值越小à空闲空间越小à扩大堆空间】

-XX:+ParallelRefProcEnabled

启用并行引用处理。如果应用存在大量的引用或者finalizable对象需要处理,添加该选项可以减少垃圾回收时间

-XX:TargetSurvivorRatio=percent

设定Survivor区的目标使用率

-XX:+UseGCOverheadLimit

限定JVM耗费在GC上的时间百分比,该选项默认启用,当JVM 98%时间用于垃圾回收并且少于2%的堆被恢复时,抛出内存溢出异常。当堆比较小时,该选项可以用于避免应用长时间没响应。可以通过-XX:-UseGCOverheadLimit禁用该选项

-XX:+UseSerialGC

启用串行收集器

 

针对并行垃圾收集器,还支持的性能选项

选项

描述

-XX:+UseParallelGC

启用并行垃圾收集器,以便利用多核提升性能。如果配置了该选项,那么-XX:+UseParallelOldGC默认开启

-XX:+UseParNewGC

年轻代采用并行收集,默认该选项禁用,但是如果设置了-XX:+UseConcMarkSweepGC选项,则会自动开启。对于只设置了-XX:+UseParNewGC,但是不设置-XX:+UseConcMarkSweepGC的情况,JDK8已经禁用

-XX:+UseParallelOldGC

Full GC 采用并行收集,默认禁用,如果这只了   -XX:+UseParallelGC则会自动启动

-XX:ParallelGCThreads = threads

年轻代和老年代并行垃圾回收使用的线程数。默认值依赖于JVM使用的CPU个数

-XX:MaxGCPauseMillis = time

垃圾回收最大暂停时间,单位毫秒。该选项仅是一个软目标,如不满足,JVM将会自动调整堆和相关选项

-XX:+UseAdaptiveSizePolicy

自动选择年轻代大小和相应的Survivor区比例,以达到目标系统规定的最低响应时间或者收集频率。该选项默认开启,若要禁用则需要添加-XX:-UseAdaptiveSizePolicy并且设置-XX:SurvivorRatio。对于并行收集器,建议打开该选项

 

 

 

CMS收集器性能相关选项

选项

描述

-XX:+UseConcMarkSweepGC

对于老年代,启用CMS垃圾收集器。当并行垃圾收集器无法满足应用的延迟需求时,官方推荐使用CMS或者G1收集器。

启用该选项后,-XX:+UseParNewGC自动启用,且无法禁用

-XX:+AggressiveHeap

启用Java堆内存优化。该选项设置各种参数以适用于运行时间长、内存分配密集的任务,基于内存和处理器配置。默认禁用

-XX:+UseCMSInitiatingOccupancyOnly

使用-XX:CMSInitiatingOccupancyFraction的值作为老年代的空间使用率限制来启动CMS垃圾回收。如果没有配置该选项,那么HotSpot VM 只利用这个值来启动第一次 垃圾回收,以后均用HotSpot VM 自动计算的值

-XX:CMSInitiatingOccupancyFraction=percent

设置老年代的占用百分比,当达到该值之后将启动CMS回收,格式为整数。默认-1.负数表示使用-XX:-CMSClassTriggerRatio确定初始的占用比

-XX:+CMSClassUnloadingEnabled

启用类鞋子,默认开启。可-XX:-CMSClassUnloadingEnabled禁用

-XX:+CMSScavengeBeforeRemark

在执行CMS remark 之前进行一个Minor GC ,能有效降低remark的时间

 

G1垃圾收集器支持的性能选项

选项

描述

-XX:+UseG1GC

启用G1收集器。G1是服务器类型的收集器,用于多核、大内存的机器。它在保持较高吞吐量的情况下,高概率满足GC暂停时间的目标。G1收集器推荐用于那些需要较大堆内存(6GB以上)并存在GC延迟需求(稳定且可预测暂停时间低于0.5秒)的应用

-XX:InitiatingHeapOccupancyPercent=percent

设置堆内存占用比,超过该比值之后,将启动并发垃圾回收,格式为整数

-XX:ConcGCThreads = threads

设置用于并发垃圾回收的线程数,默认值依赖于JVM使用CPU个数

-XX:G1ReservePercent=percent

设置堆内存预留空间百分比,以降低目标空间溢出的风险。默认值:10%

-XX:G1HeapRegionSize

设置G1区域的大小,范围是1MB到32MB之间。目的是根据最小的Java堆内存划分出约2048个区域

-XX:+UseStringDeduplication

启用重复字符串删除,该选项仅用于G1收集器。字符串重复数据删除利用大多数字符串相同的情况减少了字符串对象的内存足印。这种情况下,相同字符串指向并共享同一个字符串数组,而非每一个字符串一个

-XX:+UseTLAB

年轻代中使用本地线程收集块

 

二、Tomcat优化

调整server.xml配置

Tomcat容器相关配置都在 /conf/server.xml中

服务器自身优化

  1. 修改链接器的maxConnections属性:决定了服务器在同一时间接收并处理的最大连接数。当达到该值之后,服务器接收但不会处理更多的请求,额外的请求将会被阻塞知道链接数低于maxConnections,此时,服务器再次接收并处理新链接。
  2. 将tcpNoDelay属性设置为true会开启Socket的TCP_NO_DELAY选项,会禁用Nagle算法,该算法用于链接小的缓冲消息,这会降低通过网络发送数据包的数量,提升网络传输效率,但是对于交互式应用(如WEB)会增加响应时间。
  3. 调整maxKeepAliveRequest属性值,该属性用于控制HTTP请求的keep-alive行为,指定了链接被服务器关闭前可以接收的请求最大数目。
  4. 修改socketBuffer属性,调整Socket缓冲区大小。通过合理调整Socket缓冲器有助于提升服务器的性能。
  5. 将enableLookups属性设置为false,禁用request.getRemoteHost的DNS查找功能,减少查找时间

优化网络传输

  1. 如果采用HTTP协议,推荐开启静态文件(如JS、图片、CSS等)压缩功能。HTTP链接器通过属性compression控制是否开启GZIP压缩,属性compressableMimeType设置需要压缩的文档类型,属性compressionMinSize用于指定静态文件压缩之前的最小数据量,只有当文件数据超过该值时,才会开启GZIP压缩,如果Tomcat与Web服务器集成,那么推荐采用AJP协议,它采用二进制传输可读技术,传输效率更高。
  2. 选用高性能链接器提升I/O效率。Tomcat支持4种不同的I/O模式,默认情况下使用的是NIO,我们可以根据实际情况选择APR或者NIO2。尤其是APR,其对静态文件的处理能力可以媲美Web服务器。

禁用Host自动部署功能

  1. 默认情况下,Tomcat会自动扫描$CATALINA_BASE/webapps下的web应用。我们只需要将web应用复制到该目录下,Tomcat会自动完成部署。虽然Tomcat的自动部署在开发环境下非常有用,但是在生产环境下会影响Tomcat服务器的性能,推荐关闭该功能。只需要修改server.xml的Host元素,将autoDeploy设置为false。
  2. 如果采用在server.xml中添加元素或者在Web应用的META-INF目录中定义context.xml文件的方式来部署应用,需要确保reloadable属性为false,从而避免、WEB-INF/classes或者/WEB-INF/lib目录下的文件变更时会自动重新加载应用。

调整JSP页面设置

JSP的默认设置位于$CATALINA_BASE/conf/web.xml(名为“jsp”的Servlet),它支持许多初始化参数以进行定制化配置。

  1. 将参数development设置为false,使Tomcat不再检测JSP页面的修改,将参数reloading设置为false,禁用Tomcat后台自动编译。这两个参数可以用于开发环境,便于系统调试,但是在生产环境中将其禁用。虽然禁用了这两个参数会提高服务器的性能,但是会降低服务器的可维护性,因为我们替换JSP页面必须要重启服务器才能生效。除了禁用,还可以延长处理的时间间隔。checkInterval用于配置后台编译的触发频率,modificationTestInterval用于配置检测 JSP页面修改的时间间隔,合理设置这两个参数的值同样可以提升服务器性能。
  2. 将genStringAsCharArray设置为true,可以生成更高效的字符数组。将参数trimSpace设置为true,可以移除响应中无用的空格。另外,将参数enablePooling用于控制在JSP页面编译时是否启用标签池,Tomcat默认已经开启该参数。

与Web服务器集成

  1. 从性能的角度考虑,如果应用大部分是由静态文件组成,静态请求占据绝大多数,那么可以集成Web服务器,静态文件请求直接交由Web服务器处理,充分利用Web服务器的优势,缓存静态文件,提升访问性能。
  2. 从可伸缩性角度考虑,与Web服务器集成,构成应用集群和负载均衡,可以提升系统的稳定性。在集成Web服务器的情况下,对于单次动态请求,必然会增加其相应时间。但是从整体上考虑,由于集群环境把请求合理分配到多台服务器,降低了单台服务器的压力,从而提升了整体用户的访问性能。即便不考虑系统的伸缩性和有效性,当服务器负载过高导致的响应延迟远远大过于增加网络开销时,我们也应该考虑采用Web服务器集群,这也是负载均衡要解决的问题。

其他——应用性能优化建议

  1. 尽量减少浏览器与服务器通信次数,对于浏览器出发的远程操作,尽量由一次调用完成。在大多数情况下,网络开销在远程远程调用中所占比重都会比较大。
  2. 尽量减少请求响应数据量,去除无用数据,降低网络开销。能够在服务器端通过高速缓存等方式关联获取的数据,也尽量不哟啊包含在请求中。
  3. 尽量推迟创建会话的时机,,对于不需要会话的则尽量不要创建。因为无论采用何种会话管理器,会话管理都会耗费服务器性能。
  4. 不要在会话中存储大对象,这会导致会话占用内存过多,降低服务器性能。
  5. 尽量缩短会话的有效期,能够及时移除无效会话,降低会话管理成本。
  6. 合理定义对象作用域,以便对象可以及时回收。
  7. 采用连接池提升访问性能。
  8. 对于极少变更的数据,可以考虑采用缓存提升查询功能
  9. 最小化应用日志,或者尽量采用简单的日志格式。

你可能感兴趣的:(java,tomcat)