Ubuntu 서버 자원 사용량을 확인하는 모니터링 명령어 정리

안녕하세요. 비전 IDC 기술팀입니다.

웹사이트 응답이 느려졌거나 서버 접속이 버벅일 때 가장 먼저 해야 할 일은 CPU, 메모리, 디스크, 네트워크 중 어느 자원이 병목인지 확인하는 것입니다. 별도의 모니터링 시스템이 없더라도 Ubuntu에 기본 포함되어 있거나 패키지로 쉽게 설치할 수 있는 명령어만으로 대부분의 원인을 좁힐 수 있습니다.

이 문서에서는 Ubuntu 20.04 / 22.04 / 24.04 서버에서 uptime, top, htop, free, vmstat, iostat, df, du, ss, iftop, nload, journalctl을 사용해 자원 사용량을 확인하는 방법과 각 수치를 해석하는 요령을 정리합니다.

적용 환경

  • 운영체제: Ubuntu 20.04 LTS / 22.04 LTS / 24.04 LTS
  • 기본 포함 명령: uptime, top, free, vmstat, df, du, ss, journalctl
  • 추가 설치 패키지: htop, sysstat(iostat), iftop, nload
  • 권한: 일부 명령(ss -p, iftop, 전체 로그 조회)은 sudo 권한 필요

1. 필요한 도구 설치

기본 설치 이미지에 따라 일부 도구가 없을 수 있으므로 한 번에 설치해 둡니다.

sudo apt update
sudo apt install -y htop sysstat iftop nload

설치 여부는 다음과 같이 확인할 수 있습니다.

which htop iostat iftop nload

2. uptime과 load average 이해

서버 상태를 가장 빠르게 요약해 보는 명령은 uptime입니다.

uptime
 14:32:10 up 23 days,  4:11,  2 users,  load average: 0.52, 0.78, 1.05

출력은 현재 시각, 부팅 후 경과 시간, 로그인 사용자 수, 그리고 load average 세 값으로 구성됩니다. 세 값은 각각 최근 1분, 5분, 15분 동안의 평균 부하입니다.

리눅스의 load average는 CPU에서 실행 중이거나 실행을 기다리는 프로세스 수에 더해, 디스크 I/O 등을 기다리며 중단할 수 없는 대기 상태(D 상태)에 있는 프로세스 수까지 포함한 값입니다. 따라서 CPU 사용률이 낮은데 load average만 높다면 디스크나 스토리지 I/O 대기를 의심해 볼 수 있습니다.

값의 크고 작음은 CPU 코어 수와 비교해 판단합니다.

nproc
  • load average가 코어 수보다 낮으면 대체로 여유가 있는 상태입니다.
  • 코어 수와 비슷하면 자원을 거의 최대로 사용 중인 상태입니다.
  • 코어 수를 지속적으로 넘으면 처리를 기다리는 작업이 쌓이고 있다는 뜻입니다.

또한 1분 값이 15분 값보다 크면 부하가 증가하는 중이고, 반대라면 줄어드는 중이라고 볼 수 있습니다.

3. top으로 실시간 프로세스 확인

top은 모든 Ubuntu에 기본 포함된 실시간 모니터링 도구입니다.

top

상단 요약 영역에서 특히 %Cpu(s) 줄을 주의 깊게 봅니다.

top의 CPU 항목 의미
항목 의미 높을 때 의심할 점
us 사용자 프로세스가 사용한 CPU 웹 서버, PHP, Java 등 애플리케이션 부하
sy 커널이 사용한 CPU 과도한 시스템 호출, 네트워크 처리량 증가
id 유휴 CPU 낮을수록 CPU 여유가 없음
wa I/O 완료를 기다린 시간 디스크 병목, 스왑 발생
st 가상화 환경에서 하이퍼바이저에 빼앗긴 시간 VPS에서 호스트 자원 경합

top 실행 중 자주 사용하는 단축키는 다음과 같습니다.

  • P: CPU 사용률 순으로 정렬
  • M: 메모리 사용률 순으로 정렬
  • 1: CPU 코어별 사용률 표시 전환
  • c: 프로세스의 전체 명령줄 표시 전환
  • q: 종료

한 번만 출력해 파일로 남기거나 다른 사람에게 전달하려면 배치 모드를 사용합니다.

top -b -n 1 | head -n 20

4. htop으로 보기 쉽게 확인

htoptop과 같은 정보를 색상과 막대그래프로 보여 주어 코어별 사용률과 메모리 상태를 직관적으로 파악할 수 있습니다.

htop
  • 상단 막대: 코어별 CPU 사용률, 메모리(Mem), 스왑(Swp) 사용량
  • F6: 정렬 기준 선택 (CPU%, MEM% 등)
  • F5: 부모·자식 관계를 트리 형태로 표시
  • F4: 프로세스 이름으로 필터링
  • F9: 선택한 프로세스에 시그널 전송(종료)
  • F10 또는 q: 종료

5. free로 메모리 사용량 확인

free -h
               total        used        free      shared  buff/cache   available
Mem:           3.8Gi       1.2Gi       310Mi        24Mi       2.3Gi       2.3Gi
Swap:          2.0Gi          0B       2.0Gi

리눅스는 남는 메모리를 파일 캐시(buff/cache)로 적극적으로 사용하므로 free 값이 작다고 해서 메모리가 부족한 것은 아닙니다. 실제로 새 프로그램이 사용할 수 있는 메모리는 available 값으로 판단합니다.

  • available이 전체의 10% 이하로 계속 낮게 유지된다면 메모리 부족을 의심합니다.
  • Swapused가 계속 증가하면 물리 메모리가 부족해 디스크를 메모리처럼 쓰고 있다는 신호이며, 성능이 크게 떨어질 수 있습니다.

메모리를 많이 사용하는 프로세스는 다음 명령으로 확인합니다.

ps aux --sort=-%mem | head -n 10

메모리 부족으로 커널이 프로세스를 강제 종료(OOM Killer)한 기록이 있는지도 확인합니다.

sudo journalctl -k | grep -i -E 'out of memory|oom-kill'

6. vmstat으로 전체 흐름 확인

vmstat은 CPU, 메모리, 스왑, I/O 상태를 일정 간격으로 한 줄씩 출력해 시간에 따른 변화를 보기에 좋습니다. 아래 명령은 1초 간격으로 5번 출력합니다.

vmstat 1 5

첫 번째 줄은 부팅 이후 평균값이므로, 현재 상태는 두 번째 줄부터 확인합니다.

vmstat 주요 항목
항목 의미 해석 요령
r CPU 실행을 기다리는 프로세스 수 코어 수보다 계속 크면 CPU 부족
b 중단 불가능한 대기(주로 I/O) 프로세스 수 0이 아닌 값이 지속되면 I/O 병목
si / so 초당 스왑 인 / 스왑 아웃 양 0이 아닌 값이 계속되면 메모리 부족
bi / bo 블록 장치 읽기 / 쓰기량 디스크 작업량 변화 확인
wa I/O 대기 CPU 비율 높으면 디스크 성능 확인
st 가상화 환경 스틸 타임 VPS에서 지속적으로 높으면 호스트 경합

7. iostat으로 디스크 I/O 확인

iostatsysstat 패키지에 포함되어 있으며, 디스크별 읽기·쓰기 처리량과 대기 시간을 보여 줍니다.

iostat -xz 1 3

-x는 확장 통계, -z는 활동이 없는 장치를 생략하는 옵션입니다. 역시 첫 번째 보고서는 부팅 후 평균이므로 두 번째 이후 결과를 봅니다.

  • r/s, w/s: 초당 읽기·쓰기 요청 수
  • rkB/s, wkB/s: 초당 읽기·쓰기 데이터량
  • r_await, w_await: 요청 하나가 처리되기까지 걸린 평균 시간(ms). 평소보다 크게 늘었다면 디스크 응답이 느려진 상태입니다.
  • %util: 장치가 요청을 처리하느라 바빴던 시간 비율. 100%에 가깝게 유지되면 포화 상태일 수 있습니다. 다만 SSD나 여러 요청을 병렬로 처리하는 장치에서는 이 값만으로 한계에 도달했다고 단정할 수 없으므로 대기 시간과 함께 판단합니다.

출력 항목 이름은 sysstat 버전에 따라 조금씩 다를 수 있습니다. 어떤 프로세스가 디스크를 많이 사용하는지까지 확인하려면 pidstat(sysstat 포함)을 사용할 수 있습니다.

pidstat -d 1 5

8. df와 du로 디스크 용량 확인

파일시스템 전체 사용량

df -h

Use%가 90%를 넘는 파일시스템은 정리가 필요합니다. 특히 /, /var가 가득 차면 로그 기록 실패, 데이터베이스 중단, 패키지 설치 실패 등 다양한 장애가 발생합니다.

용량은 남아 있는데 파일을 만들 수 없다면 inode가 고갈되었을 수 있습니다.

df -i

어느 디렉터리가 용량을 차지하는지 확인

sudo du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -n 15

-x 옵션은 다른 파일시스템으로 넘어가지 않도록 하고, sort -h는 사람이 읽기 쉬운 단위(K, M, G)를 기준으로 정렬합니다. 큰 디렉터리를 찾았다면 경로를 바꿔 한 단계씩 내려가며 확인합니다.

sudo du -xh --max-depth=1 /var 2>/dev/null | sort -h | tail -n 15

systemd 저널이 차지하는 용량은 별도로 확인할 수 있습니다.

journalctl --disk-usage

9. ss, iftop, nload로 네트워크 확인

ss로 대기 포트와 연결 상태 확인

현재 서버에서 어떤 서비스가 어느 포트로 대기하는지 확인합니다.

sudo ss -tulpn

-t는 TCP, -u는 UDP, -l은 대기(LISTEN) 소켓, -p는 프로세스 정보, -n은 이름 변환 없이 숫자로 표시하는 옵션입니다. 의도하지 않은 포트가 외부 주소(0.0.0.0 또는 [::])로 열려 있지 않은지 함께 점검합니다.

연결 수가 비정상적으로 많아 보인다면 상태별 요약을 확인합니다.

ss -s
ss -Htn state established | wc -l

네트워크 인터페이스 이름 확인

iftopnload는 인터페이스 이름을 지정해야 하는 경우가 많습니다. 서버의 인터페이스 이름은 eth0, ens3, enp1s0 등 환경마다 다릅니다.

ip -br address

iftop으로 연결별 트래픽 확인

sudo iftop -i eth0 -n -P

어떤 원격 IP와 어느 포트 사이에서 트래픽이 많이 발생하는지 실시간으로 보여 줍니다. -n은 호스트명 조회를 생략하고, -P는 포트 번호를 표시합니다. 오른쪽 세 열은 최근 2초, 10초, 40초 평균 전송률입니다. 종료는 q입니다.

nload로 전체 송수신량 확인

nload eth0

인터페이스의 수신(Incoming)과 송신(Outgoing) 전송률을 그래프로 보여 줍니다. 서비스 트래픽이 평소보다 급증했는지 빠르게 확인할 때 유용합니다. 종료는 q입니다.

10. journalctl로 오류 로그 확인

자원 사용량과 함께 시스템 로그에서 오류가 발생했는지 확인합니다. -p err는 오류(err) 이상 우선순위의 메시지만 표시합니다.

# 현재 부팅 이후 오류 이상 로그
sudo journalctl -p err -b --no-pager

# 최근 1시간 동안의 오류 로그
sudo journalctl -p err --since "1 hour ago" --no-pager

# 특정 서비스 로그 (예: nginx)
sudo journalctl -u nginx -n 100 --no-pager

디스크 오류나 하드웨어 관련 메시지는 커널 로그에서 확인합니다.

sudo dmesg -T | tail -n 50

11. 상황별 점검 순서

증상별로 먼저 확인할 명령
증상 먼저 확인할 명령 확인 포인트
서버 전체가 느림 uptime, top load average와 코어 수 비교, us/wa/st 중 높은 항목
CPU 사용률이 계속 100% top(P 정렬), htop CPU를 가장 많이 쓰는 프로세스와 실행 계정
응답이 멈칫하고 스왑 사용 증가 free -h, vmstat 1 5 available 값, si/so 값, OOM 기록
CPU는 낮은데 load average가 높음 vmstat 1 5, iostat -xz 1 3 b, wa, await, %util
파일 저장 실패, 서비스 중단 df -h, df -i, du 가득 찬 파일시스템과 대용량 디렉터리
네트워크 속도 저하, 트래픽 급증 nload, iftop, ss -s 트래픽을 유발하는 원격 IP와 포트, 연결 수
원인 불명 서비스 재시작 journalctl -p err -b 오류 메시지와 발생 시각

12. 관련 기술자료와 공식 참고자료

관련 비전 IDC 기술자료

공식 참고자료

13. 자주 묻는 질문

free 값이 거의 0인데 메모리를 증설해야 하나요?

free 값만으로 판단하지 마십시오. 리눅스는 남는 메모리를 캐시로 사용하므로 free가 작은 것은 정상입니다. available 값이 충분하고 스왑 인·아웃이 거의 없다면 메모리가 부족한 상태가 아닙니다.

top의 CPU 사용률이 100%를 넘게 표시됩니다.

프로세스 목록의 %CPU는 코어 하나를 100%로 계산합니다. 4코어 서버에서 한 프로세스가 여러 코어를 사용하면 최대 400%까지 표시될 수 있습니다.

과거 시점의 자원 사용량도 확인할 수 있나요?

이 문서의 명령은 대부분 현재 상태를 보여 줍니다. 과거 기록이 필요하다면 sysstat의 데이터 수집 기능을 활성화한 뒤 sar 명령으로 조회하거나, 별도의 모니터링 시스템을 구성해야 합니다. sysstat 수집 활성화는 sudo dpkg-reconfigure sysstat로 설정할 수 있습니다.

모니터링 명령을 실행하는 것만으로 서버에 부담이 되나요?

일반적인 사용에서는 부담이 거의 없습니다. 다만 du로 파일이 매우 많은 디렉터리 전체를 조회하면 디스크 I/O가 일시적으로 늘어날 수 있으므로, 서비스가 바쁜 시간에는 범위를 좁혀 실행하는 것이 좋습니다.

마무리

이번 문서에서는 Ubuntu 서버에서 load average, CPU, 메모리, 디스크 I/O, 디스크 용량, 네트워크, 오류 로그를 확인하는 기본 명령어와 수치 해석 방법을 정리했습니다.

장애 상황에서는 uptimetop으로 전체 상황을 먼저 보고, 병목으로 의심되는 자원에 맞춰 free·vmstat·iostat·df·iftop으로 범위를 좁혀 가는 순서가 효율적입니다. 평소 정상일 때의 수치를 한 번씩 기록해 두면 문제 발생 시 비교 기준으로 활용할 수 있습니다.

  • 0 사용자에게 유용한 정보 제공
이 답변이 도움이 되었나요?
« Back