Tomcat优化

前言

Tomcat的优化不是简单的修改几个参数就可以的,它的优化主要有三方面,分为系统优化,Tomcat本身的优化,JVM调优。

Tomcat本身优化
1.Connector连接器的配置

Tomcat连接器的三种方式:bio,io和apr,三种方式性能差异很大,apr的性能最优,bio的性能最差。而Tomcat9使用的Connector默认启用Apr协议.

2.配置文件优化

配置文件优化就是对server.xml优化,可以提高Tomcat的处理请求能力。
默认配置下,Tomcat会为每个连接器创建一个绑定的线程池(最大线程数200),服务启动时,默认创建5个空闲线程随时等待用户请求

首先,打开 ${TOMCAT_HOME}/conf/server.xml,搜索【<Executor name=“tomcatThreadPool”】,开启并调整为

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="20" maxSpareThreads="50" maxIdleTime="60000"/>

然后,修改<Connector …>节点,增加 executor 属性,搜索【port=“8080”】,调整为

<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" />
  • maxThreads:Tomcat使用线程来处理接收的每个请求,这个值表示Tomcat可创建的最大线程数,默认值是200
  • minSpareThreads:最小空闲线程数,Tomcat启动时的初始化线程数,表示即使没有人使用也开这么多空线程等待,默认值是10
  • maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程数

最大线程数不是越大越好,当线程数开启太多,CPU疲于线程上下文切换,就没有精力提供请求服务了

  • accpetCount:指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求不予处理,默认为100个.(当连接请求大于最大备用线程数,请求就会放入请求队列中等待)
  • compression: 是否对响应的数据进行GZIP压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩),force:表示所有情况下都进行压缩,默认值为off。压缩后可以有效的减少页面的大小,一般可以减少1/3左右,节省带宽
JVM优化

Tomcat启动命令行中的优化参数,就是JVM的调优(Tomcat本质是Java程序)。Tomcat首先跑在JVM之上的,因为它的启动其实也是一个java命令行,首先我们需要对这个Java启动命令行进行调优。不管是YGC还是Full GC,GC过程中都会导致程序运行中断,正确选择不同的GC策略,调整JVM,GC的参数,可以极大的减少由GC工作导致程序运行中断的问题。

JVM参数配置方法

Linux下Tomcat的启动参数位于catalina.sh文件。JAVA_OPTS,就是用来设置JVM相干运行参数的变量,还可以在CATALINA_OPTS变量中设置。
这两个变量的区别?

首先,在启动 Tomcat 时,任何指定变量的传递方式都是相同的,可以传递到执行“start”或“run”命令中,但只有设定在 JAVA_OPTS 变量里的参数被传递到“stop”命令中。对于 Tomcat 运行过程,可能没什么区别,影响的是结束程序,而不是启动程序。
第二个区别是更微妙,其他应用程序也可以使用 JAVA_OPTS 变量,但只有在 Tomcat 中使用 CATALINA_OPTS 变量。如果你设置环境变量为只使用 Tomcat,最好你会建议使用 CATALINA_OPTS 变量,而如果你设置环境变量使用其它的 Java 应用程序,例如 JBoss,你应该把你的设置放在JAVA_OPTS 变量中。

简单讲下就是后者设置的环境变量只能在Tomcat环境中有效,而前者还可以在别的环境下调用

JVM参数属性
set CATALINA_OPTS="
-server 
-Xms6000M 
-Xmx6000M 
-Xss512k 
-XX:NewSize=2250M 
-XX:MaxNewSize=2250M 
-XX:PermSize=128M
-XX:MaxPermSize=256M  
-XX:+AggressiveOpts 
-XX:+UseBiasedLocking 
-XX:+DisableExplicitGC 
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC 
-XX:MaxTenuringThreshold=31 
-XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSCompactAtFullCollection 
-XX:LargePageSizeInBytes=128m 
-XX:+UseFastAccessorMethods 
-XX:+UseCMSInitiatingOccupancyOnly
-Duser.timezone=Asia/Shanghai 
-Djava.awt.headless=true"

在/usr/local/apache-tomcat-5.5.23/bin 目录下的catalina.sh添加:
JAVA_OPTS=’-Xms512m -Xmx1024m’要加“m”说明是MB,否则就是KB了,在启动tomcat时会 报内存不足。
-Xms:初始值-Xmx:最大值-Xmn:最小值

上述命令的作用:

  1. 系统响应时间增快
  2. JVM回收速度增快又不同时影响系统的响应率
  3. JVM内存最大利用化
  4. 线程阻塞情况最小化
  • server:一定要作为第一个参数,在多个 CPU 时性能佳,还有一种叫 -client 的模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或开发调试,在 32 位环境下直接运行 Java 程序默认启用该模式。Server 模式的特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境,在具有 64 位能力的 JDK 环境下默认启用该模式,可以不配置该参数
  • Xms:表示 Java 初始化堆的大小,-Xms 与-Xmx 设成一样的值,避免 JVM 反复重新申请内存,导致性能大起大落(简称内存偏移),默认值为物理内存的 1/64,默认(MinHeapFreeRatio参数可以调整)空余堆内存小于 40% 时,JVM 就会增大堆直到 -Xmx 的最大限制
  • Xmx:表示最大 Java 堆大小,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃,因此一般建议堆的最大值设置为可用内存的最大值的80%。如何知道我的 JVM 能够使用最大值,使用 java -Xmx512M -version 命令来进行测试,然后逐渐的增大 512 的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息,默认值为物理内存的 1/4,默认(MinHeapFreeRatio参数可以调整)空余堆内存大于 70% 时,JVM 会减少堆直到-Xms 的最小限制
  • Xss:表示每个 Java 线程堆栈大小,JDK 5.0 以后每个线程堆栈大小为 1M,以前每个线程堆栈大小为 256K。根据应用的线程所需内存大小进行调整,在相同物理内存下,减小这个值能生成更多的线程,但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000 左右。一般小的应用, 如果栈不是很深, 应该是128k 够用的,大的应用建议使用 256k 或 512K,一般不易设置超过 1M,要不然容易出现out ofmemory。这个选项对性能影响比较大,需要严格的测试
  • XX:NewSize:设置新生代内存大小
  • XX:MaxNewSize:设置最大新生代新生代内存大小
  • XX:PermSize:设置持久代内存大小
  • XX:MaxPermSize:设置最大值持久代内存大小,永久代不属于堆内存,堆内存只包含新生代和老年代
  • XX:+AggressiveOpts:作用如其名(aggressive),启用这个参数,则每当 JDK 版本升级时,你的 JVM 都会使用最新加入的优化技术(如果有的话)
推荐阅读

简单介绍Tomcat优化
详解Tomcat本身优化参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值