System Load

시스템 부하가 있을 때 관련 정보를 확인할 수 있는 방법을 알아본다.

Load Average

아래는 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 값들은 커널이 내부적으로 프로세스의 갯수를 센 것을 불러와서 찍어주는 것이다. 커널의 내부 동작이 궁금하면 stracegrep 명령어를 통해 시스템 콜과 커널 코드를 디버깅하면 된다.

CPU Bound vs I/O Bound

위에서 알아봤다시피 커널이 알려주는 load average는 현재 실행중이거나 작업을 기다리는 중, 즉 CPU를 사용하는 프로세스와 I/O를 기다리는 프로세스 갯수의 합을 의미한다고 볼 수 있다. 그렇기 때문에 우리는 load average 값이 높을 때 CPU 자원이 부족해서인지, I/O 작업이 밀려서인지 단번에 알 수 없다. 하지만 이것을 아는 것은 시스템 부하를 해결하기 위해서 필수적이다. 그렇기에 지금부터 vmstat 명령어를 통해서 부하의 정체를 확인해볼 것이다.

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 상태와 스케줄링 정보를 확인할 수 있다.

comments powered by Disqus