v2byy
V2EX  ›  问与答

nodejs cpu profiling 的疑问

  •  
  •   v2byy · Apr 28, 2022 · 1143 views
    This topic created in 1494 days ago, the information mentioned may be changed or developed.

    简单描述下项目,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 replies    2022-04-29 08:37:32 +08:00
    v2byy
        1
    v2byy  
    OP
       Apr 28, 2022
    还有个问题是,为什么生成的 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  
       Apr 28, 2022
    多给点资源不就完了?
    v2byy
        3
    v2byy  
    OP
       Apr 28, 2022
    @fuis 是想看有没有解决办法,当然这也是一个办法,现在吃 CPU 比较多,pod 很多
    number
        4
    number  
       Apr 28, 2022 via Android
    同一时间只会开一个 chrome 吗,tab 有几个?
    v2byy
        5
    v2byy  
    OP
       Apr 29, 2022
    @number 会有多个 tab
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2906 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 08:56 · PVG 16:56 · LAX 01:56 · JFK 04:56
    ♥ Do have faith in what you're doing.