반응형

Load Average 정의


Load Average는 프로세스의 상태 중 R&D 상태에 있는 프로세스의 개수의 1, 5, 15분 마다의 평균 값입니다.

root@choi:/proc/1# uptime

00:22:03 up 38 days, 2:18, 2 users, load average: 0.00, 0.00, 0.00

, 얼마나 많은 프로세스가 실행 중 혹은 실행 대기 중이냐를 의미한다. Load Average가 높다면 프로세스가 실행 중이거나 I/O 등을 처리하기 위한 대기상태에 있다는 것이며, 낮다면 적은 수의 프로세스가 실행 중이거나 대기 중이라는 의미이다. 프로세스의 수를 세는 것이기 때문에 CPU Core 수에 따라 의미가 다소 상대적이다.

Load Average를 보다 자세히 분석하기 위해 strace를 이용해 보겠습니다.

root@choi:~# uptime

21:07:03 up 39 days, 23:03, 2 users, load average: 0.00, 0.00, 0.00

root@choi:~# strace -s 65535 -f -t -o uptime_dump uptime

21:07:28 up 39 days, 23:04, 2 users, load average: 0.00, 0.00, 0.00


uptime 명령은 /proc/loadavg 파일을 열어서 그 파일의 내용을 읽고 화면에 출력해주는 명령어이다. uptime이 계산하는 것이 아니고 커널이 미리 계산한 내용을 보여주게 된다. 커널은 Tick주기 마다 깨어나서 CPURun Queue에 있는 프로세스의 개수를 넣어서 계산한다. 과정은 복잡하게 보일 수 있지만, 결국에는 프로세스의 개수를 카운트 한다는 점이다.


9243  21:07:28 openat(AT_FDCWD, "/proc/loadavg", O_RDONLY) = 4

9243  21:07:28 lseek(4, 0, SEEK_SET)    = 0

9243  21:07:28 read(4, "0.00 0.00 0.00 1/384 9244\n", 8191) = 26

9243  21:07:28 fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 0), ...}) = 0

9243  21:07:28 write(1, " 21:07:28 up 39 days, 23:04,  2 users,  load average: 0.00, 0.00, 0.00\n", 71) = 71

9243  21:07:28 close(1)                 = 0

9243  21:07:28 close(2)                 = 0

9243  21:07:28 exit_group(0)            = ?

9243  21:07:28 +++ exited with 0 +++ 


 

Load Average가 높다는 것은 단순히 CPU를 사용하려는 프로세스가 많다는 의미도 포함해서 I/O에 병목이 생겨서 I/O 작업을 대기하는 프로세스가 많다는 의미도 있습니다. 아래의 코드를 바탕으로 CPU IO 리소스가 많이 사용해서 발생하는 부하에 대해 확인 할수 있다. 중요한 것은 Load Average가 높다고 무조건 CPU를 더 장착할 필요가 없다는 점이다.

#!/bin/bash

 

if [ $1 = "CPU" ]

then

while [ 1 ]

do

echo "1+1"|bc >& /dev/null

done

fi

 

if [ $1 = "IO" ]

then

while [ 1 ]

do

echo test > test.txt

done

fi


root@choi:/# ./test.sh CPU&

[1] 9448

root@choi:/# uptime

21:35:29 up 39 days, 23:32, 2 users, load average: 0.08, 0.02, 0.01

root@choi:/# uptime

21:35:38 up 39 days, 23:32, 2 users, load average: 0.23, 0.05, 0.02

root@choi:/# uptime

21:35:45 up 39 days, 23:32, 2 users, load average: 0.43, 0.10, 0.03

root@choi:/# ./test.sh IO&

[1] 28289

root@choi:/# uptime

21:36:45 up 39 days, 23:33, 2 users, load average: 0.75, 0.25, 0.09

root@choi:/# uptime

21:36:57 up 39 days, 23:33, 2 users, load average: 0.79, 0.27, 0.10

root@choi:/# uptime

21:37:01 up 39 days, 23:33, 2 users, load average: 0.81, 0.29, 0.11

 

 

 

root@choi:/# ./test.sh IO&

[1] 19321

root@choi:/# 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

0 1 9216 297768 7101296 8321568 0 0 0 62496 16165 47336 5 19 75 2 0

1 0 9216 297832 7101296 8321572 0 0 0 63252 16348 47953 7 17 76 1 0

0 1 9216 297856 7101296 8321572 0 0 0 63312 16339 47985 5 19 75 1 0

1 0 9216 297848 7101296 8321572 0 0 0 63264 16350 47992 5 19 75 1 0

1 0 9216 297840 7101296 8321568 0 0 0 63332 16352 47969 6 18 75 1 0

0 1 9216 297864 7101300 8321572 0 0 0 62528 16164 47326 5 18 74 2 0

1 0 9216 297864 7101300 8321572 0 0 0 63232 16332 47942 5 19 75 1 0

0 1 9216 297888 7101300 8321572 0 0 0 63288 16319 48000 5 20 74 1 0

1 0 9216 297888 7101300 8321572 0 0 0 63228 16336 47933 6 19 75 1 0

root@choi:/# ./test.sh CPU >/dev/null&

[1] 19328

root@choi:/# 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

1 0 9216 296692 7101384 8321572 0 0 2 4 2 1 0 0 100 0 0

3 0 9216 296652 7101384 8321572 0 0 0 0 1052 14372 11 23 67 0 0

1 0 9216 296504 7101384 8321572 0 0 0 0 1064 14440 10 23 67 0 0

1 0 9216 296192 7101384 8321572 0 0 0 0 1070 14447 8 25 67 0 0

2 0 9216 296444 7101384 8321572 0 0 0 0 1051 14459 9 24 67 0 0

2 0 9216 295960 7101384 8321572 0 0 0 0 1048 14365 10 23 67 0 0

1 0 9216 296440 7101384 8321572 0 0 0 0 1049 14413 10 23 67 0 0

2 0 9216 296588 7101384 8321572 0 0 0 0 1064 14424 9 24 67 0 0

1 0 9216 296768 7101384 8321572 0 0 0 68 1052 14454 10 23 67 0 0

다음은 vmstat를 이용해서 부하의 원인을 분석하는 방법을 알아보고자 한다. 첫 번째 , 두 번째 칼럼의 차이가 보인다.

r은 실행되기를 기다리거나 실행되고 있는 프로세스의 개수, bI/O를 위해 대기열에 있는 프로세스의 개수를 말한다.

 

ex) CPU기반의 부하를 일으키는 경우 : 응답속도가 느려진다. nginxjava같은 실제 서비스를 방해하는 프로세스로 인해 전체적인 응답속도가 느려지게 된다.

I/O기반의 부하를 일으키는 경우 : CPU 경합이 떨어지기 때문에 다소 응답속도가 느려지지 않지만, I/O가 들어가는 경우 I/O에 의한 병목현상이 발생할 수 있다.

 

 

 

 

 

반응형

+ Recent posts