2017-11-21 26 views
4

My Elixir 앱은 CPU의 약 50 %를 사용하지만 실제로는 < 1 % 만 사용해야합니다. 무엇이 높은 CPU 사용량을 일으키는 지 알아 내려고하고 있는데 문제가 있습니다.Elixir/Erlang : 높은 CPU 사용량을 찾는 방법은 무엇입니까?

원격 콘솔에서, 나는

  1. Process.info
  2. 감소 수에 의해 프로세스를 정렬과 프로세스 정보를 살펴보면 Process.list
  3. 모든 프로세스를 나열 시도 메시지 큐에 의해 프로세스를 정렬
  4. 길이

메시지 대기열은 모두 0이지만 감소 계수는 일부 프로세스에서 매우 높습니다. file_server_2

  • ReactPhoenix.ReactIo.Pool
  • : 높은 감소 카운트를 가진 프로세스가

    1. 이름이 지정됩니다
    2. code_server을

    (1)과 (3) 내 다른 애플 리케이션에 존재하는 모두, 그래서 나는 그것이 반드시 있어야한다고 생각합니다 (2). 내가 붙어있는 곳이야. 더 멀리 가서 (2) CPU를 많이 사용하는 이유를 알아 내려면 어떻게해야합니까?

    나는 ReactPhoenixreact-stdio을 사용한다는 것을 알고 있습니다. top을 보면 react-sdtio는 리소스를 사용하지 않지만 빔은 사용합니다.

    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에서 본,하지만 여기에 적용되는 경우 내가 확실 해요. 어쨌든, 어떤 도움을 크게 주시면 감사하겠습니다!

  • 답변

    12

    etop을 사용해 보셨습니까?

    iex(2)> :etop.start 
    
    ======================================================================================== 
    [email protected]                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

    +1

    나는 무엇 prod''에서 사용할 수 있도록 할 것? 'iex'에 연결하고': etop.start'를 실행하면 "** (UndefinedFunctionError) function : etop.start/0가 정의되지 않았습니다 (모듈 : etop을 사용할 수 없습니다)"라는 결과가 발생합니다. – mudasobwa

    +1

    링크 된 문서에 따르면'etop'을 연결할 노드를 지정할 수 있습니다 :'etop -node testnode @ myhost -setcookie MyCookie' – Kernael

    +0

    @Kernael 이것이 내 질문에 대한 답 이었으면, 문제는 지정된대로 오류 메시지 "module'etop' in not available."노드를 지정하는 것이 마술처럼이 모듈을 사용할 수 있을지 의심 스럽습니다. – mudasobwa