Nodemanager Out of heap memory[fix bug全过程]

时间:2022-04-15 03:40:37

问题:

自己写了一个yarn上的application,发现nodemanager过段时间,会out of memory退出,把nodemanager的heap memory从1G增大到2G也是无法避免NM程序OOM

开启NM的jmx监控

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port= -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

然后用jconsole连接,如下图所示

Nodemanager Out of heap memory[fix bug全过程]

然后主要内存都在old gen里头占用,perform GC也是没有效果,说明内存都是在被引用着。

写了一个crontab半小时生成一份内存对象数据

*/ * * * * jmap -histo:live  > /home/yarn/log/`date`.log

对比发现主要的内存增长几乎都在[C这个类中,因为instances数目基本不增长,只是size增长,大概猜想是因为stringbuilder的不停append导致

:/home/yarn/log# diff Mon\ Aug\ \ \:\:\ PDT\ .log Mon\ Aug\ \ \:\:\ PDT\ .log
,10c4,
< : [C
< : <constMethodKlass>
< : <methodKlass>
< : <constantPoolKlass>
< : <instanceKlassKlass>
< : <constantPoolCacheKlass>
< : [B
---
> : [C
> : <constMethodKlass>
> : <methodKlass>
> : <constantPoolKlass>
> : <instanceKlassKlass>
> : <constantPoolCacheKlass>
> : [B

利用java工具

jmap -dump:live,format=b,file=xxx.xxx [pid]
jhat -J-Xmx1024M [file]

看到的东西也不够明了

Nodemanager Out of heap memory[fix bug全过程]

最后打算用mat来图形化的分析下问题,https://eclipse.org/mat/

Nodemanager Out of heap memory[fix bug全过程]

定位到shell.java的代码

Nodemanager Out of heap memory[fix bug全过程]

原来nodemanager这边启动一个command之后,一直会记录标准错误输出到一个变量,这个变量在程序运行期间一直不会被释放,GC也无法回收空间,找到问题之后,解决办法就很简单了。启动一个命令的时候把标准输出和错误输出都定位到一个文件,不让nodemanager去接收即可。如下

    // Add log redirect params
vargs.add("1>>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/"
+ VoidboxConfiguration.VOIDBOX_PROXY_LOG_FILENAME);
vargs.add("2>>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/"
+ VoidboxConfiguration.VOIDBOX_PROXY_LOG_FILENAME);

不过这边NM这个潜在的bug还是需要fix的,不能因为程序的一些考虑不周到,而影响了自身的稳定。

建议可以对errMsg做rotate。