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性能调优原则
并不是每个程序都需要调优.如果一个程序性能表现和预期一样,你不必付出额外的精力去提高它的性能.然而,在程序调试完成之后,很难马上就满足它的性能需求,于是就有了调优这项工作.无论哪种编程语言,对应用程序 ...
随机推荐
- WCF入门学习1-最简单的一次通信
跟着msdn的教程试了一下wcf,真心好用 1.先创建一个wcf服务库,是服务类库,远程的lib 2.全部按照默认设置,不修改.然后点发布,会出现一个wcf测试客户端,可以看有没有发布成功. 3.ms ...
- 如何在 Ubuntu 和 CentOS 上启用 Nginx 的 HTTP/2 协议支持
HTTP/2 是 HTTP 网络协议的主要修订版本,其专注于 HTTP 协议的性能改进.HTTP/2 协议的目标是减少延迟,并且允许在 Web 浏览器和服务器之间的一个连接上并行发起多个请求,因此 W ...
- 深入浅出分析MySQL常用存储引擎
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...
- alsa project
http://www.alsa-project.org/main/index.php/Main_Page
- vue的数组如何存储数据
vue 和 angular 还有有些区别的, 比如,vue中的数组数据改变后,view并没有发生改变,angular就不会这样. 所以VUE 在数组扩展方法中提供以了一个新的API arr.$set( ...
- angularJS绑定数据中对标签转义的处理二 与pre标签的使用
一.问题 默认情况下,angularJS绑定的数据为字符串文本,不会对其中包含的html标签进行转义生成格式化的文本.在实际工作时碰到接口返回的数据带有html格式时该如何处理. 二.解决办法 1.引 ...
- TensorFlow机器学习框架-学习笔记-001
# TensorFlow机器学习框架-学习笔记-001 ### 测试TensorFlow环境是否安装完成-----------------------------```import tensorflo ...
- wp中的位图
// // 摘要: // 使用提供的元素和变换初始化 System.Windows.Media.Imaging.WriteableBitmap 类的新实例. // // 参数: // element: ...
- 如何在Windows Server 2008 R2下搭建FTP服务
在Windows Server 2008 R2下搭建FTP服务,供客户端读取和上传文件 百度经验:jingyan.baidu.com 工具/原料 Windows Server 2008 R2 百度经验 ...
- uboot中DEBUG定义
uboot的debug定义在include/common.h中 #ifdef DEBUG #define debug(fmt, args...) printf(fmt, ##args) #defin ...