V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
v2byy
V2EX  ›  问与答

nodejs cpu profiling 的疑问

  •  
  •   v2byy · 2022-04-28 16:30:47 +08:00 · 679 次点击
    这是一个创建于 718 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简单描述下项目,container 里面 nodejs 进程启动一个 web server ,同时会用到 puppeteer 控制 chrome 做些事情。

    遇到的问题是 container 经常会因为 liveness probe fail 被 restart 。其中 liveness probe 直接就是做的 webserver 简单的 health check 。所以确实是 CPU 使用太高,导致 eventloop 被 block ,无法响应 liveness check 。

    使用 node 内建的 profile 来做分析。

    node --prof index.js
    

    得到的结果是:

     [Summary]:
       ticks  total  nonlib   name
        420    2.9%   99.3%  JavaScript
          0    0.0%    0.0%  C++
        597    4.1%  141.1%  GC
      13981   97.1%          Shared libraries
          3    0.0%          Unaccounted
          
     [Shared libraries]:
       ticks  total  nonlib   name
       6579   45.7%          /usr/local/bin/node
       5776   40.1%          /lib/x86_64-linux-gnu/libc-2.28.so
       1539   10.7%          /lib/x86_64-linux-gnu/libpthread-2.28.so
         82    0.6%          /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25
          5    0.0%          [vdso]
    

    显示 CPU 是花在 node 上和 libc 里面的函数。 其中一些 callstack 是这样的

    LXKYx1.png

    LXQ3cR.png

    看 callstack 大部分时间都是 puppeteer 做 IPC ,也即 node 进程与 chrome 进程通信。

    按理来说应该是异步的,不应该 block eventloop 。

    有没有可能是libuv 里面 epoll_pwait 的时候 io callback 太多,导致迟迟无法进入到下一个 eventloop 导致 eventloop 被 block 了呢?发现问题的时候 container CPU 确实已经很满了。

    5 条回复    2022-04-29 08:37:32 +08:00
    v2byy
        1
    v2byy  
    OP
       2022-04-28 16:47:27 +08:00
    还有个问题是,为什么生成的 profiling result 中会出现 node 的上一个 caller 还是 node 的情况?
    ```
    ticks parent name
    6579 45.7% /usr/local/bin/node
    4237 64.4% /usr/local/bin/node
    494 11.7% LazyCompile: *_onMessage /usr/local/src/myproject/src/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.js:87:21
    480 97.2% LazyCompile: *_dispatch /usr/local/src/myproject/src/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.js:40:14
    263 54.8% Function: ^<anonymous> /usr/local/src/myproject/src/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.js:25:67
    123 46.8% LazyCompile: *addChunk node:internal/streams/readable:304:18
    123 46.8% Function: ^emit node:events:474:44
    17 6.5% LazyCompile: *readableAddChunk node:internal/streams/readable:236:26
    ```
    fuis
        2
    fuis  
       2022-04-28 20:22:14 +08:00
    多给点资源不就完了?
    v2byy
        3
    v2byy  
    OP
       2022-04-28 21:14:17 +08:00
    @fuis 是想看有没有解决办法,当然这也是一个办法,现在吃 CPU 比较多,pod 很多
    number
        4
    number  
       2022-04-28 21:50:16 +08:00 via Android
    同一时间只会开一个 chrome 吗,tab 有几个?
    v2byy
        5
    v2byy  
    OP
       2022-04-29 08:37:32 +08:00
    @number 会有多个 tab
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5497 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 07:33 · PVG 15:33 · LAX 00:33 · JFK 03:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.