시스템 부하가 있을 때 관련 정보를 확인할 수 있는 방법을 알아본다.
아래는 AWS의 Ubuntu EC2 nano 이미지 위에서 스트레스를 준 후 top
명령어 결과로 나온 것을 복사해온 것이다. 첫번째 줄의 load average:
옆에 세 개의 값이 나열되어 있는 것을 볼 수 있다.
$ stress --cpu 2 --io 4 --vm 2 --vm-bytes 128M &
$ top -b -n 1 | more
top - 08:44:15 up 35 min, 1 user, load average: 8.02, 8.01, 6.94
Tasks: 123 total, 6 running, 117 sleeping, 0 stopped, 0 zombie
%Cpu(s): 4.1 us, 3.1 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 92.9 st
KiB Mem : 498356 total, 107200 free, 275560 used, 115596 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 179044 avail Mem
...
--More--
각각의 값은 상태가 R이나 D인 프로세스의 갯수를 1분, 5분, 15분마다 평균 값을 낸 것이다. 이 값으로 실행중 혹은 실행 대기중의 프로세스의 갯수를 추적할 수 있다. 이 값과 시스템의 CPU 코어 수로 시스템 부하율을 계산하면 된다.
uptime
명령어로도 같은 값을 확인할 수 있다.
$ uptime
08:46:25 up 37 min, 1 user, load average: 8.00, 8.00, 7.08
top과 uptime 명령어로 얻은 load average 값들은 커널이 내부적으로 프로세스의 갯수를 센 것을 불러와서 찍어주는 것이다. 커널의 내부 동작이 궁금하면 strace
와 grep
명령어를 통해 시스템 콜과 커널 코드를 디버깅하면 된다.
위에서 알아봤다시피 커널이 알려주는 load average는 현재 실행중이거나 작업을 기다리는 중, 즉 CPU를 사용하는 프로세스와 I/O를 기다리는 프로세스 갯수의 합을 의미한다고 볼 수 있다. 그렇기 때문에 우리는 load average 값이 높을 때 CPU 자원이 부족해서인지, I/O 작업이 밀려서인지 단번에 알 수 없다. 하지만 이것을 아는 것은 시스템 부하를 해결하기 위해서 필수적이다. 그렇기에 지금부터 vmstat
명령어를 통해서 부하의 정체를 확인해볼 것이다.
vmstat
에 딜레이 옵션을 1초 줘서 실행해보면 다음과 같이 1초마다 값들이 찍힌다.
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 1 0 245368 12792 119000 0 0 0 3012 918 1807 1 2 0 56 42
0 1 0 245368 12792 119000 0 0 0 3028 922 1802 1 1 0 56 42
1 1 0 245368 12792 119000 0 0 0 2980 912 1790 0 1 0 58 42
1 1 0 245368 12792 119000 0 0 0 2996 914 1787 0 1 0 58 42
1 1 0 245364 12792 119000 0 0 0 2996 919 1798 0 1 0 57 43
주목해볼 곳은 procs 하단의 r, b 값이다. r
값은 실행되기를 기다리거나 현재 실행되고 있는 프로세스의 개수를 의미한다. b
값은 I/O를 위해 대기열에 있는 프로세스의 개수를 의미한다. top
의 load average 값만으로 부족한 정보는 이렇게 vmstat
으로 추가 확인할 수 있다.
돌아가는 프로세스가 어떤 시스템 자원을 많이 쓰느냐에 따라서 부하가 시스템에 미치는 영향은 달라질 수 있다.
또한 사용하고 있는 커널의 로직이나 알려지지 않은 버그때문에 측정되는 부하값이 다를 수도 있으므로 항상 여러가지 지표를 통해 부하를 확인하는 것이 중요하다.
프로세스의 스케줄링을 디버깅하고 싶다면
/proc/sched_debug
를 읽어보자! 각 CPU의 Run Queue 상태와 스케줄링 정보를 확인할 수 있다.