Snow flake

[command] iostat, vmstat 명령어 본문

Programming/Linux

[command] iostat, vmstat 명령어

MAYSON 2026. 9. 25. 23:29
반응형

top으로 CPU/메모리 전반을, netstat/ss로 네트워크를 확인했다면, 디스크 I/O 병목이 의심될 때는 iostat과 vmstat을 사용합니다. nohup으로 돌려둔 배치나 데이터펌프 작업이 유독 느릴 때, CPU는 멀쩡한데 디스크에서 막히고 있는 건 아닌지 확인하는 용도로 자주 쓰입니다.

iostat이란

iostat은 Input/Output Statistics의 약자로, 디스크 장치별 입출력 상태를 보여주는 명령어입니다. sysstat이라는 패키지에 포함되어 있어서, 설치되어 있지 않다면 별도로 설치가 필요할 수 있습니다.

# 설치가 안 되어 있는 경우 (배포판에 따라 다름)
yum install sysstat        # RHEL/CentOS 계열
apt install sysstat        # Ubuntu/Debian 계열

# 사용법
iostat [옵션] [간격] [횟수]

# 기본 실행 (부팅 이후 누적 통계 한 번 출력)
iostat
iostat 기본 출력 읽는 법
# 결과 예시
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           3.20    0.00    1.10    0.20    0.00   95.50

Device            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              12.50       340.20       210.50    5024000    3108000
sdb               3.10        50.10        80.30     740000    1186000

%iowait는 CPU가 디스크 입출력을 기다리느라 놀고 있는 시간의 비율입니다. 이 값이 지속적으로 높다면 CPU 자체의 문제가 아니라 디스크가 병목이라는 신호입니다. tps(transfers per second)는 초당 디스크 입출력 요청 횟수, kB_read/s와 kB_wrtn/s는 초당 읽기/쓰기 처리량을 의미합니다.

iostat 반복 실행하기

기본 실행은 시스템이 부팅된 이후의 누적 평균을 보여주기 때문에, 현재 상황을 파악하기엔 부적합할 때가 많습니다. 간격과 횟수를 지정하면 top처럼 일정 주기로 갱신되는 값을 볼 수 있습니다.

# 2초 간격으로 5번 반복 출력
iostat 2 5

# 사람이 읽기 쉬운 단위(MB)로 변환해서 표시
iostat -m 2 5

# 확장 통계(대기 시간, 큐 길이 등)까지 표시
iostat -x 2 5

iostat 2 5처럼 실행하면, 첫 번째 출력은 부팅 이후 누적 평균이고 두 번째 출력부터는 실제로 최근 2초간의 변화만 반영된 값이 나옵니다. 그래서 실무에서는 첫 번째 출력은 무시하고 두 번째 출력부터 참고하는 경우가 많습니다.

vmstat이란

vmstat은 Virtual Memory Statistics의 약자로, 이름은 메모리 통계처럼 보이지만 실제로는 CPU, 메모리, 스왑, 디스크 입출력을 한 화면에 종합적으로 보여주는 명령어입니다.

# 사용법
vmstat [간격] [횟수]

# 2초 간격으로 5번 반복 출력
vmstat 2 5

# 결과 예시
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 2048576 102400 4200000    0    0    45    80  120  340  4  1 95  0  0

vmstat 컬럼 읽는 법

컬럼이 많아 보이지만, 실무에서는 몇 가지 핵심 컬럼만 눈여겨보면 됩니다.

-- r: 실행 대기 중인 프로세스 수. CPU 코어 수보다 지속적으로 크면 CPU 부족 신호
-- b: 자원(디스크 I/O 등)을 기다리며 블록된 프로세스 수
-- swpd: 사용 중인 스왑 메모리 용량. 이 값이 계속 늘어나면 물리 메모리 부족 신호
-- si/so: 스왑 인/아웃 속도. 0이 아닌 값이 계속 나온다면 메모리 부족이 심각하다는 뜻
-- bi/bo: 초당 블록 입력/출력(디스크 읽기/쓰기)
-- wa: top 글에서 다뤘던 것과 동일한 I/O 대기 시간

특히 si, so(스왑 인/아웃) 값이 계속 0보다 크게 나온다면 심각한 신호입니다. 스왑은 물리 메모리가 부족할 때 디스크를 메모리처럼 사용하는 기능인데, 디스크는 메모리보다 훨씬 느리기 때문에 스왑이 활발하게 일어나고 있다는 건 시스템이 매우 느려지고 있다는 뜻입니다.

iostat과 vmstat, 언제 뭘 써야 할까

디스크 장치별로 세밀하게 I/O 상태를 보고 싶을 때 → iostat (여러 디스크가 있을 때 어떤 디스크가 문제인지 구분 가능)

CPU, 메모리, 스왑, 디스크를 한 화면에서 종합적으로 훑어보고 싶을 때 → vmstat (전체적인 감을 빠르게 잡기 좋음)

장애 초기에는 vmstat으로 전체적인 그림을 먼저 파악하고, 디스크 쪽이 의심되면 iostat으로 더 구체적인 디스크별 수치를 확인하는 순서로 접근하는 경우가 많습니다.

실무에서 자주 마주치는 상황

nohup으로 백그라운드에 돌려둔 배치 작업이 평소보다 느리게 끝날 때, 원인을 찾는 흐름은 다음과 같습니다.

# 1단계: 전체적인 시스템 상태를 vmstat으로 훑어보기
vmstat 2 5

# 결과에서 wa(I/O 대기) 값이 높고, b(블록된 프로세스)가 계속 존재하는 것을 확인했다고 가정

# 2단계: 어떤 디스크 장치가 병목인지 iostat으로 세부 확인
iostat -x 2 5

# 결과에서 특정 디스크(sdb)의 await(대기 시간)가 유독 높은 것을 확인

# 3단계: 해당 디스크를 쓰는 프로세스가 무엇인지 ps/top으로 교차 확인
ps -ef | grep expdp

# 4단계: 디스크 병목이 확인되면, 배치 시간대를 조정하거나 디스크 증설 등 후속 조치 검토

"배치가 느려졌다"는 이유만으로는 원인이 CPU인지, 메모리인지, 디스크인지 알 수 없습니다. vmstat으로 큰 그림을 먼저 잡고, iostat으로 디스크 쪽을 세밀하게 파고드는 이 흐름은 성능 저하 문제를 진단할 때 표준적으로 쓰이는 접근 방식입니다.

반응형

'Programming > Linux' 카테고리의 다른 글

[command] whoami, hostname, uname 명령어  (0) 2026.09.27
[command] date, cal 명령어  (0) 2026.09.26
[command] wc, head, tail 명령어  (0) 2026.09.23
[command] netstat, ss 명령어  (0) 2026.09.22
[command] top 명령어  (0) 2026.09.21
Comments