性能测试遭遇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辆车,每秒能进 ...
随机推荐
- SQLSERVER 查询系统中的所有表的数量
SELECT a.name, b.rows FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE (a.type = ...
- 什么是DevOps
历史回顾 为了能够更好的理解什么是DevOps,我们很有必要对当时还只有程序员(此前还没有派生出开发者,前台工程师,后台工程师之类)这个称号存在的历史进行一下回顾. 如编程之道中所言: 老一辈的程序员 ...
- WebStorm过期解决方法
第一步:先删除C:\Users\本机用户名\.WebStorm2016.3\config文件中eval文件. 第二步:打开webstrom 如图,填写许可证激活码:http://idea.imsxm. ...
- html5中视频播放问题总结
html5中视频播放问题总结 文章 1.问题一 框架? 加个标签就OK! <video id="video1" src="/video1.mp4" con ...
- Windows 安装配置MongoDB
1.安装 下载安装包 直接下一步. 2.添加环境变量 3.bin同级目录下新建data文件夹,data文件夹下新建db和log文件夹 4.输入命令启动mongodb服务 mongod --dbpath ...
- MySQL中show profiles的开启
Query Profiler是MYSQL自带的一种query诊断分析工具,通过它可以分析出一条SQL语句的性能瓶颈在什么地方.通常我们是使用的explain,以及slow query log都无法做到 ...
- golang获取文件的md5
直接展示代码 func md5sum(filepath string) (string, error) { f, err := os.Open(filepath) if err != nil { st ...
- mysql批量查询
一般批量查询的时候都是in关键字,但是在数据量大的时候,效率低下. 这个时候我们就可以考虑使用union . xml 核心代码 <select id="selectList" ...
- Oracle错误——ORA-39002:操作无效、ORA-39070:无法打开日志文件、ORA-06512:在“SYS.UTL_FILE”,line
错误 在使用数据泵impdp导入文件时,出现错误,无法导入数据 Next 问题原因 初步猜测,应该是Oracle用户权限出现问题,是对Directory目录无操作权限所致,经过一番修改和测试,发现使用 ...
- orm 扩展
"""ORM小练习 如何在一个Python脚本或文件中 加载Django项目的配置和变量信息""" import os if __name_ ...