Erlang으로 CPU Usage 확인하는 코드 작성하기

"erlang cpu usage" 등으로 검색하면 erlang 내에 cpu_sup이 포함되어 있음을 알 수 있다. 하지만 바로 돌려보면 0이라는 상당히 불성실한 값과 함께 warning report를 출력하고 종료된다.

Eshell V8.2.2  (abort with ^G)
1> cpu_sup:util().
0

=WARNING REPORT==== 17-Mar-2017::23:32:57 ===
OS_MON (cpu_sup) called by <0.57.0>, not started
2> 

erlang man 페이지를 읽어보면 사전에 os_mon application이 실행되어 있어야 한다고 한다. 이건 erlang shell에서 바로 실행하는 것이 아니고, 어플리케이션의 .app application resource file에  os_mon을 사전에 실행하도록 수정해야 한다.

잠깐 .app 파일에 대해 좀 더 파악하고 가자. 여기에는 해당 어플리케이션의 버전이나 설명, 리소스 정보 및 어떻게 실행할 것인지에 대한 정보를 포함한다. 파일을 들여다보면 여러가지 옵션이 있는데 이 중 applications 옵션 (복수형이다) 은 어플리케이션 실행 전에 의존성 등의 이유로 미리 실행시켜둬야 할 다른 어플리케이션을 명시한다. 기본적으로 모든 어플리케이션은 kernelstdlib에 대한 의존성을 갖고 있다.

{application, Application
  [
    ...
    {applications, [kernel, stdlib]},
    ...
]}.

지난 번에 만든 wssvros_mon을 추가해보자.  빌드에 rebar3를 사용하기 때문에 wssvr.app 대신 wssvr.app.src 파일을 편집하자 (빌드를 걸면 rebar3에서 자동으로 wssvr.app.src로부터 wssvr.app 파일을 만들어낸다).

...
{applications,
  [kernel,
   stdlib,
   os_mon,    % <-- here.
   cowboy
  ]},
...

실행하면 os_mon이 실행되면서 프로세스 별로 progress report를 출력한 다음 erlang shell prompt를 떨군다. 여기서 cpu_sup을 실행해보자.

(wssvr@MacBook-Pro)1> cpu_sup:util().
12.48985218073504

util/0 대신 util/1을 쓰면 보다 자세한 정보를 뽑아볼 수 있다.

(wssvr@MacBook-Pro)2> cpu_sup:util([per_cpu]).
[{0,17.474933401431535,82.52506659856846,[]},
 {1,8.361166523834795,91.6388334761652,[]},
 {2,15.622653644789935,84.37734635521007,[]},
 {3,8.49818318526655,91.50181681473344,[]}]