配置文件:$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\"大众一样平常设置为2000acceptCount=\"大众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方面的内容,感兴趣的朋友可以关注下!
!