Tomcat 调优测试

  • 时间:2018-06-20 22:13 作者:程序员小新人学习 来源:程序员小新人学习 阅读:159
  • 扫一扫,手机访问
摘要:测试环境:OS: Ubuntu14.04 64位 (运行在Docker1.9)CPU: Intel i3 双核四线程Mem: 8GTomcat版本: Tomcat8.5Java SDK版本: JDK 8测试软件: Apache JMeter 2.8测试说明:测试代码为接受一个http请求,返回一个S

测试环境:

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\n”

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\n"); } 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可以支持更高的并发数和吞吐量.
  • 测试结果:
  • 修改前:
Tomcat 调优测试


Tomcat 调优测试


  • 修改后:
Tomcat 调优测试


Tomcat 调优测试


  • 总结:
  • 最大并发数和吞吐量有显著的提升.
  • 增加参数:

export JAVA_OPTS=”-server -Xms256M -Xmx256M”

  • 作使用:Xms参数表示初始堆的大小,也是堆大小的最小值,默认值是总共的物理内存1/64, 且小于1G(下面是-Xmx同), Xmx参数表示堆的最大值.在本机中这个参数的值大约为128m.这里将其扩大一倍.正常情况下应当将这个参数的数值设置为相同.还有另外少量参数,如Xss,表示每个线程的栈内存,默认为1M,但经过查阅资料表明这些参数一般情况下不需要改动.即添加堆内存是提高tomcat内存性可以最好最安全的做法.
  • 测试结果:
Tomcat 调优测试


Tomcat 调优测试


  • 总结:
  • 比照上个参数,能显著看到并发请求的平均值,中值都有2-3倍的提升,最大值和吞吐率出现了下降.个人猜测吞吐率的下降是由于在吞吐量肯定的情况下,每秒并发数的提高拉低了该数值.并发最大值的降低,平均值的升高表明在此配置下系统的解决可以力已经有了提高,并且稳固性也得到提升.
  • 增加参数:

export JAVA_OPTS=”-server -Xms512M -Xmx512M”

  • 作使用: 在上条参数的基础上,将堆内存起始值和最大值都提高一倍
  • 测试结果:
Tomcat 调优测试


Tomcat 调优测试


  • 总结:
  • 并发平均数和吞吐率变化不大,但并发最大值提升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对线程进行最优调配.
  • 测试结果:
Tomcat 调优测试


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

  1. Connectorport="8080"
  2. protocol="org.apache.coyote.http11.Http11Nio2Protocol"
  3. connectionTimeout="20000"
  4. redirectPort="8443"
  5. enableLookups="false"
  6. acceptCount="100"
  7. maxThreads="200"
  8. minSpareThreads="10"
  9. compression="on"
  10. compressionMinSize="2048"
  11. compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
  12. URIEncoding="utf-8"
  • 全部评论(0)
最新发布的资讯信息
【系统环境|】什么是Web?零基础能不能学Web前端开发?(2019-07-19 07:04)
【网页前端|HTML】为什么学Web前端?选择Web前端理由(2019-07-17 20:28)
【网页前端|JS】Java面经-百度新入职老哥整理近半年学习经验,面试刷题路线!(2019-07-16 22:16)
【网页前端|HTML】最全面的前端开发指南(2019-07-15 12:57)
【系统环境|数据库】零基础如何快速学好大数据?(2019-06-29 12:27)
【系统环境|Linux】零基础如何学好大数据?必备需要学习知识(2019-06-18 11:54)
【系统环境|】Hadoop环境中管理大数据存储八大技巧(2019-06-15 11:01)
【系统环境|服务器应用】现在国内IT行业是不是程序员过多了?(2019-06-11 06:34)
【系统环境|服务器应用】新贵 Flutter(2) 自己设置 Widget(2019-06-11 06:34)
【系统环境|服务器应用】Android完整知识体系路线(菜鸟-资深-大牛必进之路)(2019-06-11 06:34)
手机二维码手机访问领取大礼包
返回顶部