【问题标题】:Elixir/Erlang: How to find the source of high CPU usage?Elixir/Erlang:如何找到 CPU 使用率高的根源?
【发布时间】:2017-11-21 14:03:51
【问题描述】:

我的 Elixir 应用程序使用了大约 50% 的 CPU,但实际上应该只使用

在远程控制台中,我尝试过

  1. 使用Process.list 列出所有进程
  2. Process.info查看进程信息
  3. 按减少计数对进程进行排序
  4. 按消息队列长度对进程进行排序

消息队列都接近于 0,但某些进程的减少计数非常高。具有高减少计数的进程被命名

  1. :file_server_2
  2. ReactPhoenix.ReactIo.Pool
  3. :code_server

(1)和(3)都存在于我的其他应用程序中,所以我觉得它必须是(2)。这就是我卡住的地方。我怎样才能进一步弄清楚为什么 (2) 使用了这么多 CPU?

我知道ReactPhoenix 使用react-stdio。看看top,react-sdtio 不使用任何资源,但 beam 使用。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        87 53.2  1.2 2822012 99212 ?       Sl   Nov20 580:03 /app/erts-9.1/bin/beam.smp -Bd -- -root /app -progname app/releases/0.0.1/hello.sh -- -home /root -- -noshell -noshell -noinput -boot /app/
root     13873  0.0  0.0   4460   792 ?        Rs   13:54   0:00 /bin/sh -c deps/react_phoenix/node_modules/.bin/react-stdio

我在this StackOverflow post 中看到stdin 会导致资源问题,但我不确定这是否适用于此。无论如何,任何帮助将不胜感激!

【问题讨论】:

    标签: reactjs erlang elixir cpu-usage stdio


    【解决方案1】:

    你试过etop吗?

    iex(2)> :etop.start
    
    ========================================================================================
     nonode@nohost                                                             14:57:45
     Load:  cpu         0               Memory:  total       26754    binary        143
            procs      51                        processes    8462    code         7201
            runq        0                        atom          292    ets           392
    
    Pid            Name or Initial Func    Time    Reds  Memory    MsgQ Current Function
    ----------------------------------------------------------------------------------------
    <0.6.0>        erl_prim_loader          '-'  458002  109280       0 erl_prim_loader:loop
    <0.38.0>       code_server              '-'  130576  196984       0 code_server:loop/1  
    <0.33.0>       application_controll     '-'   58731  831632       0 gen_server:loop/7   
    <0.88.0>       etop_server              '-'   58723  109472       0 etop:data_handler/2 
    <0.53.0>       group:server/3           '-'   19364 2917928       0 group:server_loop/3 
    <0.61.0>       disk_log:init/2          '-'   16246  318352       0 disk_log:loop/1     
    <0.46.0>       file_server_2            '-'    3838   18752       0 gen_server:loop/7   
    <0.51.0>       user_drv                 '-'    3720   13832       0 user_drv:server_loop
    <0.0.0>        init                     '-'    2559   34440       0 init:loop/1         
    <0.37.0>       kernel_sup               '-'    2093   58600       0 gen_server:loop/7   
    ========================================================================================
    

    http://erlang.org/doc/man/etop.html

    【讨论】:

    • 我应该怎么做才能使其在prod 中可用?附加到iex 并运行:etop.start 会导致“** (UndefinedFunctionError) function :etop.start/0 is undefined (module :etop is not available)”。
    • 根据链接的doc,可以指定要连接etop到的节点:etop -node testnode@myhost -setcookie MyCookie
    • @Kernael 如果这是我的问题的答案,那么问题是,如错误消息所指定,“模块 etop 不可用。”我怀疑指定节点会神奇地使这个模块发挥作用。
    • 你的机器上当然应该有脚本吗? erl -s etop
    • @mudasobwa 是否包括runtime_tools 解决了这个问题?见tkowal.wordpress.com/2016/04/23/…
    猜你喜欢
    • 1970-01-01
    • 2015-10-26
    • 2014-03-23
    • 1970-01-01
    • 2015-06-06
    • 2016-03-10
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多