Tomcat 调优测试
测试环境:
OS: Ubuntu14.04 64位 (运行在Docker1.9)
CPU: Intel i3 双核四线程
Mem: 8G
Tomcat版本: Tomcat8.5
Java SDK版本: JDK 8
测试软件: Apache JMeter 2.8
测试说明:
测试代码为接受一个http请求,返回一个String变量s.
该变量初始化为””, 循环10000次,每次添加内容”test ”
public class Test extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{ StringBuffer ret = new StringBuffer(); for(int i=0;i < 10000; i++) { ret.append(String.valueOf(i) + " test "); } PrintWriter printWriter = response.getWriter(); printWriter.println(ret); }}
采用JMeter模拟5000个(用户),在10s内对该接口不断发起Get请求,并循环10次.
最后统计结果.
对每个配置的修改都会关闭并重启tomcat
调优方式一 : 修改…/bin/catalina.sh(启动时优化)
Windows下为catalina.bat
- 添加参数:
export JAVA_OPTS=”-server”
- 作用:tomcat默认以java –client方式运行, 添加”server”参数将tomcat切换为生产模式,使得tomcat能支持更高的并发数和吞吐量.
- 测试结果:
- 修改前:
- 修改后:
- 总结:
- 最大并发数和吞吐量有明显的提升.
- 添加参数:
export JAVA_OPTS=”-server -Xms256M -Xmx256M”
- 作用:Xms参数表示初始堆的大小,也是堆大小的最小值,默认值是总共的物理内存1/64, 且小于1G(下面是-Xmx同), Xmx参数表示堆的最大值.在本机中这个参数的值大约为128m.这里将其扩大一倍.正常情况下应当将这个参数的数值设置为相同.还有另外一些参数,如Xss,表示每个线程的栈内存,默认为1M,但经过查阅资料表明这些参数一般情况下不需要改动.即增加堆内存是提高tomcat内存性能最好最安全的做法.
- 测试结果:
- 总结:
- 对比上个参数,可以明显看到并发请求的平均值,中值都有2-3倍的提升,最大值和吞吐率出现了下降.个人猜测吞吐率的下降是因为在吞吐量一定的情况下,每秒并发数的提高拉低了该数值.并发最大值的降低,平均值的升高表明在此配置下系统的处理能力已经有了提高,并且稳定性也得到提升.
- 添加参数:
export JAVA_OPTS=”-server -Xms512M -Xmx512M”
- 作用: 在上条参数的基础上,将堆内存起始值和最大值都提高一倍
- 测试结果:
- 总结:
- 并发平均数和吞吐率变化不大,但并发最大值提升2倍左右.
- 测试代码按最少的字节算,处理单个用户请求需要50000bytes,在本测试中模拟的用户数是5000,即使5000用户并发处理,所需内存也只在200MB这个级别,所以堆内存设置为512MB与256MB,某些数据项可能已经遇到瓶颈.
- 添加参数:
export JAVA_OPTS=”-server -Xms512M -Xmx512M -XX:+AggressiveOpts”
- 作用: -XX:+AggressiveOpts表示每当JDK版本升级时,你的JVM都会使用最新加入的优化技术(如果有的话).建议加上,但也要注意若升级JDK版本后系统出现意外情况,应该对该参数的影响进行测试.
- 添加参数:
export JAVA_OPTS=”-server -Xms512M -Xmx512M -XX:+AggressiveOpts -XX:+UseBiasedLocking”
- 作用: 启用一个优化的线程锁.对于tomcat来说,每个http请求都会启用线程,启动该线程锁可以让tomcat对线程进行最优调配.
- 测试结果:
- 总结:
- 除了吞吐率其他都降得很厉害.个人猜测因为本次测试代码并不复杂,如果是执行复杂的业务逻辑可能优化效果会比较明显,尤其是设计到当业务的计算量相差较大时.
- 添加参数:
export JAVA_OPTS=”-server -Xms512M -Xmx512M -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC”
- 作用: 禁止显示调用System.gc().若在代码中显示调用System.gc()让JVM进行垃圾回收,会极大降低系统响应时间.
调优方式二: 更改…/confrver.xml (容器内优化)
在server.xml内定位到标签,以下的内容均值在该标签中修改内容
- 添加参数:
URIEncoding=”UTF-8”
- 作用: 使得tomcat可以解析含有中文名的文件的url
- 添加参数
protocol=”org.apache.coyote.http11.Http11Nio2Protocol”
若tomcat为8可改为上面的参数,若为tomcat6建议改为”org.apache.coyote.http11.Http11NioProtocol”
- 添加参数
enableLookups=”false”
- 添加参数
acceptCount=”1000”
- 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置 100.这里设置为1000
- 添加参数
maxThreads=”5000”
- 最大并发数,默认设置 200,这里设置为JMeter中的模拟请求数5000
- 测试结果:
- 将上述几个参数添加去本机的配置文件中,测试数据没有明显差距,故不贴出.
- 可能因为测试用例简单,在这方面进行优化有点杀鸡焉用牛刀了.
- 总结
- 在本测试中,堆内存的更改对tomcat的优化效果非常明显.其实这是属于JVM优化的范畴,只不过作用于tomcat身上.
- 其他参数的优化在本测试中效果不明显,但我相信对于业务复杂的场景,这些优化都是非常必要的,尤其是对server.xml的优化.
- 另外,测试过程中出现让我很费解的事.相同的配置运行多次,得到的数据会有较大的出入.比如我晚上测试了一边.第二天起来用该配置再测一边,得到的数据会同比波动会非常大.
- 结合多次实验,发现数据的波动会出现在物理机和Docker容器的唤醒,重新打开JMeter软件等行为之后,这些行为都会导致内存使用率的大量变化,这些都导致JVM的运行环境不够稳定,
- 所以,该测试的结果并不严谨,仅可作为参考而不可尽信.务必在您的环境亲自测试一遍.
参考配置
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 “
server.xml
[objc] view plain copy
- Connectorport="8080"
- protocol="org.apache.coyote.http11.Http11Nio2Protocol"
- connectionTimeout="20000"
- redirectPort="8443"
- enableLookups="false"
- acceptCount="100"
- maxThreads="200"
- minSpareThreads="10"
- compression="on"
- compressionMinSize="2048"
- compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
- URIEncoding="utf-8"
Tomcat 调优测试的更多相关文章
- Tomcat调优及JMX监控
Tomcat调优及JMX监控 实验背景 ====================================================== 系统版本:CentOS release 6.5 ( ...
- tomcat调优的几个方面(转)
tomcat调优的几个方面 和早期版本相比最新的Tomcat提供更好的性能和稳定性.所以一直使用最新的Tomcat版本.现在本文使用下面几步来提高Tomcat服务器的性能. 增加JVM堆内存大小 修复 ...
- tomcat 调优-生产环境必备
目录 1. tomcat 启动慢 1.1 tomcat 获取随机值阻塞 1.2 tomcat 需要部署的web应用程序太多 1.3 tomcat启动内存不足 2 Connector 调优 2.2 Co ...
- Tomcat调优总结(Tomcat自身优化、Linux内核优化、JVM优化)
Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置.首先是对这几个参数的含义要有深刻而清楚的理解.以tomcat8.5为例,讲解参数. 同时也得认识到一点,tomcat调 ...
- 垃圾回收器及tomcat调优
垃圾回收机制 1.概述:垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域".垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存 ...
- MySQL慢查询查找和调优测试
MySQL慢查询查找和调优测试,接下来详细介绍,需要了解的朋友可以参考下.本文参考自:http://www.jbxue.com/db/4376.html 编辑 my.cnf或者my.ini文件,去除 ...
- 简谈Tomcat调优
一.Tomcat和apache的比较 共同点:apache和tomcat都是属于web服务器. 不同点:他们是两个不同的容器,承载的东西不一样,tomcat属于一种java应用的服务 器,只针对jav ...
- Tomcat 调优技巧
Tomcat 调优技巧:1.Tomcat自身调优: ①采用动静分离节约Tomcat的性能: ②调整Tomcat的线程池: ③调整Tomcat的连接器: ④修改Tomcat的运行模式: ⑤禁用AJP连接 ...
- 一线大厂Java面试必问的2大类Tomcat调优
一.前言 最近整理了 Tomcat 调优这块,基本上面试必问,于是就花了点时间去搜集一下 Tomcat 调优都调了些什么,先记录一下调优手段,更多详细的原理和实现以后用到时候再来补充记录,下面就来介绍 ...
随机推荐
- freeRTOS学习8-21
不能再中断服务程序调用该函数 应该调用xQueueSendFromISR()
- CWMP开源代码研究——git代码工程
原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...
- [转帖]中芯国际14nm秋季量产 7nm工艺或在2020年底问世
中芯国际14nm秋季量产 7nm工艺或在2020年底问世 https://news.mydrivers.com/1/641/641087.htm 中芯正在发力.. 今年秋天 14nm两场 明年底 7n ...
- Spring MVC(一)Spring MVC的原理
1.Spring MVC的目的 构建像Spring框架那样灵活和松耦合的Web应用程序. 2.Spring MVC中如何处理Request? 每当用户在Web浏览器中点击链接或者提交表单时,Reque ...
- Vuex是什么?
记得去年公司招聘前端工程师的时候,我要负责准备面试题去考验面试者,让我记忆深刻的有一件事,我看大多数面试者简历上都写了熟练掌握Vuex,然而当我问起的时候,大部分回答都支支吾吾,解释不清,而当我提起与 ...
- L1-025. 正整数A+B 简单复习一下,。
本题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000].稍微有点麻烦的是,输入并不保证是两个正整数. 输入格式: 输入在一行给出A和B,其间以空格分开.问题是A和B不一定是满 ...
- 【html】 iframe 和 frameset 的区别
一.两者的相同点和不同点 相同点: iframe 和frameset都是html布局的框架布局 不同点: iframe是一个内联框架,是在页面里生成内部框架 frameset定义一个框架集,包含多个子 ...
- luogu题解P1032字串变换--BFS+STL:string骚操作
题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的strin ...
- Yali7月集训Contest2 T1 Cube 题解
题目链接: 连我们都只有纸质题目...话说雅礼集训都是这样的吗... 大意 0维基本图形是一个点 1维基本图形是一条线段 2维基本图形是一个正方形 3维基本图形是一个正方体 4维基本图形是... 求\ ...
- O034、 Nova Pause / Resume Instance 操作详解
参考https://www.cnblogs.com/CloudMan6/p/5496825.html 本节通过日志详细分析 Nova Pause / Resume 操作. 有时需要短时间暂停 ...