网站首页 > 技术文章 正文
概述
关于tomcat优化方面的内容,我这边主要从内存、线程数、打开压缩功能、集群和ARP几个方面来做优化。这里面ARP相对比较少用。
优化相关
1、内存优化:
配置文件:$TOMCAT_HOME/bin/catalina.sh
export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "
上述这样的配置,基本上可以达到:
系统响应时间增快 JVM回收速度增快同时又不影响系统的响应率 JVM内存最大化利用 线程阻塞情况最小化
参数解释:
-server Tomcat以server模式运行,将拥有更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量,生产环境必须加上。 -Xms –Xmx 一般设置这里两个值相等 –Xmn 年轻代[Sun官方推荐配置为整个堆的3/8] -Xss 指设定每个线程的堆栈大小 一般是128k或者256k -XX:+AggressiveOpts 启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术(如果有的话) -XX:+UseBiasedLocking 启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。 -XX:PermSize=128M 非堆的初始值[物理内存的1/64] -XX:MaxPermSize=256M 非堆的最大值[物理内存的1/4] -XX:+DisableExplicitGC 程序代码中不允许有显示的调用”System.gc()” -XX:+UseParNewGC 对年轻代采用多线程并行回收,这样收得快。 -XX:+UseConcMarkSweepGC 即CMS gc 我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒。 -XX:MaxTenuringThreshold 设置垃圾最大年龄 -XX:+CMSParallelRemarkEnabled 在使用UseParNewGC 的情况下, 尽量减少 mark 的时间 -XX:+UseCMSCompactAtFullCollection 在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少 -XX:+UseFastAccessorMethods get,set 方法转成本地代码 -XX:LargePageSizeInBytes 指定 Java heap的分页页面大小
2、线程优化和打开压缩功能
配置文件:$TOMCAT_HOME/conf/server.xml
定位到这一行:<connector port="8080" protocol="HTTP/1.1" >
URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75" # enableLookups="false" 消除DNS查询对性能的影响我们可以关闭DNS查询 enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" #acceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection #maxProcessors="2000"一般设置为2000 acceptCount="300" maxThreads="300" maxProcessors="2000" minProcessors="5" #可以减少它对一些url的不必要的检查从而减省开销。 useURIValidationHack="false" #给Tomcat配置gzip压缩(HTTP压缩)功能 compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" redirectPort="8443"/>
最后8443端口建议也设置成此配置,因为https会走8443端口。
3、采用集群
采用Nginx来作为请求分流的服务器,后端多个tomcat共享session来协同工作,这里主要是应用到负载均衡和动静分离。
顺便介绍下这两个概念:
负载均衡:目前大多数的网站都会采用负载均衡手段来针对目前用户的指数级增长来减少对单点服务器的负载压力,比如目前我们拥有3台真实服务器,我们需要根据相应策略决定什么样的用户请求分配到哪个真实服务器,比如按照轮询的方式,用户请求挨个到达代理服务器,此时代理服务器按照第一个请求转发至第一台真实服务器,第二个请求转发到第二个服务器上,依次类推,这样可以防止大量的用户请求全部访问到同一台物理机上,单点物理机的性能始终有限的,当然这可能对服务器数据访问时候造成事务性的失效,在Web方面可能造成Session访问的问题。
动态静态资源分离:最方便列举就是Java的JSP和静态资源如:.js/.css/.html/.png方面的资源分离,之前web方面的程序时候一般是将html、css等资源文件也放置于Tomcat之中,用户访问后tomcat需要将请求的这些静态资源文件一并返回给用户,再者如果有多台同业务逻辑的tomcat服务器的话,同样的资源还需要在每个服务器上放一份,同时也增加了tomcat服务器的网络IO,十分不合算的,如果只将JSP之类的请求交给tomcat,而代理服务器上存放静态资源,当用户的请求非动态资源的时候,我们完全可以将代理服务器的静态资源直接返回给用户,而不去增大Tomcat的压力,tomcat只需要负责逻辑处理和动态资源的加载就可以了
4、改用APR库
tomcat默认采用的BIO模型,在几百并发下性能会有很严重的下降。tomcat自带还有NIO的模型,另外也可以调用APR的库来实现操作系统级别控制。
NIO模型是内置的,调用很方便,只需要将上面配置文件中protocol修改成org.apache.coyote.http11.Http11NioProtocol,重启即可生效。
APR则需要安装第三方库,在高并发下会让性能有明显提升。
Tomcat启动的时候,可以通过log看到Connector使用的是哪一种运行模式:
- Starting ProtocolHandler ["http-bio-8080"]
- Starting ProtocolHandler ["http-nio-8080"]
- Starting ProtocolHandler ["http-apr-8080"]
之前压测的时候测试过性能方面确实是有很大的提升,篇幅有限,这里就不介绍怎么去安装ARP了。
关于tomcat优化方面的内容基本就这些了,当tomcat存在瓶颈时,大家可以按照这个模板去做配置,肯定会有性能提升的。
后面会分享更多关于devops和DBA方面的内容,感兴趣的朋友可以关注下!!
猜你喜欢
- 2024-10-28 美团面试:熟悉哪些JVM调优参数,幸好我准备过
- 2024-10-28 Java虚拟机:Jvm概念和原理详解以及GC机制的分析
- 2024-10-28 JVM 的内存模型(jvm1.8内存模型)
- 2024-10-28 JDK、JRE、JVM,是什么关系?(jdk jrejvm的区别)
- 2024-10-28 一个 JVM 参数引发的频繁 CMS GC(当产生一个异常时,jvm会做什么)
- 2024-10-28 JVM系列一:JVM内存组成及分配(jvm的内存分配)
- 2024-10-28 谈谈JMM与JVM的相关知识(jmm jvm juc)
- 2024-10-28 常见的JVM参数配置(常见的JVM参数配置有哪些)
- 2024-10-28 一份详细介绍JVM的资料(对比JDK8和JDK7)
- 2024-10-28 理解JVM运行时数据区域,看这一篇文章就够了
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)