性能测试遭遇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辆车,每秒能进 ...
随机推荐
- 类与对象 && 继承
以下是本人的对类与对象.继承的一些理解,如有错误之处万望谅解,如有朋友愿意指正,十分乐意,万分感谢! 类与对象 类与对象是学习编程的基础(大概吧),那么何为类?何为对象呢? 一.简 ...
- 微信小程序组件通信
父子通信 在子组件的对应js中 properties:{ prop名字:数据类型, prop名字:{ type:数据类型, value:默认值 } } 在父组件的wxml模板中找到子组件标签 < ...
- 软件目录结构规范(以python为例)
为什么要设计好目录结构 "设计项目目录结构",就和"代码编码风格"一样,属于个人风格问题.对于这种风格上的规范,一直都存在两种态度: 一类同学认为,这种个人 ...
- Docker+Teamcity+Maven+SVN搭建持续集成环境
这是使用Jenkins作为CI/CD工具,Teamcity的作用是相同的.
- Js重拾
如果重新声明 JavaScript 变量,该变量的值不会丢失: 在以下两条语句执行后,变量 carname 的值依然是 "Volvo": var carname="Vol ...
- 如何在Qt中使用自定义数据类型
这里我们使用下面这个struct来做说明(这里不管是struct还是class都一样): struct Player { int number; QString firstName; QString ...
- mtd-utils交叉编译安装
一.获取源码并解压 存储于/home/zhangyi/work/psoc_ltp/tools-ltp-ddt中,解压后的源码存于上一层目录. 1.mtd-utils-2.0.0 wget ftp:// ...
- redis哨兵集群配置
redis 集群架构图: 需要先配置redis主从,我这边是单机部署的. 采用一主一从,两个sentinel. redis host: 172.31.11.235 redis-master port: ...
- Vue学习——学习vue必须了解的几个知识点
node.js介绍 Node 是一个让 JavaScript 运行在服务端的开发平台,使用JavaScript也可以开发后台服务.说明白些它仅仅是一个平台,我们使用vue开发必须要安装node.js. ...
- WindowsService(Windows服务)开发步骤
https://www.cnblogs.com/moretry/p/4149489.html