1. 问题背景

服务中存在大量的全量数据的接口,需要把运营平台配置的全量数据拉取下来,存在大量的大对象(结果实现服务有100M左右),传给垂域或者传给质量组监控。这就给GC带来了很大压力。
小爱5.0场景配置服务上线后,观测到服务很不稳定,经常99-percentile > 4s, 性能很不稳定。

解决方案和收益

2.1 解决方案

  1. 从根本上解决应该避免大量大对象的产生,这需要花费很大的人力成本去做迁移和重构
  2. 升级ZGC垃圾回收器(可以实现并发转移),STW非常短
  3. 修改参数
  • 让G1更早得启动混合式垃圾收集周期,通过调小-XX:InitiatingHeapOccupancyPercent=N这个参数,默认情况下该参数是45(PS:这个参数表示的是占用整个堆内存的比例),不过,这个参数也不能调得太小,否则会导致过多的并发收集周期和混合式垃圾收集,给应用早成过多的停顿。
  • 除了考虑增加速度,还可以考虑增加每次混合式垃圾收集收集的Old分区数量,通过调整-XX:G1MixedGCCountTarget=N参数可以控制每个混合式周期中回收的Old分区数量,该参数的默认值是8

2.2 收益

我们采用方案1和2结合的方式,先升级ZGC,然后等人力空闲在将全量接口服务重构迁移到合适的模块,性能尖刺基本消失,服务接口99-percentile 耗时基本在15ms一下

3. 详细过程

经过排查,我们发现G1回收过程中,对象复制(STW)花费的事件很长(> 4s),G1日志分析如下:

老区不够了,这个时候会把young区所有对象不管死活都转成old区对象,所以总的内存使用量会暴增。

to-space exhausted: 巨型对象过多导致的内存碎片,引起混合疏散失败
Object Copy: eden, suvivor的regions全变为0,这两个space的对象全部移到了old区, 导致占用非常长的时间
Evacuation Failure: 疏散失败也占用一定的影响

{Heap before GC invocations=2685 (full 0):garbage-first heap   total 4194304K, used 4030503K [0x00000006c0000000, 0x00000006c0204000, 0x00000007c0000000)region size 2048K, 1120 young (2293760K), 15 survivors (30720K)Metaspace       used 84996K, capacity 86085K, committed 86276K, reserved 1126400Kclass space    used 9716K, capacity 9960K, committed 10032K, reserved 1048576K
2022-02-18T10:36:14.280+0800: 756600.145: [GC pause (G1 Evacuation Pause)
(young)2022-02-18T10:36:18.332+0800: 756604.198: [SoftReference, 0 refs,
0.0000722 secs]2022-02-18T10:36:18.333+0800: 756604.198:
[WeakReference, 0 refs, 0.0000117 secs]2022-02-18T10:36:18.333+0800:
756604.198: [FinalReference, 0 refs, 0.0000081 secs]
2022-02-18T10:36:18.333+0800: 756604.198: [PhantomReference, 0 refs, 0 refs,
0.0000089 secs]2022-02-18T10:36:18.333+0800: 756604.198: [JNI Weak Reference,
0.0000499 secs] **(to-space exhausted)**, 4.2319898 secs][Parallel Time: 4047.8 ms, GC Workers: 28][GC Worker Start (ms): Min: 756600146.8, Avg: 756600147.2, Max: 756600147.6, Diff: 0.8][Ext Root Scanning (ms): Min: 0.6, Avg: 1.3, Max: 6.4, Diff: 5.8, Sum: 36.4][Update RS (ms): Min: 12.5, Avg: 15.2, Max: 17.2, Diff: 4.7, Sum: 426.0][Processed Buffers: Min: 18, Avg: 31.0, Max: 43, Diff: 25, Sum: 868][Scan RS (ms): Min: 1.5, Avg: 3.2, Max: 4.5, Diff: 3.0, Sum: 90.7][Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1]**[Object Copy (ms): Min: 4013.0, Avg: 4016.0, Max: 4025.6, Diff: 12.6, Sum: 112448.8]**[Termination (ms): Min: 0.0, Avg: 11.1, Max: 13.3, Diff: 13.3, Sum: 311.1][Termination Attempts: Min: 1, Avg: 1.2, Max: 3, Diff: 2, Sum: 35][GC Worker Other (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 4.3][GC Worker Total (ms): Min: 4046.6, Avg: 4047.1, Max: 4047.6, Diff: 1.1, Sum: 113317.4][GC Worker End (ms): Min: 756604194.1, Avg: 756604194.2, Max: 756604194.4, Diff: 0.3][Code Root Fixup: 0.1 ms][Code Root Purge: 0.0 ms][Clear CT: 1.9 ms][Other: 182.2 ms]**[Evacuation Failure: 163.7 ms]**[Choose CSet: 0.0 ms][Ref Proc: 3.2 ms][Ref Enq: 0.0 ms][Redirty Cards: 5.2 ms][Humongous Register: 0.5 ms][Humongous Reclaim: 4.9 ms][Free CSet: 3.1 ms][Eden: 2210.0M(2258.0M)->0.0B(2176.0M) Survivors: 30.0M->0.0B Heap: 3936.0M(4096.0M)->1400.0M(4096.0M)]
Heap after GC invocations=2686 (full 0):garbage-first heap   total 4194304K, used 1433600K [0x00000006c0000000, 0x00000006c0204000, 0x00000007c0000000)region size 2048K, 0 young (0K), 0 survivors (0K)Metaspace       used 84996K, capacity 86085K, committed 86276K, reserved 1126400Kclass space    used 9716K, capacity 9960K, committed 10032K, reserved 1048576K
}

3.1 修改配置

  1. sbt和scala的版本升级,sbt升级到0.13.18, scala版本升级到2.11.12
  2. 添加插件addSbtPlugin(“com.typesafe.sbt” % “sbt-native-packager” % “1.3.4”)
  3. 修改build.sbt,添加对新版packger的依赖
  4. 修改application.conf中的gc配置 -> (app.jvm.arg = ${app.jvm.medium_zgc})
  5. 修改母项目build.yaml中的部署配置

3.2 踩坑记录

  1. sbt ,scala和JDK11兼容问题
    JDK11推荐scala版本2.11.12,sbt版本0.13.18,详见https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html
  2. 部署后启动失败
    stderr里面显示The java installation you have is not up to daterequires at least version 1.6+, you have version 11.0.2,部署生成的启动脚本对java版本的比较写的有问题。
    需要对引入sbt stage的包sbt-native-packager做一下升级。升级版本后build.sbt会报错,因为bashScriptExtraDefines的字段在1.3.4中被移动到其它位置了,需要修改下引用。

3. 部署后,falcon上无日志

  1. 机器有zgc日志
  2. job ‘job.zgcmonitor_service.watcherd_cluster.c3_pdl.AI-Service_owt.AI_cop.xiaomi’ RUNNING, work 355715 (2022-01-14 16:50:17) 机器上有这个监控进程
    若没有,需要联系sre给机器加一下zgc 监控
    3) 需要联系sre给相应服务加一下zgc 监控
    3.3 需要增加的falcon监控仪表盘

//回收周期
zgc.monitor/method=max,name=Collector_Garbage_Collection_Cycle,service=ai-operation-controller

//阶段停顿时间
zgc.monitor/method=avg,name=Phase_Pause_Mark_End,service=ai-operation-controller
zgc.monitor/method=avg,name=Phase_Pause_Mark_Start,service=ai-operation-controller
zgc.monitor/method=avg,name=Phase_Pause_Relocate_Start,service=ai-operation-controller

//转移前后堆大小
zgc.monitor/method=avg,name=Memory_Heap_Used_Before_Relocation,service=ai-operation-controller
zgc.monitor/method=avg,name=Memory_Heap_Used_After_Relocation,service=ai-operation-controller

//内存分配比例
zgc.monitor/method=avg,name=Memory_Allocation_Rate,service=ai-operation-controller

3.4 监控指标观察

  1. process.cpu
    cpu相比之前占用稍微降低,考虑到刚上线两天,继续观察
  2. process.mem

“特别提到了3个视图,分别是Marked0、Marked1和Remapped,而且有趣的是这3个视图会映射到操作系统的同一物理地址。这就是ZGC中Color
Pointers的概念,通过Color Pointers来区别不同的虚拟视图。”

是配置内存4g的三倍,符合预期。因为zgc的着色指针会虚拟出三份虚拟空间,但实际占用只有一份
3. 接口监控
该接口的性能尖刺基本消失(之前由于 object copy耗时太长4s, 导致接口延时也会偶现4s),由于zgc并发转移,停顿时间非常小
4. 经验与总结

  1. 尽管现在垃圾回收器性能越来越好,给我们的code带来效率。但是我们还是得从源头来避免性能问题,注重代码规范。
  2. 需要升级java 11.0.8以上,并且升级相应的插件
  3. falcon需要SRE添加相应的job

[ZGC升级记录](to-space exhausted/Evacuation Failure)相关推荐

  1. JVM调优实战:to-space exhausted Evacuation Failure

    一次线上dubbo问题的定位,进行JVM调优实战. 问题 线上dubbo接口provider抛出异常: org.apache.dubbo.rpc.RpcException: Failfast invo ...

  2. G1 解决Evacuation Failure和Humongous Allocation

    希望您对G1有所了解.在jdk8中,我们很多会使用G1垃圾收集器,她是目前唯一跨越年轻代和年老代的垃圾收集器.里面有一个混合垃圾收集,可以清理全部的年轻代和部分年老代.G1里面东西还有很多,希望读者有 ...

  3. ASM磁盘空间假装耗尽,ORA-15041: diskgroup space exhausted

    一个DATAGUARD,当主库RESIZE扩大一个数据文件后,DG上面却不能应用这个RESIZE的操作,导致MPR进程停掉,报错如下: ORA-01237: cannot extend datafil ...

  4. python爬虫的技能_python-爬虫技能升级记录

    ====== python-爬虫技能升级记录 ====== ===== (一)感知爬虫及爬取流程 ===== 从简单存取一个页面到 爬取到大量的定量数据,对技术要求更高,以百度百科数据爬取为入门练手项 ...

  5. ORA-15260 diskgroup space exhausted Problem

    系统:WINDOWS 2008 R2 企业版 数据库:11.2.0.1 RAC 在对数据库进行写入和创建表空间的时候,数据库会报ORA-15260 diskgroup space exhausted ...

  6. 点晴免费OA系统的2017年升级记录

    点晴免费OA系统的2017年升级记录 点晴OA系统不但是永久免费,不限用户数,功能全开放,而且还提供免费客服咨询和免费升级服务,免费OA的系统升级并不是隔几个月才发布一次升级包,优化点晴OA系统不太主 ...

  7. sequelize V5 升级记录

    最近把项目中的 sequelize 由 4.38.0 升级到了 5.8.7,以下是升级记录 本文地址: shanyue.tech/post/sequel- 01 删包 从 package.json 中 ...

  8. Python3.10升级记录

    2021.10.4日,Python3.10正式版发布了,为了使用新的match语法,2021.10.8将Python3.7升级到了Python3.10,升级记录如下: 1.官方安装包: 因为不是3.X ...

  9. PlantSimulation 15.2 16.0 16.1升级记录

    PlantSimulation 15.2 16.0 16.1升级记录 Plant Simulation 16.0 中的新功能和更改功能 •我们将 JSON 添加到 SimTalk 数据类型中. 我们添 ...

  10. MAC OS升级记录

    家里有台老MAC一直在吃灰,最近拿出来使用时发现各种软件都不能使用了,安装软件时发现系统版本比较低无法安装软件.于是就想升级系统版本,下面是升级过程的记录,以便后续再升级时查阅. 1.升级时需要使用A ...

最新文章

  1. java getRuntime().exec 带符号的命令 无法执行 解决方法
  2. 左神算法:判断 t1 树是否包含t2 树全部的拓扑结构(剑指 Offer 26. 树的子结构,Java版)
  3. Python获取同目录下json文件内容
  4. Java Web之基于注解的Spring MVC环境配置
  5. python 在线编程 实现_Python进阶开发之网络编程,socket实现在线聊天机器人
  6. python入口文件_用Python作GIS之三:入口程序 - stargui.py
  7. jquery name选择器_jQuery学习(1)
  8. 《软件方法》强化自测题-需求(2)
  9. 2019年年终总结(流水账)
  10. 《女士品茶》读书笔记
  11. WinAPI之ReleaseSemaphore
  12. python爬虫qq音乐歌词_10、 在QQ音乐中爬取某首歌曲的歌词
  13. app 原形设计常用工具总结
  14. canvas 画图 android,Android 中的Canvas画图
  15. 服务器固态盘和机械盘哪个好
  16. 【面试必备】编程学java还是c
  17. 火车头采集器 页面图片等信息采集
  18. 2017南宁(重温经典)
  19. 计算机工程学院文艺例会,信息科学与工程学院学生会学生会全体例会暨部门风采展示大会...
  20. Python操作MySQL之SQLAlchemy的坑 老版本vs新版本

热门文章

  1. 检索策略(抓取策略)
  2. ICON设计的7个实用原则
  3. 边境的悍匪—机器学习实战:第十九 大规模训练和部署TensorFlow模型
  4. iPhone14 /ios16不能使用蜂窝网络(浏览器提示“未激活蜂窝数据网”)
  5. Oracle | 初级-第一章 Oracle概述
  6. 程序员坐行李箱迎寒风编码2小时,上热搜!你怎么看?
  7. exchange2016卸载报错安装程序无法卸载,因为mscorsvw(9476)具有打开的文件
  8. 一、OpenAI ChatGPT 注册使用
  9. css图片九宫格布局
  10. 虚拟机克隆的服务器怎么改mac地址,Centos6克隆虚拟机改IP和mac地址