OS 및 스토리지/Linux

[Linux] 리눅스 time, uptime을 활용한 Load Average 확인 및 활용

Cloud Engineer 2022. 3. 19. 16:56

1. 배경

리눅스 시스템에서 1분, 5분, 15분 단위로 평균 부하를 파악하고 관련 정보를 활용하여 장애 발생 전 조치를 취해야됩니다. 이 때 평균 부하 즉 Load Average를 확인하기 위해 사용되는 명령어가 uptime 명령어이며, 특정 프로그램 혹은 명령어(사실 ls 등의 명령어도 일종의 프로그램입니다.)의 실행시간 등을 파악할 때 time 명령어가 사용됩니다. 본 포스팅에서는 time, uptime 명령어에 대해 각각 알아보고 해당 결과값 데이터를 통해 확인할 수 있는 내용과 활용 방안에 대해 소개하겠습니다.

2. time 명령어 : 특정 프로그램의 실행 시간을 확인

my-binary라는 프로그램을 실행시킨 직후부터 완료되기까지 실제 소요되는 시간을 확인하기 위해서는 time 명령어를 사용합니다. 리눅스 서버에서 실제 time 명령어를 통해 확인해보겠습니다.

$ time ./my-binary
real 30m00.02s
user 15m35.32s
sys  20m03.29s

위의 결과값을 통해 저희가 알아낼 수 있는 정보에 대해 알아보겠습니다.

2.1. - 명령어 실행 시간을 다각화 : real time, user time, sys time

  • real : 특정 프로그램을 실행 후 완료되기까지 실제 소요되는 시간
    • real = 프로그램 종료 시간 - 프로그램 실행 시간
    • gettimeofday() 시스템 콜을 사용하여 소요 시간을 리턴
  • user : 유저 영역에서 프로그램이 실행된 시간
  • sys : 커널 영역에서 프로그램이 실행된 시간
    • 메모리 할당 및 하드웨어 접근 등의 작업 수행 시간 측정
    • 커널 처리 명령어 예시: 메모리 동적 할당(malloc) 호출 시 실제 메모리에서 수행되는 시간, 파일 I/O (fread, fwrite) 등

2.2. - CPU 코어 개수를 확인할 수 있다?

나아가, real, user, sys의 정보를 활용하여 서버에서 구동 중인 CPU 코어 개수를 파악할 수도 있는데요. 일반적으로 자주 혼동하는 부분이real time = user time + sys time이라고 생각하는 것입니다. 하지만, 위의 사례에서 볼 수 있듯이 real time < user time + sys time이 될 수 있습니다. 이러한 현상이 발생할 수 있는 이유는 여러 개의 CPU 코어를 활용하여 프로그램을 실행하기 때문입니다. 즉 다중 프로세서 시스템에서 프로세스 또는 쓰레드가 병렬로 실행될 수 있으므로 전체 CPU 시간보다 경과 시간이 더 짧을 수 있습니다. 따라서 위의 데이터를 통해 sys time + user time =< real time * CPU 개수라는 일반화된 공식을 만들 수 있습니다.

3. uptime : 서버의 전체적인 CPU 부하율을 확인

리눅스 서버에서 uptime 명령어를 실행시키면 아래와 같은 결과를 리턴합니다.

$ uptime
# 현재 시간 # 가동시간   # 로그인 중인 사용자 수     평균 부하율   : 1분   5분  15분
  13:39  up 6 mins,      2 users,        load averages: 3.22 5.56 2.95

즉, uptime 명령어를 통해 아래와 같은 정보를 확인할 수 있습니다.

  • 현재 시간 : 13시 39분
  • 시스템 부팅 후 구동 시간 : 6분
  • 시스템에 로그인 중인 사용자 수 (/var/run/utmp에서 데이터 참조) : 로그인 유저는 2명
  • 1, 5, 15분 동안의 시스템 평균 CPU 부하율 : 1분 동안 3.22, 5분 동안  5.56, 15분 동안 2.95

3.1. - CPU 코어 수에 따라 해석이 달라지는 Load Average

서버가 소유한 CPU 코어 개수에 따라 Load Average의 결과값 수치가 같더라도 서버 상태 해석이 달라질 수 있습니다. 같은 수치에 대해 서로 다른 서버가 가지고 있는 코어 개수가 다음과 같다고 가정하겠습니다.

3.1.1. - 싱글 코어 (CPU 코어 1개)

  • 1.0 : CPU가 100% 사용 중
  • 2.0 : CPU가 100% 사용 중, 처리할 전체 프로세스의 50%는 처리 중이며, 나머지 50%는 대기 중
  • 4.0 : CPU가 100% 사용 중, 처리할 전체 프로세스의 25%는 처리 중이며, 나머지 75%는 대기 중

3.1.2. - 듀얼 코어 (CPU 코어 2개)

  • 1.0 : CPU가 50% 사용 중
  • 2.0 : CPU가 100% 사용 중
  • 4.0 : CPU가 100% 사용 중, 처리할 전체 프로세스의 50%는 처리 중이며, 나머지 50%는 대기 중

Load Average에서 나타내는 데이터는 부하율을 의미하기 때문입니다. CPU 사용률을 통해 다음과 같은 현상을 파악할 수 있습니다.

3.2. - CPU 사용률 : 미래에 일어날 수 있는 장애를 사전에 차단할 수 있는 핵심 지표

3.2.1. - CPU 사용률이 70% 초과

  • 문제: 아직은 서버 상태에 문제가 없으나 문제점을 파악하면 좋은 시점입니다.
  • 조치 방안
    • CPU 증설
    • CPU 점유율이 높지만 중요하지 않는 프로세스 종료 ex) notepad, Chrome 등
    • 서버 재부팅
    • etc.

3.2.2. - CPU 사용률이 100% 빈번하게 찍음

  • 문제: 서버 상태가 응급사항이며, 빠른 시일 내에 다음과 같은 조치를 취해야합니다.
  • 조치 방안
    • CPU 증설
    • CPU 점유율이 높지만 중요하지 않는 프로세스 종료 ex) notepad, chrome 등
    • 서버 재부팅
    • etc.

3.3. 다양한 Load Average 확인 방법

  • /proc/loadavg 파일 (평균 부하율)
  • uptime 명령어 (+현재시간 및 구동 시간 + w 명령어 결과)
  • w 명령어 (+현재 로그인 중인 사용자 정보)
  • top 명령어 (+프로세스 실행 현황 확인)

[출처]

- http://daplus.net/unix-%EC%8B%9C%EA%B0%84-1%EC%9D%98-%EC%B6%9C%EB%A0%A5%EC%97%90%EC%84%9C-%E2%80%8B%E2%80%8B%EC%8B%A4%EC%A0%9C-%EC%82%AC%EC%9A%A9%EC%9E%90%EB%B0%8F-sys%EB%8A%94-%EB%AC%B4%EC%97%87/