小米Talos GC性能调优实践


  本文讲述了关于Talos GC性能调优的实践过程。

往期文章回顾:小米数据收集利器:AgentSource

背景

Talos作为小米自研的消息队列,在公司内部已经有了较为广泛的应用,支持了多个重点的离线和在线业务,随之而来的是业务对性能更高的要求。而对消息队列来说,最关键的性能指标不外乎吞吐和延时。对于吞吐,因为Talos的设计思想就是面向吞吐型的消息队列,再加上前文(Talos网卡负载优化:基于个性化一致性哈希的负载均衡)中所述Talos对网卡负载的优化,吞吐性能已经不是Talos的瓶颈。在高吞吐的场景下,Talos仍待解决的是GC问题对延时的影响,前文(万亿级消息背后:小米在消息队列的实践)中介绍了Talos在GC问题上经历的三个阶段,本文将详细介绍各阶段遇到的问题和解法。

>>>>

CMS中的重要概念

1.分代回收

目前主流的垃圾回收都采用“分代回收“的思路,CMS虽然是一款针对老年代的垃圾收集器,但仍免不了和年轻代打交道,因此这里简单描述一下”分代回收“思想。

年轻代:包含一个Eden区和两个Survivor区,其中Eden区是对象产生的区域,Survivor区主要存储存活着但还不能晋升到老年代的对象

老年代:存放常驻内存对象的区域

分代回收:当Eden区满时,会发生一次年轻代回收(Young GC),将仍存活的对象复制到一个Survivor区,当这个Survivor区满时,存活但没有达到晋升条件的对象全部被复制到另一个Survivor区中,达到晋升条件的对象则被放入老年代;当老年代空间使用率达到阈值,触发一次老年代回收(Old GC),将老年代中已经”死掉“的对象清理掉。需要注意的是,常说的Full GC是包含年轻代回收和老年代回收的。

2. CMS原理简述

CMS(Concurrent Mark Sweep),是一种以牺牲吞吐量为代价来缩短应用停顿时间的、垃圾收集过程中的大部分线程可以和应用线程并发执行的、面向老年代的、采用并发标记-清除算法的垃圾收集器,一次CMS GC的主要过程如下(灰色代表应用线程,黑色代表GC线程,其中Initial-mark和Remark阶段会暂停应用进程的执行,称为Stop the world(STW)):

Initial-mark:标记老年代中所有能被年轻代和GC Root直接引用的对象(GC Root可以理解为本次GC时肯定不会被回收的部分对象,例如静态变量)

Marking/Pre-cleaning:Marking表示在应用程序运行的同时遍历Initial-mark阶段标记出来的对象,并递归扫描这些对象可达的所有对象(标记出老年代中所有存活的对象);Pre-cleaning表示清理应用程序并发执行时出现的引用关系变化,例如刚晋升的对象和直接分配在老年代的对象

Remark:暂停所有应用线程,重新扫描堆中的对象,在开始清理之前保持标记的正确性,查找在并发标记阶段漏掉的对象

Concurrent Sweeping:回收被标记为不可达的对象,这一阶段存活的对象并没有发生移动

3.内存碎片问题

了解”标记-清除“算法的同学应该知道这种方法将会产生大量的内存碎片,这是因为:CMS将内存空间划分成一个个的网格,内存是连续分配的,但回收时只收集”死亡“的对象,不关心仍存活的对象。因此当应用程序执行一段时间后,必然会出现大量不连续的空闲内存碎片,导致老年代虽然还有很大剩余空间,但无法找到足够大的连续空间来分配申请的对象,触发Full GC(Promotion failed)

4.Floating Garbage 问题

在并发清理阶段,用户线程仍在运行,如果产生新的垃圾,在此次GC中无法得到处理,只能等到下次清理,这些对象称为Floating Garbage。当Floating Garbage过多导致内存空间不足,那么CMS GC过程中就会出现Full GC(Concurrent Mode Failure)

>>>>

Talos+CMS遇到的问题

了解CMS的重要概念之后,本节将重点介绍在实践中遇到的问题。Talos最初使用的垃圾收集器是CMS,在吞吐量不大的集群CMS能够很好的工作,但是在一些业务流量特别大的集群(特别是在线业务),会频繁遇到Full GC的问题,对延时造成极大影响,这里将问题分为两个阶段:

1.频繁Full GC阶段

关键参数:

堆大小为20GB,其中年轻代占7GB(survivor区896MB,Eden区5.25GB),老年代占13GB

-Xmx20480m

-Xms20480m

-Xmn7680m

-XX:SurvivorRatio=6

-XX:MaxTenuringThreshold=3

-XX:CMSInitiatingOccupancyFraction=70

问题描述:

Talos 进程每隔几秒出现一次耗时4秒左右的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值