性能测试遭遇TPS抖动问题
目前性能测试组正在对独立秒杀进行性能压测,性能抖动特别厉害。

由于独立秒杀的接口大多数是经过volicity渲染过的页面和数据的整合,所以在压测的时候有很多volicity的错误。初步判定,感觉是volicity的性能问题才导致的。但是通过排查volicity发现,此版本没有网传的性能问题,而且代码层面上也没见到有过多的性能问题点。
之后通过查看jvm的堆内内存才发现,老年代的内存无法释放,总是会经过很长一段时间,大概三十四分钟后才会释放。感觉很奇怪:

从上图可以看到,堆内内存涨上去后,基本上就下不来了, 这些没释放的内存,基本上都在老年代。初步判定为jvm堆内内存要么有大对象,要么什么东西一直持有,并未释放。
之后从服务器上dump数据下来,然后通过mat加载后,得到的分析如下:

可以看到,系统中,有一个ConcurrentHashMap的容器里面,貌似对每个http请求,都做了一次缓存。考虑到目前做的是压测,那么也就是说瞬间涌入千万级别的请求也不为过,ConcurrentHashMap的体积在很短的时间就会暴涨,势必会带来频繁的gc问题。如果只是保存http请求状态,为什么http请求完毕,不会释放呢?
带着疑问去应用里面进行排查,发现应用里面根本没有直接使用ConcurrentHashmap对象。那么也就是说ConcurrentHashmap对象也许是存在什么jar包里面了。经过排查jar包,也没发现什么地方使用concurrenthashmap,顿时陷入了死局。
后来,压测组发来一篇文章:压力测试中JVM内存暴涨原因分析实战, 看完文章,和我的遭遇非常一致,联想到目前压测直接使用ip+端口压测,直接打到tomcat上进行压测,而且接口返回数据都是经过velocity渲染的模板和数据组合,是有前端页面的。所以说,按照文章中的说法,应该是tomcat对每一个进来的请求都会将状态会话保持放到ConcurrentHashmap中导致的,而且这个状态会话保持默认30分钟后过期,这也是为啥GC一直下不来的原因了。
为了印证此说法,按照此文的建议, Memory Fully utilized by Java ConcurrentHashMap (under Tomcat),在web.xml中设置session过期时间为1分钟:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
之后修改代码,上预发,然后让压力机单压预发这台机器,可以看到堆内存回收如下:

可以看到当堆内存打到极高点后,jvm很快进行了一次回收,而且此次回收比较彻底。
验证完毕,看来是这个原因。希望对你有帮助。
性能测试遭遇TPS抖动问题的更多相关文章
- tps抖动
https://blog.csdn.net/lzqinfen/article/details/46820673 tps抖动厉害的原因?突然增加成倍的用户,如果性能表现良好,TPS应该成倍增加,响应时间 ...
- 性能测试中TPS上不去的几种原因
性能测试中TPS上不去的几种原因 什么叫TPS: TPS(Transaction Per Second):每秒事务数,指服务器在单位时间内(秒)可以处理的事务数量,一般以request/second为 ...
- 性能测试中TPS和并发用户数
并发用户数与TPS之间的关系 1. 背景 在做性能测试的时候,很多人都用并发用户数来衡量系统的性能,觉得系统能支撑的并发用户数越多,系统的性能就越好:对TPS不是非常理解,也根本不知道它们之间的关系 ...
- 性能测试中TPS上不去的几种原因浅析
转:https://www.cnblogs.com/imyalost/p/8309468.html 下面就说说压测中为什么TPS上不去的原因: 1.网络带宽 在压力测试中,有时候要模拟大量的用户请求, ...
- 性能测试相关(TPS/RT/PV等)(转)
对于我们开发来说,我们日常最熟悉的工作就是把客户的需求实现并交付.但是,事情并不是往往就这样结束了,我们还需要后续对上线的系统进行跟踪调查,查看系统的运行情况.为什么呢?一方面,我们需要关注系统在运行 ...
- 性能测试:TPS和QPS的区别
做测试,各种ps,jps,tps,qps,rps,hps,你理解几个? 技术群里,问得最多的就是tps和qps,有相似的地方,也有差异的地方,我简单谈下自己的理解.(由于比较忙,下面部分摘抄自网络) ...
- 性能测试中TPS上不去的原因
TPS(Transaction Per Second):每秒事务数,指服务器在单位时间内(秒)可以处理的事务数量,一般以request/second为单位. 压测中为什么TPS上不去的原因: .网络带 ...
- 性能测试常用sql技巧_Oracle
做了一段时间的性能测试,把自己在性能测试过程中,使用到的Oracle中用到的sql语句整理一番,做个备忘: (1)多个字段以某种格式拼接 "||"字符串拼接符; 示例:将" ...
- TPS和事务响应时间的关系、计算公式 (转)
例子:一个高速路有10个入口,每个入口每秒钟只能进1辆车1.请问1秒钟最多能进几辆车? TPS=102.每辆车需要多长时间进行响应? reponse time = 13.改成20辆车,每秒能进 ...
随机推荐
- java数组集合元素的查找
java数组和集合的元素查找类似,下面以集合为例. 数组集合元素查找分为两类: 基本查找: 二分折半查找: 基本查找: 两种方式都是for循环来判断,一种通过索引值来判断,一种通过数组索引判断. 索引 ...
- linux 常用命令 和 nginx(反响代理、负载均衡)安装和配置
(1)linux常用命令 [1]在光标前输入内容:i [2]删除输入方式下所输入的文本:Ctrl+u [3]文件保存退出:wq [4]文件不保存退出:q [5]文件强制退出:q! [6]常规删除文件 ...
- PyCharm下使用Scrapy建立爬虫项目--MyFirstSpiderObject
首先下载并安装Anaconda3以及PyCharm Anaconda3选中添加环境变量,如果忘记选中可以手动在path中添加如下环境变量 建文件夹scrapy 安装scrapy cmd进入对应目录,执 ...
- Eclipse中启动Tomcat报错:[There is insufficient memory for the Java Runtime Environment to continue.]的解决方案
1,报错截图 2,报错信息 五月 08, 2018 9:57:58 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [Se ...
- 【js】了解前端缓存,收获不止于此!
了解前端缓存,收获不止于此! 这次我们来讲一下关于前端缓存的问题.感谢赵欢同学提供doc素材. 首先,开局我画了一张图,你会对文章有一个大局了解. 今天讲的是前端缓存. 前端缓存有3大种:如图,分为H ...
- 《一些神奇的JS功效》
1: async 异步回调 (ES6) async function test(){ console.log("hello wolrd"); } test().then(funct ...
- uirecorder 启动webdriver服务报错
在安装好uirecorder后,执行起来是各种错误. 不是少这个就是缺那个,也是因为自己对自动化测试知识太匮乏. 导致刚开始走自动化测试绕了很多弯路,报个错都不知所措.后来才知道要多看ERROR后面的 ...
- SpringBoot Tomcat启动报错
中间的桥梁就是下面这个依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over ...
- ready
// 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; // 实例方法 this.sleep = functio ...
- LintCode 521.去除重复元素
LintCode 521.去除重复元素 描述 给一个整数数组,去除重复的元素. 你应该做这些事 1.在原数组上操作 2.将去除重复之后的元素放在数组的开头 3.返回去除重复元素之后的元素个数 挑战 1 ...