본문 바로가기
Back-End

CPU 부하, I/O 부하 파악 방법

by 이곳느 2022. 7. 10.
이 글은 `대규모 서비스를 지탱하는 기술` 도서를 참고하여 작성되었습니다.

서론

서버 개발을 하다보면 시스템에 부하가 걸려서 느려지는 경우를 많이볼 수 있다. 이럴때는 원인이 무엇인지 파악하는게 중요하다.

개발중인 환경에서는 부하가 큰 문제가 되지 않는다. 하지만 그게 프로덕션 환경이라면 이야기는 달라진다. 시스템 부하는 곧 서버가 다운될수도 있다는 의미인데 그땐 서비스 중인 모든 API를 사용할 수 없게 된다.

시스템 부하상태가 발생했을때 원인 파악을 위하여 CPU에 의한 부하인지, I/O 에 의한 부하인지 파악을 하여 부하를 해결하는게 중요하다.

부하

Load Average(평균 부하)는 대기된 태스크 수의 정보가 나온다. 총 3개가 출력되는데 왼쪽부터 차례로 1분, 5분, 15분 동안 어느 정도의 태스크가 대기상태로 있었는지를 보고하는 수치다.

Load Average가 높다면 그만큼 태스크 실행에 대기가 발생하고 있다는 표시이므로 부하가 높은 상황이라고 할 수 있다.

리눅스 환경에서 $ top 명령어를 사용하면 간단하게 Load Average 수치를 알 수 있다.

그렇다면 이 Average가 알려주는 부하의 정체가 뭘까?

Load Average

위 사진은 리눅스 환경에서 `$ top` 명령어를 입력했을 시 출력되는 데이터이다.

Load Average값의 정체는 먼저 CPU로 흘러간다. 하드웨어는 일정 주기로 CPU 에게 인터럽트(interrupt)라고 하는 신호를 보낸다.

주기적으로 보내지는 신호이기 때문에 ‘타이머 인터럽트(Timer Interrupt)’ 라고 한다. 예를들어 CentOS5 에서 인터럽트 간격은 4ms로 설정되어 있다. 이 인터럽트마다 CPU는 시간 관련된 처리를 수행한다. 예를 들어 실행 중인 프로세스가 CPU를 얼마나 사용했는지, 시간 진행 등등이 포함된다.
이때 타이머 인터럽트마다 Load Average 값이 계산된다.
OS 커널은 타이머 인터럽트가 발생했을 때 실행가능 상태인 태스크와 I/O 대기인 태스크의 갯수를 세어둔다.
그 값을 단위 시간으로 나눈 것이 Load Average다.

여기서 실행 가능 태스크란 다른 태스크가 CPU를 점유하고 있어 계산을 시작할 수 없는 태스크다.
즉, 처리를 실행 하려고 해도 실행할 수 없어서 대기하고 있는 프로세스의 수 이다.

조금 더 구체적으로는 다음과 같다.

  • CPU의 실행권한이 부여되기를 기다리고 있는 프로세스
  • 디스크 I/O가 완료하기를 기다리고 있는 프로세스

Load Average 값은 시스템에 부하가 발생하는 것 자체는 모니터링 할 수 있지만, CPU 부하가 높은건지, I/O 부하가 높은지는 판단할 수 없다.

최종적으로 서버 리소스 중 어디가 병목이 되고 있는지를 판단하려면 좀더 자세하게 조사해야 한다.

Load Average 다음은 CPU 사용률과 I/O 대기율

Load Average 를 잘 살펴보면 CPU 부하와 I/O 부하를 나타내고 있음을 알 수 있다.

대부분의 과부하로 시스템의 성능이 떨어지는 원인은 CPU나 I/O에 있음을 나타내고 있다. 따라서 Load Average 를 보고 대응할 필요가 있다고 판단한 경우, 다음 단계로 CPU와 I/O 중 어느 쪽에 원인이 있는지를 조사해야 한다.

sar로 CPU 사용률, I/O 대기율 확인

sar(System Activity Reporter)는 이름 그대로 시스템 상황 리포터이다. 리눅스에서 사용할 수 있다.

위 사진은 내 연습용 EC2에서 sar 명령을 실행했을 떄 나오는 지표이다. 별 작업을 하지 않았기 때문에 의미있는 데이터는 없지만 대충 이런느낌으로 모니터링이 가능하다는 것을 알고 있으면 될 것 같다.

여기서 CPU 사용률과 I/O 대기 비율이라는 지표를 활용한다.

리눅스 환경에서 $ sar 명령을 입력하면 여러가지 데이터들이 보인다.
만약 CPU 쪽 문제가 발생한 시스템이라면 %user%system 쪽을 확인해 봐야 한다.

%user 는 사용자 모드에서의 CPU 사용률이고, %system 은 시스템 모드에서의 CPU 사용률이다.

Load Average 가 높고, 이러한 CPU 사용률 수치가 높다면 대기하고 있는 프로세스의 부하 원인은 CPU 리소스 부족이라고 판단할 수 있다.

I/O 바운드인 경우의 sar

I/O 바운드인 서버는 %iowait 를 보면 알 수 있다.

%iowait 는 I/O 대기율이다. Load Average 가 높고 %iowait 가 높은 경우는 부하의 원인이 I/O에 있다고 판단할 수 있다.

CPU, I/O 중 어느 쪽에 원인이 있는지를 확인 했으면 거기서부터 더욱 자세하게 조사해야 한다. 메모리 사용률이나 스왑 발생상황 등을 참조하는 등의 조치를 취해야 한다.

'Back-End' 카테고리의 다른 글

Neo4j 설치하고 사용해보기  (0) 2022.01.25
Forward Proxy, Reverse Proxy의 정의와 차이점  (0) 2022.01.02
traceroute 명령의 동작원리  (0) 2022.01.02
Web Server와 WAS의 차이점  (0) 2020.09.02