Load Average 와 시스템 부하
1. Load Average 의 정의
Load Average 란?
앞에서 확인한 프로세스의 상태 중 R(running)과 D(uninterruptible sleep) 상태에 있는 프로세스 개수의 1분, 5분, 15분 마다의 평균 값.
즉, 얼마나 많은 프로세스가 실행 중 혹은 실행 대기 중인가를 의미하는 수치.
Load Average 가 높다면 많은 수의 프로세스가 실행 중이거나 I/O 등을 처리하기 위한 대기 상태에 있다는 것이다.
CPU Core 수가 많을 수록, Load Average 가 낮다.
(하나의 Run Queue 에 두 개의 프로세스가 있고 하나만 실행되고 나머지 하나는 대기하는 것보다
서로 다른 CPU 에서 동시에 실행 될 수 있기 때문에)
uptime
# /proc/loadavg 파일을 열어서 그 파일의 내용을 읽고 화면에 출력해주는 명령.
# 즉, 직접 계산하는 것이 아닌 커널이 미리 준비해 둔 /porc/loadavg 를 단순히 읽어 보여주는 명령.
strace -s 65535 -f -t -o uptime_dump uptime
# 덤프 파일
※ strace
커널의 동작원리를 분석하기 위해 strace 로 시스템 콜을 분석해서 시작점을 찾는 것이 유용하다.
※ cat /proc/loadavg
2. CPU Bound vs I/O Bound
Load Average 는 상대적인 값이 아닌,
계산하는 순간을 기준으로 존재하는 R 상태의 프로세스 개수와 D 상태의 프로세스 개수를 합한 값을 바탕으로 계산.
즉, Load Average 가 높다는 것은 단순히 CPU 를 사용하려는 프로세스(R의 개수)가 많다는 것이 아니고
I/O 에 병목이 생겨서 I/O 작업을 대기하는 프로세스(D의 개수)가 많을 수도 있다는 의미이다.
부하를 일으키는 프로세스
위에서 작성하였듯이 크게 두 가지 종류로 나눌 수 있다.
(1) CPU 자원을 많이 필요로 하는 CPU Bound 프로세스
(2) 많은 I/O 자원을 필요로 하는 I/O Bound 프로세스
둘 다 uptime 명령어로 확인 시, 비슷한 수준의 Load Average 증가율을 보여주고는 있지만, 사실 일으키고 있는 부하는 전혀 다른 부하이다.
- 전자의 경우, CPU 리소스를 너무 많이 사용해서 발생하는 부하.
- 후자의 경우, I/O 리소스를 너무 많이 사용해서 발생하는 부하.
부하의 종류에 따라서 해결 방법이기 달라지기 때문에 어떤 부하인지 파악하는 것이 중요하다.
CPU 가 단순히 더 많은 장비를 사용하는 것으로 해결할 수 없다는 것을 의미한다.
Load Average 자체의 절대적인 높음과 낮음은 없으며 현재 시스템에 장착되어 있는 CPU 코어를 기반으로 한 상대적인 값으로 해석해야 한다.
3. 부하의 원인 파악하기
vmstat으로 부하의 정체 확인.
Load Average 값은 시스템에 부하가 있다는 것을 알려주지만, 구체적으로 어떤 부하인지는 알 수 없다.
vmstat 을 통해서 확인할 수 있다.
두 출력 값 사이의 차이점은 바로 첫 번째 r 열과 두 번째 b 열 이다.
- r - The number of processes waiting for run time. (R 상태의 프로세스, 현재 실행되고 있는 프로세스의 개수)
- b - The number of processes in uninterruptible sleep (D 상태의 프로세스, I/O를 위해 대기열에 있는 프로세스의 개수)
vmstat 을 확인해 보면 CPU 가 일으키는 Load Average 인지, 아니면 I/O가 일으키는 Load Average 인지 확인해볼 수 있다.
b 열의 수가 높다면 I/O 처리 과정에 문제가 있지 않을 지 살펴보아야 한다.
※ /proc/shed_debug
proc 파일 시스템에 있는 파일로, 각 CPU 의 Run Queue 상태와 스케줄링 정보도 살펴볼 수 있다.
- 각 CPU 에 할당된 프로세스 수와 프로세스의 PID 등의 정보를 확인 가능하다.
Reference
- DevOps와 SE를 위한 리눅스 커널 이야기
- 강진우, DevOps와 SE를 위한 리눅스 커널 이야기, 인사이트, 2017, Chapter01
'OS > Linux Server' 카테고리의 다른 글
[Shell Programming] 오래된 로그 삭제 (0) | 2022.11.13 |
---|---|
[리눅스커널이야기] free 명령 (0) | 2022.07.29 |
[리눅스커널이야기] top 을 통해 살펴보는 프로세스 정보들(2) (0) | 2022.07.26 |
[Linux] 01. 운영체제의 구조와 특징 (0) | 2022.05.23 |
[리눅스커널이야기] top 을 통해 살펴보는 프로세스 정보들 (0) | 2022.04.07 |