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

问题:

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

开启NM的jmx监控

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

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

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

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

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

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

:/home/yarn/log# diff Mon\ Aug\ 24\ 04\:30\:02\ PDT\ 2015.log Mon\ Aug\ 24\ 19\:30\:01\ PDT\ 2015.log 
4,10c4,10
<    1:         33014      312864176  [C
<    2:         90784       11817968  <constMethodKlass>
<    3:         90784       11632640  <methodKlass>
<    4:          7756        8908000  <constantPoolKlass>
<    5:          7756        5780072  <instanceKlassKlass>
<    6:          6493        4882976  <constantPoolCacheKlass>
<    7:         21287        3447608  [B
---
>    1:         33219      622929048  [C
>    2:         90897       11830824  <constMethodKlass>
>    3:         90897       11647104  <methodKlass>
>    4:          7807        8948632  <constantPoolKlass>
>    5:          7807        5810392  <instanceKlassKlass>
>    6:          6543        4913344  <constantPoolCacheKlass>
>    7:         21346        3470040  [B

利用java工具

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

 看到的东西也不够明了

 

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

定位到shell.java的代码

原来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。

posted @ 2015-08-25 13:20 yanghuahui 阅读(...) 评论(...) 编辑 收藏