GC浅析之三-性能调优经验总结
性能调优经验总结
问题的出现:
在日常环境下,以某server 为例,该机器的每秒的访问量均值在368左右,最大访问量在913。对外提供服务的表现为每两三个小时就有秒级别的时间客户端请求超时,在访问量增大的情况下用户请求超时频率明显增多。
现象的直接分析:
通过监控GC发现该现象,GC中比较频繁的出现promotion failed和concurrent mode failure。由于promotion failed产生的直接原因为在发送YGC时,old区因为碎片、可用空间不够,造成无法晋升对象。在某server这个case下:由于线上配置了XX:+UseCMSCompactAtFullCollection,使用CMS回收old区内存时进行碎片压缩。猜测promotion failed的原因应该就是old区内存不够而不是碎片引起的。有太多对象,太频繁地被晋升成为到了old区,或者old区的对象一直没有被回收,引发晋升到old区不成功。
根据现象对被测server猜测:
server长轮询功能前:server服务的请求类型有如下几种
1)sdk各种查询、发布
2)client短轮询
3)client同步获取配置
server端中内存中的对象根据生命周期长度可以分以下2类
1)响应服务而创建的临时变量
2)监控数据订阅者数量和被订阅配置个数的一个数据结构
其中前者的数量会远远超过后者,所以在-XX:NewSize=2g -XX:MaxNewSize=2g -XX:SurvivorRatio=10的配置下,只有很少的对象被晋升到old区。
从监控的数据中也可以看到长轮询发布以前server的Minor GC和CMS GC的次数统计
- Minor GC的次数和QPS有关
- CMS 平均每天只发生 0.几次
server长轮询功能发布后:server服务的请求类型有如下几种
1)sdk各种查询、发布
2)client短轮询
3)client长轮询
4)client同步获取配置
server端中内存中的对象根据生命周期长度可以分以下3类
1)响应服务而创建的临时变量 [一次请求的RT]
2)响应长轮询而创建的变量 [长轮询hold时间30s]
3)监控数据订阅者数量和被订阅配置个数的数据结构[一直活着]
4)监控长轮询客户端数量和订阅配置个数的数据结构[一直活着]
猜测结论:长轮询引发。原因随着长轮询的请求量越来越大,在JVM内存配置不变和总QPS不变的情况下,系统每次Minor GC可以回收的空间会越来越少。每次Minor GC,copy到survivor区的对象会变多,并且配置2G新生代+SurvivorRatio=10的情况下,长轮询使用的内存至少存活30s,造成了很多对象被晋升到old区。最终造成了promotion failed、concurrent mode faliure的发生。
真实情况模拟验证猜测:
- 测试环境准备:
硬件信息:
实体机一台:16核心。主频:2.27。Linux iSearch006030.sqa.cm4 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux。内存:24G。
软件信息:
服务器:某 server
主要启动参数配置: -Xms4g -Xmx4g -XX:NewSize=2g -XX:MaxNewSize=2g -XX:PermSize=128m -XX:MaxPermSize=256m -XX:SurvivorRatio=10 -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/***/logs -verbose:gc -Xloggc:/home/nami.zft/****/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=10000 -Dsun.net.client.defaultReadTimeout=30000 -Dsun.security.ssl.allowUnsafeRenegotiation=true
- 数据分析与准备:
将日常环境server端的所有数据拉下来,数据中419个group,32,787 个dataId,大小为151 MB。将数据整理,发布到server,确保测试server 的cache 与日常环境一致。
经过统计长轮询与端轮询的比例大约是1:1.5,长短轮询post占总请求操作的90%,其中并且get请求占10%。为了加快现象的发生,长轮询的每秒存活数量在1500,短轮询每秒的请求数量在1000,change config每秒在200,get config在200。
- 测试开始以及结果:

图一 在10个并发下,用户请求的qps 变化图

图二jvm old区内存使用率

图三GC时间
性能分析:在前面所述的压力下,8分钟就开始重现日常环境的现象。由于关于服务器的各项性能指标来看,cup,load,磁盘使用,服务器内存全部磁盘io没有到达瓶颈,所以就不一一给图分析。在10个并发下成功的tps在15.48分的时候开始下跌,并且呈现不稳定状况,如图一。可以从图二看到Old区从压力开始的2分钟后开始直线状增加,开始的11分钟开始old区利用率到达100%并且维持住,证明old区必定有些对象一直没被释放掉。于是在图三就出现了Full 的时间越来越长。
原因定位:通过dump heap发现确实有一个对象存活的时间特别长,占住old区导致old 区不能被释。定位于66.3%的对内存耗费在org.apache.catalina.session.StandardManager对象上,参考Tomcat容器中的实现,认定内存耗费在session对象上,并且发现这个session存活的时间味哦30分钟。参考blog http://ddupnow.iteye.com/blog/621619。于是导致了YGC晋升失败。

解决方案:缩短session时间
结果验证:
在测试环境保证与上一步骤保持一致的前提下,缩短session时间。同样的性能场景回放。Jvm的使用率在11%左右,full GC在两个小时内只进行了一次full GC,结果如下图所示。进一步验证是通过提高并发数到200个并发以及性能测试的时间时间加大到2天,。TPS保持在稳定1k左右,Full GC的次数为1,old区也最终趋于稳定。



GC浅析之三-性能调优经验总结的更多相关文章
- JVM性能调优经验总结
本文转载自JVM性能调优经验总结 说明 调优是一个循序渐进的过程,必然需要经历多次迭代,最终才能换取一个较好的折中方案. 在JVM调优这个领域,没有任何一种调优方案是适用于所有应用场景的,同时,切勿极 ...
- jvm 性能调优 经验总结---转
最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录. 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...
- 一份 Tomcat 和 JVM 的性能调优经验总结!拿走不谢
Tomcat性能调优 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创建 ...
- 46张PPT弄懂JVM、GC算法和性能调优!
来源:cnblogs.com/cyfonly/p/5807121.html 本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述. ...
- 【JAVA进阶架构师指南】之五:JVM性能调优
前言 首先给大家说声对不起,最近属实太忙了,白天上班,晚上加班,回家还要收拾家里,基本每天做完所有事儿都是凌晨一两点了,没有精力再搞其他的了. 好了,进入正题,让我们来聊聊JVM篇最后一个章节 ...
- 鲲鹏性能优化十板斧——鲲鹏处理器NUMA简介与性能调优五步法
TaiShan特战队六月底成立,至今百日有余,恰逢1024程序员节,遂整理此文,献礼致敬!希望能为广大在鲲鹏处理器上开发软件.性能调优的程序员们,提供一点帮助.从今天开始,将陆续推出性能调优专题文章. ...
- 鲲鹏性能优化十板斧之前言 | 鲲鹏处理器NUMA简介与性能调优五步法
鲲鹏处理器NUMA简介 随着现代社会信息化.智能化的飞速发展,越来越多的设备接入互联网.物联网.车联网,从而催生了庞大的计算需求.但是功耗墙问题以功耗和冷却两大限制极大的影响了单核算力的发展.为了满足 ...
- Hbase性能调优(一)
转自:https://blog.csdn.net/yueyedeai/article/details/14648111 1.修改Linux配置 Linux系统最大可打开文件数一般默认的参数值是1024 ...
- 成为Java GC专家(5)—Java性能调优原则
并不是每个程序都需要调优.如果一个程序性能表现和预期一样,你不必付出额外的精力去提高它的性能.然而,在程序调试完成之后,很难马上就满足它的性能需求,于是就有了调优这项工作.无论哪种编程语言,对应用程序 ...
随机推荐
- 【Android】8.3 自定义主题
分类:C#.Android.VS2015: 创建日期:2016-02-17 一.简介 在Android系统中,除了内置的主题外,开发人员还可以自定义主题.一般通过在Resources/value文件夹 ...
- leetcode ---双指针+滑动窗体
一:Minimum Size Subarray Sum(最小长度子数组的和O(N)) 题目: Given an array of n positive integers and a positive ...
- Ubuntu12.04下tomcat的安装与配置
1.下载tomcat 我的tomcat是从 http://tomcat.apache.org/download-70.cgi 这里下载的tar.gz版本的. 2.解压tomcat $sudo tar ...
- http,javascript的编码解码
http,javascript的编码解码 请求与响应的编码应分开分析 两者的编码,解码处理是相对独立的流程 依赖于相对独立的header: request header, response heade ...
- ClouderaManager之CDH-LZO配置
CDH-LZO配置 下载和CDH版本对应的hadoop-lzo版本 如下: 下载地址:http://archive.cloudera.com/gplextras5/parcels/ 需要下载如下三个文 ...
- mysql linux 区分大小写
查看大小写区分 mysql> show variables like "%case%"; +------------------------+-------+ | Varia ...
- Android.util.Log 关于Android开发中打印log
日常Android开发真机调试过程经常会遇到系统日志过多过快,想看的内容一闪而过的问题.而自定义些log可以很好的解决这些问题. 代码中添加 log androidsdk中提供了log输出的ap ...
- c++重载后置++和--
c++语言并不要求递增和递减运算符必须是类的成员,但是因为它们改变的正好是所操作对象的状态,所以建议将其设定为成员函数.(但下面的代码为了练习,还是分别采用成员函数和全局函数的方式实现) 业余实现代码 ...
- js实现分页的几个源码,看完基本就懂了
第一种: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...
- 千兆网口POE供电
一.IEEE802.3af与at标准的解析 链接:http://www.winchen.com.cn/ShowNews2.asp?ID=21&ClassID=1 2003 年6 月,IEEE ...