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

由于独立秒杀的接口大多数是经过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抖动问题的更多相关文章

  1. tps抖动

    https://blog.csdn.net/lzqinfen/article/details/46820673 tps抖动厉害的原因?突然增加成倍的用户,如果性能表现良好,TPS应该成倍增加,响应时间 ...

  2. 性能测试中TPS上不去的几种原因

    性能测试中TPS上不去的几种原因 什么叫TPS: TPS(Transaction Per Second):每秒事务数,指服务器在单位时间内(秒)可以处理的事务数量,一般以request/second为 ...

  3. 性能测试中TPS和并发用户数

    并发用户数与TPS之间的关系 1.  背景 在做性能测试的时候,很多人都用并发用户数来衡量系统的性能,觉得系统能支撑的并发用户数越多,系统的性能就越好:对TPS不是非常理解,也根本不知道它们之间的关系 ...

  4. 性能测试中TPS上不去的几种原因浅析

    转:https://www.cnblogs.com/imyalost/p/8309468.html 下面就说说压测中为什么TPS上不去的原因: 1.网络带宽 在压力测试中,有时候要模拟大量的用户请求, ...

  5. 性能测试相关(TPS/RT/PV等)(转)

    对于我们开发来说,我们日常最熟悉的工作就是把客户的需求实现并交付.但是,事情并不是往往就这样结束了,我们还需要后续对上线的系统进行跟踪调查,查看系统的运行情况.为什么呢?一方面,我们需要关注系统在运行 ...

  6. 性能测试:TPS和QPS的区别

    做测试,各种ps,jps,tps,qps,rps,hps,你理解几个? 技术群里,问得最多的就是tps和qps,有相似的地方,也有差异的地方,我简单谈下自己的理解.(由于比较忙,下面部分摘抄自网络) ...

  7. 性能测试中TPS上不去的原因

    TPS(Transaction Per Second):每秒事务数,指服务器在单位时间内(秒)可以处理的事务数量,一般以request/second为单位. 压测中为什么TPS上不去的原因: .网络带 ...

  8. 性能测试常用sql技巧_Oracle

    做了一段时间的性能测试,把自己在性能测试过程中,使用到的Oracle中用到的sql语句整理一番,做个备忘: (1)多个字段以某种格式拼接 "||"字符串拼接符; 示例:将" ...

  9. TPS和事务响应时间的关系、计算公式 (转)

    例子:一个高速路有10个入口,每个入口每秒钟只能进1辆车1.请问1秒钟最多能进几辆车?   TPS=102.每辆车需要多长时间进行响应?   reponse time = 13.改成20辆车,每秒能进 ...

随机推荐

  1. 类与对象 && 继承

      以下是本人的对类与对象.继承的一些理解,如有错误之处万望谅解,如有朋友愿意指正,十分乐意,万分感谢!   类与对象     类与对象是学习编程的基础(大概吧),那么何为类?何为对象呢?   一.简 ...

  2. 微信小程序组件通信

    父子通信 在子组件的对应js中 properties:{ prop名字:数据类型, prop名字:{ type:数据类型, value:默认值 } } 在父组件的wxml模板中找到子组件标签 < ...

  3. 软件目录结构规范(以python为例)

    为什么要设计好目录结构   "设计项目目录结构",就和"代码编码风格"一样,属于个人风格问题.对于这种风格上的规范,一直都存在两种态度: 一类同学认为,这种个人 ...

  4. Docker+Teamcity+Maven+SVN搭建持续集成环境

    这是使用Jenkins作为CI/CD工具,Teamcity的作用是相同的.

  5. Js重拾

    如果重新声明 JavaScript 变量,该变量的值不会丢失: 在以下两条语句执行后,变量 carname 的值依然是 "Volvo": var carname="Vol ...

  6. 如何在Qt中使用自定义数据类型

    这里我们使用下面这个struct来做说明(这里不管是struct还是class都一样): struct Player { int number; QString firstName; QString ...

  7. mtd-utils交叉编译安装

    一.获取源码并解压 存储于/home/zhangyi/work/psoc_ltp/tools-ltp-ddt中,解压后的源码存于上一层目录. 1.mtd-utils-2.0.0 wget ftp:// ...

  8. redis哨兵集群配置

    redis 集群架构图: 需要先配置redis主从,我这边是单机部署的. 采用一主一从,两个sentinel. redis host: 172.31.11.235 redis-master port: ...

  9. Vue学习——学习vue必须了解的几个知识点

    node.js介绍 Node 是一个让 JavaScript 运行在服务端的开发平台,使用JavaScript也可以开发后台服务.说明白些它仅仅是一个平台,我们使用vue开发必须要安装node.js. ...

  10. WindowsService(Windows服务)开发步骤

    https://www.cnblogs.com/moretry/p/4149489.html