性能优化
有几个与性能关系密切的属性
执行器调优
1 | <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" |
Executor代表的是tomcat中的线程池,可以由其他组件共享使用,是Service元素的内嵌元素
- maxThreads:指定Connector创建的请求处理线程的最大数目。该属性决定了可以并行处理的请求最大数目,即并发上限。当并发请求数超过maxThreads时,多余的请求只能排队等待,默认200
- minSpareThreads:Tomcat允许的空闲线程的最小数目,也是启动时Connector创建的线程数目。如果空闲线程数小于该值,Tomcat将创建新的线程。默认25
- maxIdleTime:一个线程空闲多久算是空闲线程,默认60000
- maxQueueSize 最大等待队列,超过则拒绝
- prestartminSpareThreads 是否启动时即生成minSpareThreads个线程,默认为true
- namePrefix 线程名称前缀
注意配置后要在Connector节点中使用对应的executor才会生效
1
2
3
4 ><Connector executor="tomcatThreadPool" port="8082" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" relaxedPathChars="|{}[],%"
relaxedQueryChars="|{}[],%"/>
连接器调优
1 | <Connector port="8090" protocol="HTTP/1.1" |
- acceptCount:当tomcat启动的线程数达到最大时,接受排队的请求个数,默认100
- acceptorThreadCount 用于接受连接的线程数量
- enableLookups:设置为false,会禁用request.getRemoteHost()方法的DNS查询,从而提升响应性能(减少DNS查询耗时)
- 指定executor,不使用默认的
- maxConnections:tomcat接收和处理的最大连接数,当达到该值时,Acceptor线程将不会读取accept队列中的连接,设置为-1,连接数不受限制,使用NIO协议时默认为10000,APR默认为8192,BIO默认为2000
- maxThreads:请求处理线程的最大数量,默认为200,如果配置了executor,则该值无效,使用绑定的Executor,而不使用内置的线程池
- maxHeaderCount 请求头字段的最大数目,小于0则表示不限制
- maxParamterCount 参数值的最大数目,值小于0表示不限制
- maxPostSize 将被容器以FORM URL参数形式处理的最大长度的Post,值小于0则不限制
- URIEncoding 指定URI编码,默认是ISO-8859-1
- compression 压缩配置,如果连接器支持sendfile功能,会使用sendfile优先于压缩
- off 禁用压缩
- on 启用压缩
- force 强制压缩
- 数值 表示启用压缩,并设定压缩等级
其他
- 禁用AJP连接器
- maxSpareThreads:Tomcat允许的空闲线程的最大数目,超出的空闲线程将被直接关闭默认50
- tcpNoDelay:该属性为true,会启用Socket的TCP_NO_DELAY选项。会禁用Nagle算法,该算法通过降低网络发送包的数量提升网络利用率。在非交互式的web应用环境中,该算法会缩短响应时间。但是在交互式web应用环境中则会加大响应时间,因为它会将小包拼接为大包在进行发送,从而导致响应延迟
- maxKeepAliveRequest:用于控制HTTP请求的“keep-alive”行为,以启用持续连接(多个请求通过同一个HTTP连接发送)。该属性指定HTTP连接在被服务器关闭之前处理的请求最大数目。默认100,如果设置为1,表示禁用该特性
- socketBuffer:用于指定Socket输出缓冲的大小,单位为字节
JVM优化
内存分配以及GC策略调整,选择不同的垃圾回收策略,调整JVM以及垃圾回收参数,可以极大地减少垃圾回收次数,提升垃圾回收效率,从而改善程序运行性能。
可以在catalina.sh中配置JAVA_OPTS来配置对应的JVM参数
垃圾收集器
串行收集器:采用单线程执行所有的垃圾回收工作,适用于单核的服务器
并行收集器:以并行的方式执行Minor回收(年轻代垃圾回收),可以降低垃圾回收的开销,适用于多处理器,需要启用并行压缩
并发收集器:以并发的方式执行大部分垃圾回收工作,缩短垃圾回收的暂停时间,适用于数据集中为中型到大型、响应时间优先于吞吐量的应用。虽然减少了暂停时间,但是会降低应用程序性能
JDK8中提供了两种并发收集器
CMS收集器:并发标记扫描收集器,适用于缩短垃圾回收暂停时间并且负担得起与垃圾回收共享资源的应用
G1收集器:适用于大容量内存的多核服务器,在满足垃圾回收暂停时间目标的同时,以最大可能性实现高吞吐量
JVM参数
- -Xms 初始堆的大小,如不指定,初始化大小为分配的年轻代和年老代之和
- -Xmx 最大堆内存,xms和xmx设置为一个值,可以减少程序运行过程中调整堆内存分配的耗时
- -Xmn 年轻代的初始值及最大值,推荐为堆内存的1/2~1/4之间
- -XX:NewSize 年轻代初始值
- -XX:MaxNewSize 年轻代最大值
- -XX:MetaspaceSize 元数据空间的初始值
- -XX:MaxMetaspaceSize 分配用于类元数据的本地内存上限,默认不受限
- -Xss 线程栈大小
- -XX:ThreadStackSize 等价于xss
- -XX:NewRatio 设置年轻代和年老代大小的比值,默认2
- -XX:SurvivorRatio Eden区和Survivor区大小的比值,默认为2
- -XX:LargePageSizeInBytes 堆内存的内存页大小,默认0,表示由JVM动态选择
- -XX:+DisableExplicitGC 禁用Sytem.gc
- -XX:MaxTenuringThreshold 在新生代中对象存活次数后仍然存活,晋升到旧生代,最大值15
- -XX:+AggressiveOpts 开启新的编译器性能优化选项
- -XX:+UseBiasedLocking 启用偏向锁
- -Xnoclassgc 禁用类的垃圾回收,即类对象不会回收
- -XX:SoftRefLRUPolicyMSPerMB 每兆空闲堆内存中,SoftReference对象在最后一次引用后的存活时间,默认1s
- -XX:MaxHeapFreeRatio 垃圾回收后,堆内存空闲空间最大允许百分比,如果超过该值,堆内存会收缩
- -XX:MinHeapFreeRatio 垃圾回收后,堆内存空闲空间最小百分比,如果低于该值,堆内存会扩大
- -XX:+ParallelRefProcEnabled 启用并行引用处理。如果应用存在大量的引用或者finalizable对象需要处理,可以减少垃圾回收时间
- -XX:TargetSurivorRatio 设定幸存区的目标使用率
- -XX:+UseGCOverheadLimit 限定JVM耗费在GC上的时间百分比
- -XX:+UseSerialGC 启用串行收集器
Tomcat配置
server.xml配置
- 修改连接器的maxConnections属性该属性决定了服务器在同一时间接收并处理的最大连接数
- tcpNoDeply属性设置为true,会开启Socket的TCP_NO_DEPLY选项,禁用Nagle算法,该算法用于连接小的缓冲消息,会降低通过网络发送数据包的数量,提升网络传输效率,但是对于交互式应用会增加响应时间
- 调整maxKeepAliveRequest属性,用于控制keep-alive行为,指定了连接被服务器关闭之前可以接受的请求最大数目
- 调整socketBuffer,调整Socket缓冲区大小
- 将enableLookups属性设置为false,禁用request.getRemoteHost的DNS查找功能,减少查找时间
- IO方式最好使用NIO2或者APR
jar包配置
同一个tomcat下可能运行了多个项目,可以将公共项目抽取出来,放到/shared/lib下,减少每次打包jar重复占用内存的问题
/shared/lib这个目录需要配置在shared.loader中