問題描述:
???????? 探索環(huán)境中的yarn的ResourceManager的內(nèi)存隨著使用時(shí)間不斷的變大,最終導(dǎo)致用戶無(wú)法訪問yarn的資源管理頁(yè)面,并且整個(gè)集群的調(diào)度變得異常緩慢,最終導(dǎo)致隔一段時(shí)間就需要重啟一下Yarn。
問題分析:
1.最先想到的是由于內(nèi)存泄漏導(dǎo)致主到,因此到集群上取Dump文件,最開始使用的是命令(jmap
-dump:live,format=b,file=dump.hprof 22439)獲取dump文件的贸呢,但是導(dǎo)致的一個(gè)結(jié)果就是把ResourceManager搞掛了镰烧,后來才知道是因?yàn)樘剿鳝h(huán)境的yarn使用的是G1垃圾回收機(jī)制,對(duì)于G1垃圾回收機(jī)制楞陷,使用上面的方式可能會(huì)將進(jìn)程搞掛掉怔鳖,改成下面的命方式即可成功的獲取dump文件:jmap-J-d64 -dump:live,format=b,file=yarn-22439.dump 22439? 。
2.通過對(duì)dump文件的內(nèi)存泄漏檢測(cè)分析固蛾,發(fā)現(xiàn)
在類AsyncDispatcher中的一個(gè)屬性(BlockingQueue eventQueue)的對(duì)象占用了大量的內(nèi)存结执,因此懷疑是該對(duì)象發(fā)生了內(nèi)存泄漏。
3. 通過類AsyncDispatcher的源碼艾凯,發(fā)現(xiàn)其內(nèi)部類GenericEventHandler會(huì)在處理消息的時(shí)候?qū)⑸厦鎽岩墒莾?nèi)存泄漏的對(duì)象eventQueue的size打印出來献幔,因此決定查看線上yarn的日志,看此隊(duì)列的長(zhǎng)度
下圖是列出的隊(duì)列的長(zhǎng)度趾诗,可明顯可以看出該隊(duì)列的尺寸達(dá)到了上千萬(wàn)蜡感,這肯定是有問題的。而正常的大集群的日志中隊(duì)列的長(zhǎng)度只有幾千恃泪,很明顯該對(duì)象是有問題的郑兴。
4.再通過內(nèi)存分析工具發(fā)現(xiàn),上述有異常的隊(duì)列中存放的都是ContainerFinishedEvent和ContainerCreatedEvent對(duì)象贝乎,因此去查看該對(duì)象是在哪被創(chuàng)建和消費(fèi)的情连。
5. 通過對(duì)源碼進(jìn)行分析定位到ContainerFinishedEvent事件是在類SystemMetricsPublisher中被消費(fèi)掉的,該類是將ContainerFinishedEvent封裝成TimelineEntity實(shí)體之后通過Http的post方式發(fā)送給yarn的TimelineServer進(jìn)程览效。
6. 綜上分析却舀,目前的主要原因是由于消費(fèi)者(也就是往TimelineServer發(fā)送Event事件數(shù)據(jù))發(fā)送數(shù)據(jù)的能力不夠虫几,導(dǎo)致消息隊(duì)列中緩存的大量的消息,隨著時(shí)間的推移挽拔,消息數(shù)據(jù)不斷增多辆脸,從而導(dǎo)致yarn內(nèi)存不夠用,從而需要重啟篱昔。
問題的解決:
方案一每强、
通過分析SystemMetricsPublisher的源碼發(fā)現(xiàn),如下圖中標(biāo)記的的代碼州刽,可以控制是否向TimelineServer發(fā)送測(cè)量數(shù)據(jù),標(biāo)記的代碼對(duì)應(yīng)的參數(shù)的值為:
yarn.timeline-service.enabled 和 yarn.system-metrics-publisher.enabled
于是將yarn.system-metrics-publisher.enabled的值設(shè)置為false浪箭,也就是關(guān)閉了發(fā)送測(cè)量數(shù)據(jù)的功能穗椅,問題解決。
方案二奶栖、
通過分析SystemMetricsPublisher的源碼發(fā)現(xiàn)匹表,在創(chuàng)建分發(fā)器的時(shí)候,有個(gè)參數(shù)(yarn. system-metrics-publisher.dispatcher.pool-size 宣鄙,默認(rèn)值為10)可以控制發(fā)送的線程池的數(shù)量袍镀,通過增大該值,理論上應(yīng)該也是可以解決該問題的冻晤,但沒有具體測(cè)試苇羡,因?yàn)槭蔷€上環(huán)境。