지난 번 블로그에서 /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/