규모 조정 #
CPU 부하의 규모 조정은 간단하다. #
- 스케일 아웃 전략을 통해 대응한다.
- 보통 웹, API, 크롤러 등의 애플리케이션에 해당된다.
I/O 부하의 규모 조정은 어렵다. #
- 보통 DB(with 대규모 데이터) 가 해당된다.
두 종류의 부하(CPU, I/O)와 웹 애플리케이션 #
일반적으로 웹 애플리케이션은 CPU 바운드 프로그램이다.
반면, 일반적으로 디스크에 저장된 데이터를 찾아내는 프로그램(= DB)는 I/O 바운드 프로그램이다.
멀티태스킹 OS와 부하 #
(멀티 태스킹 환경에서) A가 CPU 를 점유하고 있는 동안 (CPU가 필요한)B, C 는 대기하게 된다. ‘처리하려고 해도 대기한다’ 라는 대기 상태는 프로그램(태스크)의 실행 지연이다.
Load Average 는 단위 시간당 대기된 Task의 수, 즉 평균적으로 어느 정도의 task가 대기 상태로 있었는지를 보고하는 수치다.
Load Average 가 높은 상황은 그만큼 task 실행에 대기가 발생하고 있다는 표시이고, 지연이 되는(= 부하가 높은) 상황이라고 볼 수 있다.
Average가 보고하는 부하의 정체 #
HW는 일정 주기로 CPU로 인터럽트(interrupt) 신호를 보낸다. (주기적으로 보내는 신호여서 Timer interrupt 라고 부르기도 한다.)
예를 들어 CentOS 5 에서의 인터럽트 간격은 4ms 가 되도록 설정되어 있다.
이 인터럽트를 통해 어떤 프로세스가 얼마만큼의 CPU를 사용하고 있는지, 시간을 얼마나 쓰고 있는지 등을 계산한다. (= Load Average 가 계산된다.)
커널은 타이머 인터럽트가 발생했을 때 ‘실행 가능 상태 task’ 와 ‘I/O 대기 상태 task’ 개수를 세어둔다. 이 값을 단위 시간으로 나누면 Load Average 값이 된다.
아마 이런 수식일 것이다.
I/O 대기 상태 task / (실행 가능 상태 task + I/O 대기 상태 task)
즉, Load Average가 의미하는 것은 아래와 같다.
- 처리를 하려고 해도 실행할 수 없어 대기하고 있는 프로세스 수
- CPU 점유를 대기하고 있는 프로세스 수
- I/O가 완료되기를 기다리고 있는 프로세스 수
= CPU 부하, I/O 부하에 따라 (자연스럽게) Load Average 가 높아진다.