운영체제/Linux

[Linux] uptime - 서버가 받고있는 부하 평균 측정 및 대응하기

민돌v 2023. 8. 22. 17:53
해당 포스팅은 인프런 "리눅스 성능 분석 시작하기" 를 수강하고 정리한 글입니다 :)
  • 리눅스 기반 os 에서 돌아가는 서버 시스템의 성능 측정 및 장애 대응에 대한 학습 내용 정리 글 입니다.

 

💡 리눅스 성능 분석의 기본 명령어

명령어 역할
uptime 시스템 가동 시간, Load Average 확인
dmesg 커널 메세지 확인 (OOME 발생 여부, SYN Flooding 여부)
free 메모리 사용 현황 확인
df 디스크 여유 공간 및 inode 공간 확인
top 프로세스들의 상태, CPU 사용률, 메모리 사용률 확인
netstat 네트워크 연결 정보 확인
tcpdump 네트워크 트러블 슈팅 분석을 위한 패킷 수집 명령어

 

 

업타임은 동작 중이면서 사용 가능한 기계의 시간을 백분율로 나타낸 시스템의 신뢰성의 측정이다 (위키백과)

 

 


uptime 명령어

  • 리눅스 uptime 명령어는, 시스템의 가동 시간, 로그인한 사용자 수, Load Average (1분, 5분, 15분) 를 확인할 수 있는 명령어 입니다.

 


 

load average 란

  • 서버가 받고 있는 부하 평균 값 (CPU Usage 와 비슷와 비슷하지만 서버가 얼마나 일하고 있느지를 표현하는 또다른 방식)
    • = 단위 시간 (1분, 5분, 15분) 동안의 R과 D 상태의 프로세스 개수


프로세스의 개수가 왜 중요할까?

❓ 왜 프로세스 개수를 평균을 내서 load average라는 값을 낼까

간단하게 정리하여, load average는 사용중인 프로세스의 개수 이기 때문에

  1. cpu 1대, 실행중인 프로세스가 1대 일 때 = load average 는 1 입니다.
  2. cpu 1대, 실행중인 프로세스가 2대 일 때 = load average 는 2 입니다.  (이 때는 os 스케쥴링 알고리즘에의한 context switching 이 일어납니다.)

 

하지만 Load Average는 상대적인 값입니다.

 

  • 아래 사진처럼 똑같이 Load Average가 각각 1, 2 이라고 해도, CPU의 개수에 따라서 의미가 달라집니다.
    • cpu 2, 프로세스 1 = load average 1
    • cpu 2. 프로세스 2 = load average 2

 

 

 

❗️ 정리하자면

  • load Average 가 CPU 개수보다 크다.  → 즉, 처리 가능량을 넘어섰다는 것 → 서버에 부하가 간다는 것

결국 이게 중요하다~!

CPU 개수 측정 명령어

  • linux : lscpu -e
  • mac os : sysctl hw.physicalcpu hw.logicalcpu

 

하지만 항상 괜찮을까~~? 그럴수도 있고 아닐수도 있따~

 


 

🧐 Load Average가 높은 이유는 뭘까? (이게 중요하다)

Load Average 는 R과 D 상태의 프로세스 개수의 평균값이라고 정의했습니다.

 

✔️OS 에서의 프로세스 상태를 크게 분류하면 6가지 상태로 분류할 수 있습니다.

  • new (생성 상태) : 프로세스 생성 상태
  • ready (준비 상태) : 생성된 프로세스가 CPU를 얻을때 까지 기다리는 상태
  • running (실행 상태) : 프로세스의 명령어를 실행 중인 상태
  • waiting (대기 상태) : 입출력을 요구한 프로세스가 입출력이 완료될 때 까지 기다리는 상태
    • 효율성을 높이기 위해 입출력을 요청한 프로세스를 실행 상태에 두지 않고 대기상태로 따로 분류한다.
  • terminated (완료 상태) : 프로세스가 종료된 상태

5가지 프로세스 상태

+ 보류상태 : 프로세스가 메모리에서 잠시 쫒겨난 상태 ( = 일시적 상태)

  • 대부분 컴퓨터 성능을 떨어뜨리거나 실행을 미루어도 큰 지장이 없는 프로세스

보류상태를 포함하는 프로세스 상태도

 


이제 이 프로세스 상태들을 리눅스에서는 아래의 코드로 표현합니다. (출처)

코드  설명(영어) 설명(한국어)
D Uninterruptible sleep (usually IO) 깨울 수 없는 잠 (보통 IO)
R Running or runnable (on run queue) 실행중 또는 실행가능 (실행 큐에 있음)
S Interruptible sleep (waiting for an event to complete) 깨울 수 있는 잠
T Stopped, either by a job control signal or because it is being traced. 중지됨 (작업 제어 신호를 받거나 트레이싱 때문에)
W paging (not valid since the 2.6.xx kernel) 페이징 (커널 2.6.xx 버전부터는 유효하지 않음)
X dead (should never be seen) 죽음 (이런 게 보이면 안되는데)
Z Defunct ("zombie") process, terminated but not reaped by its parent. 좀비 프로세스, 종료되었으나 부모 프로세스에 의해 수습되지 않음

 


👏🏻 R과 D 상태의 프로세스

즉 R과 D 상태란 실행상태와 대기상태를 의미합니다.

 

실행중인 프로세스 상태 확인 방법

  • vmstat 명령어로 확인할 수 있습니다.
  • vmstat 1 하면 백그라운드 실행

 

R (실행 상태) : cpu 위주의 작업 

  • cpu를 필요로하는(연산) 프로세스가 많다는 거기 때문에 CPU의 개수를 늘리거나
  • 스레드의 개수를 조절해야 합니다.

→ CPU를 늘려서 더 많은 연산을 처리할 수 있도록 해주는게 일반적

출처 : 강의 이미지

 

D (대기상태 = b): I/o 위주의 작업

  • D상태의 프로세스가 많다면, CPU보다 I/O작업에서 병목이 일어난다는 것 입니다.
  • IOPS가 높은 디바이스로 변경하거나 처리량을 줄여 합니다.
    • cpu 가 2대, load average 2 (D상태) 이면 CPU를 늘려도 load average 가 내려가지 않습니다. → 소용이 없음
    • 더 많은 I/O를 처리할 수 있는 환경을 만들어 줘야한다.

 

-> 더 많은 IOPS(Input/Output Operations Per Second, IOPS) 를 가지는 ebs로 교체하는게 성능향상으로 이어지는 길!

 

 


📌정리

  • ✔️ uptime 명령어를 통해 리눅스 환경에서 - cpu 가 얼마나 많은 부하를 받고있는지 확인할 수 있습니다.
  • ✔️ load average가 cpu 의 개수 보다 많은 부하를 받고있다면 → 어떤 종류의 프로세스때문인지 확인합니다. (vmstat)
  • ✔️ r 이면 cpu 바운드, b 면 I/O 바운드 이기 때문에 각각 상황에 맞는 대응을 해주어서 부하를 줄여줍니다.