리눅스 시스템 운영 중 메모리가 부족해지면 스와핑(Swapping) 현상이 발생합니다. 흔히 "메모리가 부족하면 디스크를 쓰니까 CPU는 상관없지 않나?"라고 생각하기 쉽지만, 실제로는 CPU 사용량이 폭증하며 시스템이 버벅거리게 됩니다.
그 이유를 핵심만 정리해 보겠습니다.
1. 과도한 페이지 폴트(Page Fault) 처리
프로세스가 RAM에 없는 데이터에 접근하려고 하면 하드웨어 인터럽트인 **'페이지 폴트'**가 발생합니다.
- CPU는 하던 일을 멈추고 제어권을 운영체제(커널)에 넘깁니다.
- 커널은 디스크(Swap 영역)에서 해당 데이터를 찾아 RAM으로 올리는 복잡한 예외 처리 과정을 수행합니다.
- 이 과정이 수천, 수만 번 반복되면서 CPU는 '실제 계산'이 아닌 '데이터 찾기'에 기력을 다 소진합니다.
2. 페이지 교체 알고리즘(LRU 등)의 부하
메모리가 꽉 차면 새로운 데이터를 넣기 위해 기존 데이터 중 하나를 골라 디스크로 쫓아내야(Page-out) 합니다.
- CPU는 **"어떤 페이지를 내보낼 것인가?"**를 결정하기 위해 메모리 참조 기록을 뒤지며 알고리즘을 계산합니다.
- 메모리 압박이 심할수록 이 계산 빈도가 잦아지며 CPU 오버헤드가 급격히 증가합니다.
3. I/O Wait와 시스템 모드의 간섭
디스크 I/O는 RAM에 비해 수십만 배 느립니다.
- CPU는 디스크 처리가 끝날 때까지 기다려야(I/O Wait) 하는데, 이 대기 시간 동안 커널은 다음 작업을 준비하거나 문맥 교환(Context Switching)을 시도하며 바쁘게 움직입니다.
- top 명령어를 쳤을 때 %wa(I/O Wait)와 %sy(System) 수치가 높게 나타나는 이유가 바로 이것입니다.
💡 결정타: 스래싱(Thrashing) 현상
스와핑이 한계치에 다다르면 시스템은 스래싱(Thrashing) 상태에 빠집니다.
- 메모리 부족 → 스와핑 발생
- CPU가 스와핑 작업(I/O 지휘)에만 매달림
- 정작 실제 프로그램 실행 속도는 느려짐
- OS는 "CPU가 일을 안 하네?"라고 착각하여 다른 프로세스를 더 실행함
- 메모리가 더 부족해지고 스와핑이 폭증함 (무한 루프)
✅ 요약 및 해결책
- 이유: CPU가 데이터의 위치를 찾고, 메모리와 디스크 사이의 짐 싸기(Page-in/out)를 지휘하느라 정작 본업을 못 하기 때문.
- 해결책:
1. RAM 증설: 가장 확실한 물리적 해결책입니다.
2. Swappiness 조절: /proc/sys/vm/swappiness 값을 낮춰 스왑 사용 억제.
3. 메모리 누수 확인: 특정 프로세스가 메모리를 과하게 먹고 있는지 htop 등으로 체크.
글을 마치며
리눅스 서버의 CPU 사용량이 갑자기 높다면, 무조건 연산량이 많다고 판단하기보다 free -m 명령어로 스왑 상태를 먼저 확인해 보시기 바랍니다!
반응형
'IT관련' 카테고리의 다른 글
| [Git/소스트리] 브랜치 변경 시 파일이 순식간에 바뀌는 마법 같은 원리 (0) | 2026.03.16 |
|---|---|
| ⚡️ await은 왜 까다롭게 굴지 않을까? (0) | 2026.03.13 |
| GitHub에서 글 작성 시 사용하는 마크다운 정리 (0) | 2026.03.13 |
| 📑 UTF-8 with BOM 한눈에 이해하기 (0) | 2026.03.04 |
| 🚀 [Angular] 서버 사이드 렌더링(SSR)과 정적 사이트 생성(SSG) 완벽 정리 (0) | 2026.03.03 |