본문 바로가기
IT

[리눅스 중급 #7] 데이터 전송의 동맥경화를 뚫다: iotop과 iostat으로 진단하는 디스크 I/O 병목 해결 전략

by sunyjiny 2026. 4. 3.
반응형

English Abstract: Resolving Disk I/O Bottlenecks via iotop and iostat—Diagnostic Strategies for High-Throughput Linux Systems

The seventh installment of the Linux Intermediate series focuses on "Storage I/O Observability and Troubleshooting." In high-performance computing and automated media environments, disk latency often becomes the ultimate ceiling for system scalability. This article explores the architectural methodology of identifying disk bottlenecks using iostat for macroscopic device statistics and iotop for microscopic process-level attribution. By employing a professional metaphor—comparing disk I/O to an urban logistics distribution center—we provide a technical deep dive into metrics such as %util, await, and disk throughput. The post includes a technical "Mise-en-scène" analysis of terminal-based I/O telemetry, a UML Class Diagram mapping characters from the film 'Harbin' to I/O scheduling roles, and practical optimization recipes. This guide serves as a high-value blueprint for engineers seeking to eliminate storage-induced latencies and ensure architectural fluidness.

1. 서론: 인프라의 보이지 않는 천장, 디스크 I/O의 병목

리눅스 시스템 아키텍처에서 CPU가 두뇌이고 메모리가 작업대라면, 저장 장치(Storage)는 거대한 **'물류 창고'**와 같습니다. 아무리 두뇌가 빠르고 작업대가 넓어도, 창고에서 물건을 실어 나르는 트럭들이 입구에서 엉켜 있다면 전체 공정은 멈출 수밖에 없습니다. 이를 우리는 **'I/O 병목(I/O Bottleneck)'**이라 부릅니다.

초보 엔지니어가 top 명령어의 wa(I/O Wait) 수치를 보고 당황할 때, 중급 엔지니어는 즉시 청진기를 꺼내 듭니다. 오늘 우리가 다룰 **iostat**과 **iotop**은 각각 창고 전체의 물동량을 감시하는 **'CCTV'**와, 길을 막고 있는 특정 트럭을 찾아내는 **'교통 경찰'**의 역할을 수행합니다. 데이터의 흐름이 막혀 시스템이 숨 가빠하는 순간, 그 원인을 정확히 타격하는 진단 기법을 전수해 드립니다.

2. 경험담: 렌더링 서버의 '침묵의 살인자'와 아연 한 알의 통찰

유튜브 쇼츠 자동화 시스템을 운영하며 수백 개의 4K 소스 영상을 동시에 처리하던 어느 날, CPU 점유율은 20%도 안 되는데 시스템의 부하 지수(Load Average)가 50을 넘어가는 기현상을 목격했습니다. 렌더링 엔진은 멈춰 섰고, 마우스 커서조차 끊기기 시작했죠. 마감 시한은 다가오는데 원인을 알 수 없는 정체 현상은 제 만성 위염을 사정없이 자극했습니다.

타 들어가는 속을 달래려 아연과 마그네슘 영양제를 삼키며 제가 가장 먼저 한 일은 iostat -xz 1 명령어를 입력한 것이었습니다. 특정 SSD의 %util(사용률)이 100%를 찍고 있었고, await(응답 대기 시간)는 500ms를 넘기고 있었습니다. 창고 입구에서 사고가 난 것이죠. 뒤이어 iotop을 실행하자, 백업 스크립트가 렌더링 작업과 같은 디스크를 쓰며 미친 듯이 쓰기(Write) 작업을 수행 중인 것을 발견했습니다. 범인을 검거하고 작업 우선순위를 조정하자마자 시스템은 다시 활기를 되찾았습니다. (이때의 쾌감은 마치 정갈한 비빔밥에 실수로 섞여 들어간 단무지 조각을 완벽히 골라냈을 때의 평온함과 같았습니다.)

3. '미장센'으로 분석한 I/O 관제 화면의 기술적 분석

중급 엔지니어의 터미널은 단순한 텍스트 창이 아니라, 시스템의 질서를 보여주는 **미장센(Mise-en-scène)**적 공간입니다.

1. 수직적 텍스트의 폭포와 수평적 통계: 질서의 구도

  • 기술적 분석: iostat의 출력 화면은 장치별로 정렬된 **'수평적 위계'**를 가집니다. Device, tps, r/s, w/s 등의 열이 일직선으로 배치된 구도는 인프라의 안정성을 시각화합니다. 반면, iotop은 프로세스들이 실시간으로 위치를 바꾸며 오르내리는 **'수직적 유동성'**을 보입니다. 이 두 화면의 대비—정적인 장치 통계와 동적인 프로세스 활동—는 엔지니어에게 "물리적 한계(Device)"와 "논리적 혼란(Process)" 사이의 균형을 시각적으로 프레이밍(Framing)합니다.

2. 색상 대비와 깜빡임(Blinking): 긴급도의 시각화

  • 기술적 분석: iotop에서 부하가 높은 프로세스가 상단으로 치고 올라오며 볼드체(Bold)나 반전 색상으로 강조되는 효과는 영화에서 긴박한 장면을 클로즈업(Close-up)하는 기법과 유사합니다. 특히 Total DISK READ 수치가 빨간색으로 점멸할 때, 엔지니어는 본능적으로 시스템의 **'동맥경화'**를 인지하게 됩니다. 검은 배경 위에서 쉴 새 없이 변하는 하얀 숫자들은 거대한 정보의 파도 속에서 '장애'라는 핵심 피사체를 부각시키는 고도의 시각적 장치입니다.

4. Action: iostat & iotop 실전 진단 가이드 (Intermediate Drill)

중급자라면 전체적인 상황판(iostat)을 먼저 보고, 문제의 범인(iotop)을 추적하는 하향식(Top-down) 접근법을 사용해야 합니다.

1. iostat으로 장치 레벨 병목 진단 가장 먼저 확인해야 할 것은 물리적인 저장 장치가 한계에 도달했는지 여부입니다.

Bash
 
# -x: 상세 정보, -z: 활동 없는 장치 제외, 1: 1초 간격 갱신
iostat -xz 1
  • %util: 장치가 가동된 시간의 비율입니다. 100%에 근접하면 장치가 쉴 새 없이 일하고 있다는 뜻입니다.
  • await: I/O 요청이 처리될 때까지 걸린 평균 시간(ms)입니다. SSD 기준 10ms 이상이면 병목을 의심해야 합니다.

2. iotop으로 자원 점유 프로세스 검거 물리적 병목이 확인되었다면, 어떤 놈이 범인인지 찾아야 합니다.

Bash
 
# -o: 현재 I/O를 발생시키는 프로세스만 표시, -Pa: 프로세스별 누적 사용량 표시
sudo iotop -oa
  • DISK READ/WRITE: 실시간 초당 전송량입니다.
  • IO: 해당 프로세스가 I/O 대기에 사용한 시간 비중입니다. 이 수치가 높을수록 해당 프로세스가 시스템 전체를 느리게 만드는 주범일 확률이 높습니다.

5. 영화 '하빈' 인물 관계의 IT적 재해석: UML 클래스 다이어그램

영화 **'하빈'**의 인물들이 거사를 위해 물자를 수송하고 감시망을 피하는 과정을 I/O 매니지먼트 아키텍처로 해석하여 UML 클래스 다이어그램으로 형상화했습니다.

  • Commander (안중근) 클래스: 핵심 실행 프로세스입니다. writeHistory() 메소드를 수행하기 위해 대량의 DataPackage를 생성합니다.
  • LogisticsInspector (iostat) 인터페이스: 전체 보급로(Disk)의 정체 상태를 감시합니다. getUtilRate() 메소드를 통해 병목 여부를 보고합니다.
  • TrafficPolice (iotop) 클래스: 보급로를 점거한 특정 인물(Process)을 식별합니다. identifyHogger() 메소드를 통해 범인을 색출합니다.
  • NarrowBridge (이토 히로부미) 클래스: 시스템의 발전을 가로막는 '저성능 디스크' 또는 **'I/O 대기열'**입니다. 모든 프로세스가 이 다리를 건너려다 병목이 발생하며, 엔지니어에 의해 optimize() 되어야 할 대상입니다.
  • Dependency (연관 관계): An Jung-geun 프로세스는 거사를 위해 Disk에 접근해야 하며, iostat과 iotop은 이 연결 고리에서 발생하는 지체(Latency)를 데이터로 기록합니다.

6. After: 정체 없는 데이터 고속도로의 완성

디스크 I/O 최적화를 마친 후, 제 유튜브 자동화 인프라는 다음과 같은 극적인 변화를 맞이했습니다.

  • 예측 가능한 배포 속도: 백업 작업과 렌더링 작업이 서로 다른 디스크 채널을 사용하도록 격리하여, 작업 시간이 40% 이상 일정하게 단축되었습니다.
  • 애플리케이션 응답성 향상: 데이터베이스 쿼리가 디스크 쓰기 대기에 걸려 멈추는 일이 사라져, 사용자 체감 속도가 비약적으로 개선되었습니다.
  • 엔지니어의 평화: 시스템의 '동맥경화'를 미리 진단하고 예방할 수 있게 되니 위염 증세가 완화되었습니다. 이제 새벽의 디스크 경고 대신, 정해진 시간에 깔끔하게 완료된 로그를 확인하며 하루를 시작합니다.

7. iostat vs iotop 기술적 비교 분석

구분iostat (매크로 분석)iotop (마이크로 분석)
관찰 대상 물리적 디스크 장치 (sda, nvme0n1 등) 개별 프로세스 및 스레드 (PID)
핵심 지표 %util, await, tps DISK READ/WRITE, IO %
사용 사례 "디스크 자체가 한계인가?" "어떤 프로세스가 범인인가?"
정밀도 시스템 전체 통계 기반 실시간 프로세스 활동 기반
비유 고속도로 교통 상황실 전광판 현장의 암행어사/교통 경찰

8. 마치며: 인프라의 혈류를 다스리는 조율사가 되십시오

리눅스 중급 과정의 일곱 번째 단계를 마쳤습니다. iostat과 iotop을 다룬다는 것은 단순히 숫자를 읽는 것이 아니라, 시스템 내부에 흐르는 데이터의 **'혈류'**를 통제하는 법을 배웠음을 의미합니다. 하드웨어의 한계에 불평하지 마십시오. 그 한계 속에서 자원을 어떻게 영리하게 배분하고 흐름을 관리하느냐가 마스터의 가치를 결정합니다. 여러분의 데이터 고속도로는 이제 막힘없이 뚫릴 준비가 되었습니다.

오늘의 중급 인사이트: "CPU가 시스템의 지능이라면, I/O는 시스템의 근력이다. 아무리 똑똑해도 근육이 경직되면 아무것도 할 수 없다."

9. 출처 및 참고 자료 (Sources & References)

  1. Sysstat Official Project (iostat): http://sebastien.godard.pagesperso-orange.fr/
  2. iotop Project Documentation: http://guichaz.free.fr/iotop/
  3. Brendan Gregg, "Systems Performance": 디스크 I/O 분석 방법론의 정석
  4. Linux Kernel Documentation - I/O Schedulers: 커널 입출력 스케줄러 알고리즘 분석

반응형