Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

排查容器node进程内存泄漏

  • 给docker-compose文件添加如下内容,允许内部执行gcore命令

    cap_add:
      - SYS_PTRACE
    security_opt:
      - seccomp:unconfined
    
  • 在docker内安装gdb,便于使用gcore命令

    sudo apt install gdb
    
  • 通过top找到node进程PID,然后执行gcore命令

    gcore <PID>
    
    • 此命令可能造成进程阻塞,生产环境慎用
  • 从docker中取出生成的core.<PID>文件,用宿主机分析,这里必须保证宿主机也安装有相同大版本的node

  • 宿主机需要安装lldb和llnode

    • 安装前置的lldb
      sudo apt-get install lldb
      
      • 目前会自动安装lldb-14
    • 安装llnode
      sudo npm install -g llnode
      
      • 这里可能需要链接github,可能需要时间比较长,或者会失败
  • 启动llnode分析

    llnode node -c core.<PID>
    
  • 进入后,可以执行以下命令

    v8
    
    • 查看所有可用子命令
    v8 findjsobjects
    
    • 找到内部所有js对象,并输出每一种类以及总的Byte数
    v8 findinstances xxx
    
    • 可以把xxx替换为上面输出的js对象名,比如Object之类的,可以列出所有js对象地址
    v8 findrefs js对象地址
    
    • 可以找出引用这个对象的实体,比如找到某个数组的地址,数组内包含几千个这样的对象