• 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。

  • 相关阅读:
    Python之迭代器,生成器
    Python函数--装饰器进阶
    Python之函数的本质、闭包、装饰器
    Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链
    Python函数的定义与调用、返回值、参数
    Python之文件操作
    Python之集合
    基本数据类型补充,深浅copy
    Python基础-元组、列表、字典
    Python常用模块(一)
  • 原文地址:https://www.cnblogs.com/yanghuahui/p/4757151.html
Copyright © 2020-2023  润新知