HBase GC的前生今世 - 身世篇
网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,提供稳定流畅、低时延、高并发的视频直播、录制、存储、转码及点播等音视频的PAAS服务,在线教育、远程医疗、娱乐秀
网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,提供稳定流畅、低时延、高并发的视频直播、录制、存储、转码及点播等音视频的PAAS服务,在线教育、远程医疗、娱乐秀场、在线金融等各行业及企业用户只需经过简单的开发即可打造在线音视频平台。现在,网易视频云的技术专家给大家分享一则技术文:HBase GC的前生今世 - 身世篇。
在之前的HBase BlockCache系列文章中已经简单提到:使用LRUBlockCache缓存机制会因为CMS GC策略导致内存碎片过多,从而可能引发臭名昭著的Full GC,触发可怕的’stop-the-world’暂停,严重影响上层业务;而Bucket Cache缓存机制因为在初始化的时候就申请了一片固定大小的内存作为缓存,缓存淘汰不再由 JVM管理,数据Block的缓存操作只是对这篇空间的访问和覆盖,因而大大减少了内存碎片的出现,降低了Full GC发生的频率。那CMS GC策略如何导致内存碎片过多?内存碎片过多如何触发Full GC?HBase在演进的道路上又如何不断优化CMS GC?接下来这个系列《HBase GC的前生今生》将会为你一一揭开谜底,这个系列一共两篇文章,本篇文章-’身世篇’将会带你全面了解HBase的GC机制,后面一篇-’演进篇’将会给你道出HBase在发展的道路上如何不断对Full GC进行优化。
Java GC概述
整个HBase是构建在JVM虚拟机上的,因此了解HBase的内存管理机制以及不同缓存机制对GC的影响,就必须对Java GC有一个全面的了解。至于深入地理解Java GC 的工作原理,不在本文的讨论范围之内;当然,如果已经对Java GC比较熟悉,也可以跳过此节。
Java GC建立在这样一个假设基础上的:大多数内存对象要么生存周期比较短,很快就会没人引用,比如处理RPC请求的buffer可能只会生存几微秒;要么生存周期比较长,比如Block Cache中的热点Block,可能就会生存几分钟,甚至更长时间。基于这样的事实,JVM将整个堆内存分为两个部分:新生代(young generation)和老生代(tenured generation),除此之外,JVM还有一个非堆内存区-Perm区,主要存放class信息以及其他meta元信息,内存结构如下图所示:
其中Young区又分为Eden区和两个Survivor 区:S0和S1。一个内存对象在创建之后,首先会为其在新生代申请一块内存空间,如果这个对象在新生代存活了很长时间,会将其迁移到老生代。 在大多数对延迟敏感的业务场景下(比如HBase),建议使用如下JVM参数,-XX:+UseParNewGC和XX:+UseConcMarkSweepGC,其中前者表示对新生代执行并行的垃圾回收机制,而后者表示对老生代执行并行标记-清除垃圾回收机制。可见,JVM允许针对不同内存区执行不同的GC策略。
新生代GC策略 – Parallel New Collector
根据上文所述,对象初始化之后会被放入Young区,更具体的话应该是Eden区,当Eden区满了之后,会进行一次GC。GC算法会检查所有对象的引用情况,如果某个对象还有被引用,表示该对象存活。检查完成之后,会将这些存活的对象移到S0区,并且回收整个Eden区空间,称为一次Minor GC;接着新对象进来,又会放入Eden区,满了之后会检查S0和Eden区存活的对象,将所有存活的对象移到S1区,再回收整个S0和Eden区空间;很容易理解,S0和S1两个区总会有一个区是预留给下次存放存活对象用的。
整个过程可以使用如下图示:
这种算法称为复制算法,对于这种算法,有两点需要关注:
1. 算法会执行’stop-the-world’暂停,但时间非常短。因为Young区通常会设置的比较小(一般不建议不超过512M),而且JVM会启动大量线程并发执行,一次Minor GC一般都会在几毫秒内完成
2. 不会产生碎片,每次GC之后都会将存活的对象放入连续的空间(S0或S1)
内存中所有对象都会维护一个计数器,每次Minor GC移动一个对象之后,都会为这个对象的计数器加一。当计数器增加到一定阈值之后,算法就会认为该对象生命周期很长,会将其移入老生代。该阈值可以通过JVM参数XX:MaxTenuringThreshold指定。
老生代GC策略 – Concurrent Mark-Sweep
每次执行Minor GC之后,都会有部分生命周期较长的对象被移入老生代,一段时间之后,老生代空间也会被占满。此时就需要针对老生代空间执行GC操作,此处我们介绍Concurrent Mark-Sweep(CMS)算法。CMS算法整个流程分为6个阶段,其中部分阶段会执行 ‘stop-the-world’ 暂停,部分阶段会和应用线程一起并发执行:
1. initial-mark:这个阶段虚拟机会暂停所有正在执行的任务。这一过程虚拟机会标记所有 ‘根对象’,所谓‘根对象’,一般是指一个运行线程直接引用到的对象。虽然会暂停整个JVM,但因为’根对象’相对较少,这个过程通常很快。
2. concurrent mark:垃圾回收器会从‘根节点’开始,将所有引用到的对象都打上标记。这个阶段应用程序的线程和标记线程并发执行,因此用户并不会感到停顿。
3. concurrent precleaning:并发预清理阶段仍然是并发的。在这个阶段,虚拟机查找在执行mark阶段新进入老年代的对象(可能会有一些对象从新生代晋升到老年代, 或者有一些对象被分配到老年代)。
4. remark:在阶段3的基础上对查找到的对象进行重新标记,这一阶段会暂停整个JVM,但是因为阶段3已经欲检查出了所有新进入的对象,因此这个过程也会很快。
5. concurrent sweep:上述3阶段完成了引用对象的标记,此阶段会将所有没有标记的对象作为垃圾回收掉。这个阶段应用程序的线程和标记线程并发执行。
6. concurrent reset:重置CMS收集器的数据结构,等待下一次垃圾回收。
相应的,对于CMS算法,也需要关注两点:
1. ‘stop-the-world’暂停时间也很短暂,耗时较长的标记和清理都是并发执行的。
2. CMS算法在标记清理之后并没有重新压缩分配存活对象,因此整个老生代会产生很多的内存碎片。
CMS Failure Mode
上文提到在正常的情况下CMS整个流程的暂停时间都是很短的,一般也就在10ms~100ms左右。然而这与线上的情况并不相符,线上集群在读写压力很大的情况下,经常会出现长时间的卡顿,有些卡顿甚至长达几分钟,导致很严重的读写阻塞,甚至会造成Region Server和Zookeeper之间Session超时,使得Region Server异常离线。实际上,CMS并不是很完美,它会在两种场景下产生严重的Full GC,接下来分别进行介绍。
Concurrent Failure
这种场景其实比较简单,假如现在系统正在执行CMS回收老生代空间,在回收的过程中新生代来了一批对象进来,不巧的是,老生代已经没有空间再容纳这些对象了。这种场景下,CMS回收器会停止继续工作,系统进入 ’stop-the-world’ 模式,并且回收算法会退化为单线程复制算法,重新分配整个堆内存的存活对象到S0中,释放所有其他空间。很显然,整个过程会非常’漫长’。但是这种问题也很容易解决,只需要让CMS回收器更早一点回收就可以避免。JVM提供了参数-XX:CMSInitiatingOccupancyFraction=N来设置CMS回收的时机,其中N表示当前老生代已使用内存占新生代总内存的比例,该值默认为68,可以将该值修改的更小使得回收更早进行。
Promotion Failure
假设此时设置XX:CMSInitiatingOccupancyFraction=60,但是在已使用内存还没有达到总内存60%的时候,已经没有空间容纳从新生代迁移的对象了。oh,my god!怎么会这样?罪魁祸首就是内存碎片,上文中提到CMS算法会产生大量碎片,当碎片容量积累到一定大小之后就会造成上面的场景。这种场景下,CMS回收器一样会停止工作,进入漫长的 ’stop-the-world’ 模式。JVM也提供了参数 -XX: UseCMSCompactAtFullCollection来减少碎片的产生,这个参数表示会在每次CMS回收垃圾之后执行一次碎片整理,很显然,这个参数会对性能有比较大的影响,对HBase这种对延迟敏感的业务来说并不是一个完美解决方案。
HBase内存碎片统计实验
在实际线上环境中,很少出现Concurrent Failure模式的Full GC,大多数Full GC场景都是Promotion Failure。我们线上集群也会每隔半个月左右就会因为Promotion Failure触发一次Full GC。为了更好地理解CMS策略下内存碎片是如何触发Promotion Failure,接下来我们做一个简单的实验:JVM提供了参数 -XX:PrintFLSStatistics=1来打印每次GC前后内存碎片的统计信息,统计信息主要包括3个维度:Free Space、Max Chunk Size和Num Chunks,其中Free Space表示老生代当前空闲的总内存容量,Max Chunk Size表示老生代中最大的内存碎片所占的内存容量大小,Num Chunks表示老生代中总的内存碎片数。我们在测试环境集群(共4台Region Server)将这个参数设置为1,然后使用一个客户端YCSB执行Read-And-Write操作,分别统计日志中Free Space和Max Chunk Size两个指标随时间的变化情况。
测试结果如下图所示,其中第一张图表示Total Free Space随时间的变化曲线图,第二张图表示Max Chunk Size随时间变化曲线图。其中横坐标表示时间,纵坐标表示相应内存大小。
根据第一张曲线图可知,老生代总的空闲内存容量维持在300M~400M之间,当内存容量到达300M左右时就会进行一次GC,GC后内存容量就会又回到400M左右。而第二张曲线图会更加形象地说明内存碎片导致的Promotion Failure,刚开始随着数据不断写入,Max Chunk Size会不断变小,之后很长一段时间基本维持在30M左右。在横坐标为1093那点,人为地将写入的单条数据大小由500Byte变为5M大小,此后Max Chunk Size会再次减小,当减小到一定程度之后曲线会忽然升高到350M左右,经过日志确认,此时JVM发生了Promotion Failure模式的Full GC,持续时间约4.91s。此后一段时间Full GC还在持续发生。
经过上述分析,可以知道:CMS GC会不断产生内存碎片,当碎片小到一定程度之后就会基本维持不变,如果此时业务写入一些单条数据量很大的KeyValue,就有可能触发Promotion Failure模式Full GC。
总结
本文首先介绍了两种常见的Java GC策略,再接着介绍了CMS策略可能引起两种模式的Full GC,最后通过一个小实验说明了CMS GC确实产生了内存碎片,而且会导致长时间的Full GC发生。接下来《演进篇》会详细介绍从一开始HBase是如何针对CMS进行优化处理的,敬请期待!
Categories:更多技术交流,请关注我们进行交流与咨询哦!
핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











단편 동영상 플랫폼의 등장으로 Douyin은 모든 사람의 일상생활에 없어서는 안 될 부분이 되었습니다. TikTok에서는 전 세계의 흥미로운 동영상을 볼 수 있습니다. 어떤 사람들은 다른 사람의 동영상을 게시하는 것을 좋아하는데, 이는 다음과 같은 질문을 제기합니다. Douyin이 다른 사람의 동영상을 게시하면 저작권을 침해합니까? 이 글에서는 이 문제에 대해 논의하고 침해 없이 동영상을 편집하는 방법과 침해 문제를 방지하는 방법을 알려드립니다. 1. Douyin이 타인의 영상을 게시하는 것에 대한 침해인가요? 우리나라 저작권법 조항에 따르면, 저작권 소유자의 허락 없이 저작권 소유자의 저작물을 무단으로 사용하는 것은 침해입니다. 따라서 원저작자나 저작권 소유자의 허락 없이 Douyin에 다른 사람의 동영상을 게시하는 것은 침해입니다. 2. 침해 없이 동영상을 편집하는 방법은 무엇입니까? 1. 공개 도메인 또는 라이센스 콘텐츠의 사용: 공개

국민 단편 영상 플랫폼인 Douyin은 우리가 여가 시간에 재미있고 참신한 다양한 단편 영상을 즐길 수 있게 해줄 뿐만 아니라, 우리 자신을 보여주고 우리의 가치를 실현할 수 있는 무대를 제공합니다. 그렇다면 Douyin에 동영상을 게시하여 돈을 버는 방법은 무엇입니까? 이 글은 이 질문에 대해 자세히 답변하고 TikTok에서 더 많은 수익을 창출하는 데 도움이 될 것입니다. 1. Douyin에 동영상을 게시하여 수익을 창출하는 방법은 무엇입니까? 동영상을 게시하고 Douyin에서 일정 조회수를 얻은 후 광고 공유 계획에 참여할 수 있는 기회를 얻게 됩니다. 이 수입 방식은 Douyin 사용자들에게 가장 친숙한 방법 중 하나이며, 많은 창작자들의 주요 수입원이기도 합니다. Douyin은 계정 가중치, 영상 콘텐츠, 시청자 피드백 등 다양한 요소를 바탕으로 광고 공유 기회 제공 여부를 결정합니다. TikTok 플랫폼을 통해 시청자는 선물을 보내 좋아하는 크리에이터를 지원할 수 있습니다.

1. 먼저 휴대폰에서 웨이보를 열고 오른쪽 하단의 [나]를 클릭하세요(그림 참조). 2. 그런 다음 오른쪽 상단에 있는 [기어]를 클릭하여 설정을 엽니다(그림 참조). 3. 그런 다음 [일반 설정]을 찾아 엽니다(그림 참조). 4. 그런 다음 [동영상 팔로우] 옵션을 입력하세요(그림 참조). 5. 그런 다음 [동영상 업로드 해상도] 설정을 엽니다(그림 참조). 6. 마지막으로 [원본 화질]을 선택하여 압축을 방지합니다(그림 참조).

단편 동영상 플랫폼의 등장으로 Xiaohongshu는 많은 사람들이 자신의 삶을 공유하고 자신을 표현하며 트래픽을 얻는 플랫폼이 되었습니다. 이 플랫폼에서는 비디오 작품을 출판하는 것이 매우 인기 있는 상호 작용 방식입니다. 그렇다면 Xiaohongshu 비디오 작품을 출판하는 방법은 무엇입니까? 1. 샤오홍슈 영상 작품은 어떻게 출판하나요? 먼저, 공유할 비디오 콘텐츠가 준비되어 있는지 확인하세요. 휴대폰이나 기타 카메라 장비를 사용해 촬영할 수 있지만 화질과 사운드 선명도에 주의해야 합니다. 2. 영상 편집 : 작품을 더욱 돋보이게 하기 위해 영상을 편집할 수 있습니다. Douyin, Kuaishou 등과 같은 전문 비디오 편집 소프트웨어를 사용하여 필터, 음악, 자막 및 기타 요소를 추가할 수 있습니다. 3. 표지를 선택하세요. 표지는 사용자의 클릭을 유도하는 핵심 요소입니다. 사용자의 클릭을 유도할 수 있는 명확하고 흥미로운 그림을 표지로 선택하세요.

넷이즈와 마이크로소프트 블리자드가 블리자드의 전국 서버 복귀를 공식 발표했습니다. 넷이즈도 본사 건물 아래에서 축하 행사를 열었고 현장도 함께 가봤습니다! 이른 아침부터 현장 설정이 진행되었으며, 월드 오브 워크래프트, 하스스톤, 디아블로 3, 히어로즈 오브 더 스톰, 오버워치, 스타크래프트 2 등 블리자드의 모든 게임이 나열되어 있습니다. 블리자드와 넷이즈 히어로즈의 공식 발표에 주목해주세요. of the Storm은 언급되지 않았지만 이 게임에 대한 라이브 포스터가 없으므로 Heroes of the Storm을 좋아하는 플레이어는 걱정할 필요가 없습니다. Blizzard의 전체 가족이 돌아올 것입니다. 월드 오브 워크래프트(World of Warcraft)에도 특별한 관심을 기울여야 합니다. 표시된 포스터는 월드 오브 워크래프트 11.0 지구 중심 전쟁(War for the Center of the Earth)에 대한 것입니다. 당연히 메이슨이 직접 검을 복사한 이 클래식 버전은 올 여름 중국 서버에서 플레이될 예정입니다.

2024년 3월 27일, 베이징 시간, NetEase Games 및 Marvel Games는 공식적으로 새로운 게임인 슈퍼히어로 PVP 팀 슈팅 게임 "Marvel Rivals"를 발표했습니다. 플레이어는 풍부하고 다양한 슈퍼 히어로와 슈퍼 악당 라인업 중에서 자신이 좋아하는 캐릭터를 선택하여 올스타 팀을 구성하고, 고유한 초능력을 사용하여 Marvel 멀티버스의 다양한 파괴 가능한 지도에서 흥미진진한 전투에 참여할 수 있습니다. "우리는 전 세계 플레이어들에게 '마블 대결'을 선보이게 되어 매우 기쁩니다. 우리는 항상 마블 유니버스와 그 캐릭터를 사랑해 왔으며, 이 게임을 개발하게 되어 기쁘게 생각합니다." 이것은 바로 우리가 만들고 싶었던 게임이며, 이를 꿈에서 현실로 바꿀 수 있게 되어 매우 자랑스럽습니다." "NetEase

Douyin의 인기로 인해 점점 더 많은 사람들이 이 플랫폼에서 자신의 삶과 재능, 창의성을 공유하고 싶어합니다. Douyin의 15초 제한으로 인해 많은 사용자는 그것이 충분히 즐겁지 않다고 느끼고 비디오 지속 시간을 연장하기를 희망합니다. 그렇다면 Douyin의 비디오 지속 시간을 어떻게 연장할 수 있습니까? 1. 도음 15초는 너무 짧습니다. 연장하고 싶다면 어떻게 연장할 수 있나요? 1. 여러 개의 동영상을 촬영하고 이어붙이는 가장 편리한 방법은 15초짜리 동영상을 여러 개 녹화한 후 Douyin의 편집 기능을 사용하여 하나로 합치는 것입니다. 녹화할 때 나중에 연결할 수 있도록 각 비디오의 시작과 끝 부분에 약간의 공백을 남겨 두십시오. 이어진 영상의 길이는 몇 분이 될 수 있지만 이로 인해 영상 화면이 너무 자주 전환되어 시청 환경에 영향을 미칠 수 있습니다. 2. Douyin 특수 효과 및 스티커 사용 Douyin은 일련의 특수 효과를 제공합니다.

단편 동영상 플랫폼의 등장으로 Xiaohongshu는 많은 사람들이 자신의 삶을 공유하고 영감을 얻는 중요한 방법이 되었습니다. 많은 사용자가 Xiaohongshu 동영상을 시청할 때 문제에 직면할 수 있습니다. 동영상 공개 시간을 확인하는 방법은 무엇입니까? 이번 글에서는 "샤오홍슈 영상 공개 시간 확인 방법"에 대해 논의하고 워터마크 제거 및 샤오홍슈 영상 저장 방법을 공유하겠습니다. 1. 샤오홍슈 영상 공개시간은 어떻게 확인하나요? Xiaohongshu 앱에서 동영상을 열면 화면 하단에 타임스탬프가 표시되어 동영상 출시 날짜와 시간을 표시합니다. 아래로 스와이프하거나 동영상 하단으로 스크롤하면 언제 게시되었는지 쉽게 확인할 수 있습니다. 샤오홍슈에서는 동영상 게시자나 콘텐츠를 기억하고 있다면 검색창을 이용해 사용자의 닉네임이나 동영상 키워드를 입력한 후 검색을 클릭하면 됩니다. 찾다
