아마추어 팀블로그

리눅스 CPU Load Average의 위험 범위는? 본문

리눅스

리눅스 CPU Load Average의 위험 범위는?

탓치 2015. 2. 14. 12:30


원본글 링크: Understanding Linux CPU Load - when should you be worried?


위 글을 번역한 글입니다. 오역이 있을 수 있습니다.


이 포스트를 검색해 들어왔다면, 아마 Load average라는 개념에는 익숙할 것이다. 널리 알려진 바와 같이, Load average는 uptime이나 top 명령어를 쳤을 때 나타나는 세 실수 값으로, 실제 예는 아래와 같다.


load average: 0.00, 0.01, 0.05


대부분의 사람들이 load average의 개념을 다음과 같이 파악하고 있다. 세 숫자가 1분, 5분, 15분 동안 실행 대기 중인 프로세스의 평균 개수이며, 낮을수록 좋다는 것, 그리고 load average가 높으면 해당 머신이 과부하 상태라는 것 정도. 자, 그럼 load average의 한계 값은 얼마일까? 이른바 “좋은”, “나쁜” load average 값이란 어느 정도일까? 그리고 Load average에 대해서 살펴봐야 하는 사항에는 어떤 것이 있고, 이를 최대한 빨리 처리하려면 어떤 작업을 해야 할까?


우선, load average가 실제로 무엇을 의미하는지 살펴볼 필요가 있다. 문제를 단순화 해서, 싱글 코어 프로세서로 구동 중인 장비를 우선 생각해보자.


다리를 건너는 자동차를 예시로 들어보자.


싱글 코어 CPU는 1차선 도로와 같다. 어떨 땐 다리를 건너려는 차들이 많아 다리 위가 매우 혼잡할 것이다. 그럼 다리 위가 얼마나 혼잡한 지를 어떻게 수치로 나타낼 수 있을까? 제일 간단한 방법은 특정 시간 동안 얼마나 많은 차가 건너려고 대기 중인지 파악하는 것이다.


만약에 대기 중인 차가 없다면 바로 다리를 건널 수 있을 것이고, 대기 중인 차가 있다면, 당연히 기다려야 한다. 종합해보면 다음과 같은 정책을 쓸 수 있다.

  • 0.00은 도로 위에 아무런 차도 없다는 뜻: 사실 0.00부터 1.00까지는 대기 중인 차가 없다는 뜻으로, 새로 건너려는 차는 바로 다리를 건널 수 있음을 뜻한다.
  • 1.00은 다리가 차로 꽉 들어차 있다는 뜻: 사실 이 경우 차량 통행에 큰 문제는 없을 테지만 차가 조금이라도 늘어난다면 통행에 문제가 생길 것이다.
  • 1.00이 넘는다면? 대기 중인 차가 있다는 뜻: 그럼 대기 중인 차량이 얼마나 되는 진 어떻게 알 수 있을까? 대기 중인 자동차가 다리 위를 이미 점유하고 있는 차들 대수만큼 있을 때의 값을 2.00으로 정하면 된다. 만약 값이 3.00이라면 다리 위의 두 배 되는 차가 대기 중인 상태를 뜻한다.

위에서 예시로 들었던 내용이 실제로 CPU load 값이 나타내는 의미이다. 대기 중인 자동차는 CPU time을 사용 중인 프로세스들을 의미하고, 대기 중인 차는 큐에 쌓인 프로세스들을 의미한다.


Unix에는 run-queue length라는 개념이 있는데, 실제로 구동 중인 프로세스 개수와 대기 중인 프로세스 개수의 총합을 의미한다.


차량이 대기 중인 것은 누가 봐도 바람직한 상황은 아니기 때문에(그리고 프로세스의 경우에도 똑같기 때문에) CPU load는 1.00 이하인 것이 바람직하다. 가끔 1.00을 넘기는 경우야 괜찮지만, 지속적으로 높은 값을 유지한다면 문제인 것이다.

 

그럼, 이상적인 로드 값이 1.00이란 말인가요?


일반적인 시스템 관리자들은 0.70 정도를 상한선으로 본다.

  • 0.70을 갓 넘었다면: 이제 슬슬 무엇이 문제인지 확인해두는 편이 좋다. 상태가 더 나빠지기 전에.
  • 1.00을 넘었다면: 당장 문제를 찾아내서 고쳐야 한다. 안 그러면 서버 때문에 자다가 불려나갈지도 모르니.
  • 5.00을 넘었다면: 정말 심각한 상황이다. 시스템이 행에 걸리거나 느려지는 중이니 이대로 두면 위험하다.


그렇다면 멀티 프로세서 환경에선 어떤가요? 지금 3.00을 찍고 있는데 잘 동작 하는걸요?


쿼드-프로세서 시스템인가? 그래도 여전히 높다.


멀티 프로세서 시스템에서의 load 값은 가용한 프로세서 코어 개수에 영향 받는다. 100% 사용 중이라면 싱글 코어는 1.00, 듀얼 코어는 2.00으로 나타날 것이다. (당연히 쿼드 코어에서는 4.00)


다리를 다시 예로 들면, 1.00은 다리 한 개의 자동차 최대 용량이다. 즉, 두 개의 다리가 있는 경우에 값이 1.00이라면, 다리 한 개만 가득 찬 상황이라는 것이다. 즉, 전체적으로 보면 50%만 점유된 상태다.


CPU에 대해서도 똑같다. 1.00이란 뜻은 싱글 코어 시스템에서 CPU가 100% 점유된 상태라는 뜻이다. 듀얼 코어 시스템에서는 당연히 2.00에 해당된다.


멀티 코어 VS 멀티 프로세서


순전히 퍼포먼스 관점에서는, 싱글 듀얼코어 프로세서나 싱글코어 프로세서 두 개나 매한가지이다. 물론 여기에는 캐시라던가 여러가지 이슈 사항들이 있지만, CPU load 관점에서는 코어 개수가 가장 중요한 이슈이다.


간단히 요약을 해 보면,

  • 코어 개수 = 최대 Load 값: 멀티 코어 시스템에서는 load가 코어 개수를 넘어가서는 안 된다.

다시 원점으로 돌아가 보자.


uptime 명령어를 입력했을 때의 결과를 한 번 살펴보자.


[root@localhost ~]$ uptime

23:05 up 14 days, 6:08, 7 users, load averages: 0.65 0.42 0.36


현재 이 시스템은 듀얼코어 시스템으로, 아직 여유가 많이 남아 있음을 알 수 있다. 그럼 저 세 개의 숫자는 결국 무슨 뜻일까? 0.65는 최근 1분, 0.42는 최근 5분, 0.36은 최근 16분 간의 평균 실행/대기 중인 프로세스 수이다.


그럼 어떤 평균 값을 봐야합니까? 1분? 5분? 아니면… 15분?!


지금까지 얘기 했던 “1.00일 땐 시스템을 점검해야해요!”의 관점에서 보자면, 5분이나 15분 평균을 봐야 한다. 사실 1분 동안 잠시 1.00을 넘는 정도야 괜찮다. 15분 평균이 1.00을 넘기면 서버가 지속적인 부하 상태에 남아 있다는 뜻이므로 시스템을 점검하는 편이 좋다. (다시 한 번 강조하지만, 시스템의 코어 개수에 따라 이상적인 Load 값이 결정된다.)


그러면 코어 개수 확인은 어떻게 하나요?


다음의 명령어를 사용하면 된다.


[root@localhost ~]$ cat /proc/cpuinfo


정말 ‘개수’만 알고 싶으면 다음의 명령어를 입력한다.


[root@localhost ~]$ grep name /proc/cpuinfo | wc -l

 

Scout으로 리눅스 CPU Load 모니터링 하기


다음의 링크를 참고하자: Scout


블로그 대문용 이미지입니다 :)



Comments