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
옵션 (복수형이다) 은 어플리케이션 실행 전에 의존성 등의 이유로 미리 실행시켜둬야 할 다른 어플리케이션을 명시한다. 기본적으로 모든 어플리케이션은 kernel
과 stdlib
에 대한 의존성을 갖고 있다.
{application, Application
[
...
{applications, [kernel, stdlib]},
...
]}.
지난 번에 만든 wssvr에 os_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,[]}]