본문 바로가기
IT 이야기/Android Performance

[CPU Usage] vmstat, /proc/sched_debug 로 system load의 원인 파악

by KaySeo 2021. 12. 8.
반응형

지난 번 블로그에서 /proc/loadavg 값에 대한 의미를 살펴보았습니다. Load Average는 Active Task의 평균 값을 의미합니다. 다만 Active Task에는 TASK_UNINTERRUPTIBLE도 포함되기 때문에 Load Average가 높다는 것이 CPU를 사용하려는 Process가 많다는 의미도 될 수 있지만 I/O 작업을 대기하려는 Process가 많다는 의미도 될 수 있다고 얘기했습니다. 

그러므로 Load Average 가 높을 때 System에 어떤 상태의 부하, 즉, CPU 리소스 부하인지 혹은 I/O 부하인지, 가 일어나고 있는 지 추가로 파악할 필요가 있습니다. 이를 파악하기 위해 어떤 명령어가 사용되는 지 알아보겠습니다.

vmstat

adb shell에서 vmstat 명령어를 입력하면 아래와 같이 출력됩니다.

adb shell:/# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 4298860 41132 1682444   0    0    32     4    0 2097  8  9 83  0

각 항목의 의미를 살펴보겠습니다.

r : 실행되기 위해 기다리는 Process의 개수 (nr_running)

b : I/O 를 위해 기다리는 Process의 개수 (nr_uninterruptible)

 

r 실행되기를 기다리거나 실행 중인 Process 개수를 나타내며 b uninterruptible sleep 상태의 Process I/O 위해 대기열에 있는 Process 개수를 의미합니다. 그러므로 r R 상태의 프로세스 개수이며 b D상태의 프로세스 개수를 나타내기 때문에 load average 높아졌을 때는 vmstat 통해 CPU 리소스 부하(R) 때문인지 I/O부하(D) 때문인지 원인파악이 가능합니다.

 

/proc/sched_debug

그러면 CPU내 각 core 별로 running되고 있는 Process의 정보는 어떻게 파악할 수 있을까요? 이 경우 /proc/sched_debug 파일을 확인하면 됩니다. /proc/sched_debug 는 실행 Scheduler 의 현재 조율값, CFS 통계, 모든 사용가능한 CPU에서 Running Queue 정보를 보여줍니다. 따라서 각 core별로 R 상태의 Process 정보를 파악할 있습니다.

 

adb shell:/# cat /proc/sched_debug
cpu#0
  .nr_running                    : 2
  .load                          : 2672640
  .nr_switches                   : 29984221
  .nr_load_updates               : 958389
  .nr_uninterruptible            : 9114
  .next_balance                  : 4295.889500
  .curr->pid                     : 4620
  .clock                         : 9537387.658894
  .clock_task                    : 9306697.333036
  .cpu_load[0]                   : 1
  .cpu_load[1]                   : 184
  .cpu_load[2]                   : 186
  .cpu_load[3]                   : 147
  .cpu_load[4]                   : 119
.....
runnable tasks:
 S           task   PID         tree-key  switches  prio     wait-time             sum-exec        sum-sleep
-----------------------------------------------------------------------------------------------------------
 S           init     1   2632562.148015     10573   120      1864.333709     19828.899094  10260102.599041 /
...

 

vmstat과 /proc/sched_debug 의 의미

R process가 많다는 것은 CPU 리소스 부하를 발생시키는 프로세스가 많다는 것으로 해석할 수 있습니다.

1. CPU , Memory Usage이외에는 정상적인 경우 : Program의 Logic이나 Algorithm개선 또는 HW 개선필요

2. 특정 Process의 CPU 점유율이 높은 경우 : Process의 정상동작을 위해 오류확인 및 개선필요

 

D process가 많다는 것은 I/O 요청으로 인해 대기 중인 Process가 많다는 의미입니다.

1. Program으로부터 입출력이 많아 부하가 높은 경우 : File 입출력 부분의 개선필요

2. Swapping이 발생해서 Disk Access가 발생하고 있는 경우 : 특정 Process가 극단적으로 Memory를 소비하고 있지 않은 지를 확인 및 개선필요. 혹은 물리적인 RAM 증성방법 검토 필요.

 

참고사이트
https://brunch.co.kr/@dreaminz/1
https://augustkang.com/posts/linux/load-average-calculation/
반응형