文档章节

Tomcat调优测试

新时代搬砖
 新时代搬砖
发布于 2016/10/05 19:24
字数 1340
阅读 80
收藏 1

测试环境:

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能支持更高的并发数和吞吐量.
    • 测试结果:

      修改前:

      修改后:

  • 添加参数:

    export JAVA_OPTS=”-server -Xms256M -Xmx256M”

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

    • 测试结果:

  • 添加参数:

    export JAVA_OPTS=”-server -Xms512M -Xmx512M”

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


  • 添加参数:

    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进行垃圾回收,会极大降低系统响应时间.

调优方式二: 更改…/conf/server.xml (容器内优化)

在server.xml内定位到标签,以下的内容均值在该标签中修改内容

  • 添加参数:

    URIEncoding=”UTF-8”

    • 作用: 使得tomcat可以解析含有中文名的文件的url
  • 添加参数

    protocol=”org.apache.coyote.http11.Http11Nio2Protocol”
    若tomcat为8可改为上面的参数,若为tomcat6建议改为”org.apache.coyote.http11.Http11NioProtocol”

  • 添加参数

    enableLookups=”false”

    • 关闭DNS查询.
  • 添加参数

    acceptCount=”1000”

    • 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置 100.这里设置为1000
  • 添加参数

    maxThreads=”5000”

    • 最大并发数,默认设置 200,这里设置为JMeter中的模拟请求数5000
  • 测试结果:
    将上述几个参数添加去本机的配置文件中,测试数据没有明显差距,故不贴出.
    可能因为测试用例简单,在这方面进行优化有点杀鸡焉用牛刀了.

总结:

在本测试中,堆内存的更改对tomcat的优化效果非常明显.其实这是属于JVM优化的范畴,只不过作用于tomcat身上.
其他参数的优化在本测试中效果不明显,但我相信对于业务复杂的场景,这些优化都是非常必要的,尤其是对server.xml的优化.
另外,测试过程中出现让我很费解的事.相同的配置运行多次,得到的数据会有较大的出入.比如我晚上测试了一边.第二天起来用该配置再测一边,得到的数据会同比波动会非常大.
结合多次实验,发现数据的波动会出现在物理机和Docker容器的唤醒,重新打开JMeter软件等行为之后,这些行为都会导致内存使用率的大量变化,这些都导致JVM的运行环境不够稳定,
所以,该测试的结果并不严谨,仅可作为参考而不可尽信.务必在您的环境亲自测试一遍.

最后,下面给出一份参考配置,转载自网络,本文也参考了他们的博文.

catalina.sh配置来源

server.xml配置来源

参考配置

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

<Connector 
port="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"
/>

 

© 著作权归作者所有

共有 人打赏支持
上一篇: StringUtil
新时代搬砖
粉丝 6
博文 17
码字总数 4979
作品 0
汕头
程序员
私信 提问
服务器性能调优过程探讨

服务器双核3G内存 debian64 需要同时支持5000+用户认证 实用nginx做的负载均衡,tomcat作为javaEE容器,同时部署有防火墙、openldap,mysql等 目前服务器运行很容易奔溃 请教: 1. 服务器器性...

Avro
2013/05/07
708
9
深入浅出“JVM”性能优化

深入浅出“JVM”性能优化 理解性能优化 性能基准 性能优化到底是什么 衡量维度 JVM调优 知其然,知其所以然 详解什么是JVM运行时数据区 详解什么是JVM内存模型JMM 详解GC可达 详解各垃圾回收...

Java高级架构
2017/12/18
0
0
基于APR模式的Tomcat环境部署

1、版本信息 Tomcat的通讯模型总共为3种,分别为BIO、NIO、APR,而本次所采用的模式为APR。 3种模式的区别: 2、基础安装 # vim /etc/profile # vim /opt/tomcat/conf/server.xml # vim /op...

workming
2015/11/05
0
0
tomcat部署最佳实践(一)

Tomcat部署最佳实践 标签: linux 笔者Q:972581034 交流群:605799367。有任何疑问可与笔者或加群交流 tomcat是玩web软件必会技能之一,今天我给大家介绍一下tomcat的部署,监控以及调优。 ...

陈天刚
2017/04/24
0
0
亲们,你们的tomcat并发能到多少?

配置:Intel Xeon E5 2.4G*6核,16G内存,Redhat Linux X64,jdk 7(server),tomcat 8.9 改了tomcat 内存配置,开启了nio+epoll,结果仍不好看。。。 vi bin/catalina.sh CATALINA_OPTS='-Dja......

爱喝貓的咖啡
2014/08/18
0
12

没有更多内容

加载失败,请刷新页面

加载更多

oh-my-zsh 自定义

GitHub 地址 基于 oh-my-zsh 的自定义配置,增加了一些个人常用插件与皮肤。 采用的是 git submodule 来维护,包括 oh-my-zsh,之所以这么搞,主要是手头有多台 linux 需要维护, 每台机器、...

郁也风
今天
4
0
Docker安装踩坑:E_FAIL 0x80004005的解决

参考 菜鸟教程--Windows Docker 安装 http://www.runoob.com/docker/windows-docker-install.html 官方文档-Install Docker Toolbox on Windows https://docs.docker.com/toolbox/toolbox_in......

karma123
今天
4
0
js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部