리눅스 파일 시스템과 스왑 메모리 완전 정복: 서버 성능 최적화의 핵심

안녕하세요, 성장하는 개발자 여러분!

개발을 하다 보면 “디스크 용량이 부족해요”, “메모리가 부족하다고 나오는데요”, “파일이 갑자기 사라졌어요” 같은 말을 자주 듣게 됩니다. 이런 문제들은 모두 파일 시스템메모리 관리에 대한 이해 부족에서 비롯됩니다.

특히 서버를 운영하게 되면, 파일 시스템의 구조를 이해하고 스왑 메모리를 적절히 설정하는 것은 선택이 아닌 필수입니다. 오늘은 제가 실무에서 겪은 경험을 바탕으로, 리눅스 파일 시스템과 스왑 메모리를 완전히 정복해 보겠습니다!

1. 리눅스 파일 시스템의 세계: 모든 것은 파일이다

파일 시스템의 종류와 특징

리눅스는 “모든 것은 파일이다”라는 철학을 가지고 있습니다. 하드웨어 정보도, 프로세스 정보도 모두 파일로 관리하죠. 이런 파일들을 효율적으로 저장하고 관리하기 위해 다양한 파일 시스템이 존재합니다.

🗄️ 디스크 기반 파일 시스템

EXT4 (Fourth Extended Filesystem)

  • 현재 가장 널리 사용되는 파일 시스템
  • 최대 16TB 파일, 1EB 파일 시스템 지원
  • 저널링 기능으로 시스템 크래시 시 데이터 복구 가능
# EXT4 파일 시스템 생성
sudo mkfs.ext4 /dev/sdb1

# 파일 시스템 정보 확인
sudo tune2fs -l /dev/sdb1

XFS (X File System)

  • 대용량 파일과 파일 시스템에 최적화
  • B+트리 구조로 빠른 파일 검색
  • RHEL/CentOS 7부터 기본 파일 시스템
# XFS 파일 시스템 생성
sudo mkfs.xfs /dev/sdb1

# XFS 정보 확인
xfs_info /mount/point

💾 메모리 기반 파일 시스템 (Pseudo File System)

tmpfs (Temporary File System)

# 메모리에 임시 파일 시스템 마운트
sudo mount -t tmpfs -o size=1G tmpfs /tmp/ramdisk

# 임시 파일 시스템 확인
df -h | grep tmpfs

procfs & sysfs

# 현재 실행 중인 프로세스 정보
cat /proc/cpuinfo
cat /proc/meminfo

# 시스템 하드웨어 정보
ls /sys/class/

실무에서 파일 시스템 관리하기

파일 시스템 생성과 마운트

# 1. 사용 가능한 디스크 확인
lsblk
fdisk -l

# 2. 파티션 생성 (예: /dev/sdb에 새 파티션 생성)
sudo fdisk /dev/sdb
# n (new partition) -> p (primary) -> 1 -> Enter -> Enter -> w (write)

# 3. 파일 시스템 생성
sudo mkfs.ext4 /dev/sdb1

# 4. 마운트 포인트 생성
sudo mkdir /data

# 5. 임시 마운트
sudo mount /dev/sdb1 /data

# 6. 영구 마운트를 위한 fstab 등록
echo "/dev/sdb1 /data ext4 defaults 0 2" | sudo tee -a /etc/fstab

# 7. fstab 테스트
sudo mount -a

파일 시스템 상태 모니터링

# 디스크 사용량 확인
df -h

# inode 사용량 확인 (중요!)
df -i

# 디스크 I/O 모니터링
iostat -x 1

# 특정 디렉토리 크기 확인
du -sh /var/log/*

실무 팁: inode가 부족하면 디스크 용량이 남아있어도 파일을 생성할 수 없습니다!

2. 스왑 메모리: 가상 메모리의 핵심

스왑 메모리란?

스왑 메모리는 물리 RAM이 부족할 때 디스크의 일부를 메모리처럼 사용하는 기술입니다.

전체 가상 메모리 = 물리 RAM + 스왑 공간

스왑의 동작 원리

  • 페이지 아웃(Page Out): 사용 빈도가 낮은 메모리 페이지를 스왑 영역으로 이동
  • 페이지 인(Page In): 스왑 영역의 데이터를 다시 물리 메모리로 가져옴

실전 스왑 관리

현재 스왑 상태 확인

# 스왑 사용량 확인
free -h
swapon -s

# 더 자세한 메모리 정보
cat /proc/meminfo | grep -i swap

스왑 파일 생성하기

# 1. 2GB 스왑 파일 생성
sudo dd if=/dev/zero of=/swapfile bs=1G count=2

# 2. 파일 권한 설정 (보안상 중요!)
sudo chmod 600 /swapfile

# 3. 스왑 영역 초기화
sudo mkswap /swapfile

# 4. 스왑 활성화
sudo swapon /swapfile

# 5. 영구 설정을 위한 fstab 등록
echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab

스왑 파티션 생성하기

# 1. 파티션 생성 (fdisk 사용)
sudo fdisk /dev/sdb
# n -> p -> 2 -> Enter -> Enter -> t -> 2 -> 82 -> w

# 2. 스왑 파티션 초기화
sudo mkswap /dev/sdb2

# 3. 스왑 활성화
sudo swapon /dev/sdb2

# 4. fstab에 등록
echo "/dev/sdb2 none swap sw 0 0" | sudo tee -a /etc/fstab

스왑 성능 최적화

Swappiness 조정

# 현재 swappiness 값 확인 (기본값: 60)
cat /proc/sys/vm/swappiness

# 임시로 swappiness 변경 (값이 낮을수록 스왑 사용을 적게 함)
sudo sysctl vm.swappiness=10

# 영구 설정
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf

실무 가이드라인:

  • 서버용: swappiness 1-10 (메모리 우선 사용)
  • 데스크톱용: swappiness 10-20
  • 기본값: 60

스왑 우선순위 설정

# 우선순위와 함께 스왑 활성화
sudo swapon -p 1 /swapfile        # 높은 우선순위
sudo swapon -p 0 /dev/sdb2        # 낮은 우선순위

# fstab에서 우선순위 설정
/swapfile none swap sw,pri=1 0 0
/dev/sdb2 none swap sw,pri=0 0 0

3. 실무에서 마주치는 문제와 해결책

문제 1: “디스크 용량은 있는데 파일을 만들 수 없어요”

# inode 사용량 확인
df -i

# 해결: inode가 부족한 경우
# 방법 1: 불필요한 파일 삭제
find /var/log -name "*.log" -mtime +30 -delete

# 방법 2: 파일 시스템 재생성 (데이터 백업 후)
sudo mkfs.ext4 -N 200000 /dev/sdb1  # inode 수 증가

문제 2: “시스템이 느려져요”

# 스왑 사용량 확인
free -h

# I/O 대기 시간 확인
iostat -x 1

# 해결책
# 1. 메모리 증설
# 2. 스왑을 SSD로 이동
# 3. swappiness 값 조정

문제 3: “파일 시스템 마운트가 안 돼요”

# 파일 시스템 체크
sudo fsck /dev/sdb1

# 강제 체크 (읽기 전용 모드)
sudo fsck -f -r /dev/sdb1

# 자동 복구 시도
sudo fsck -y /dev/sdb1

4. 자동화 스크립트: 시스템 모니터링

디스크 사용량 모니터링 스크립트

#!/bin/bash
# disk_monitor.sh

THRESHOLD=80

df -h | awk '
NR>1 {
    gsub(/%/, "", $5)
    if ($5 > threshold) {
        print "경고: " $6 " 파티션이 " $5 "% 사용 중입니다!"
        system("logger 디스크 사용량 경고: " $6 " " $5 "%")
    }
}' threshold=$THRESHOLD

# inode 사용량도 체크
df -i | awk '
NR>1 {
    gsub(/%/, "", $5)
    if ($5 > 80) {
        print "경고: " $6 " 파티션의 inode가 " $5 "% 사용 중입니다!"
    }
}'

메모리 사용량 모니터링

#!/bin/bash
# memory_monitor.sh

TOTAL_MEM=$(free | awk '/^Mem:/ {print $2}')
USED_MEM=$(free | awk '/^Mem:/ {print $3}')
SWAP_USED=$(free | awk '/^Swap:/ {print $3}')

MEM_USAGE=$((USED_MEM * 100 / TOTAL_MEM))

if [ $MEM_USAGE -gt 90 ]; then
    echo "메모리 사용량이 ${MEM_USAGE}%입니다!"

    # 메모리 사용량이 높은 프로세스 출력
    echo "Top 5 메모리 사용 프로세스:"
    ps aux --sort=-%mem | head -6
fi

if [ $SWAP_USED -gt 0 ]; then
    echo "스왑이 사용되고 있습니다: $(($SWAP_USED / 1024))MB"
fi

Cron으로 자동 모니터링 설정

# crontab 편집
crontab -e

# 5분마다 디스크 사용량 체크
*/5 * * * * /usr/local/bin/disk_monitor.sh

# 10분마다 메모리 사용량 체크
*/10 * * * * /usr/local/bin/memory_monitor.sh

# 매일 새벽 3시에 로그 정리
0 3 * * * find /var/log -name "*.log" -mtime +7 -delete

마치며: 안정적인 시스템 운영을 위한 체크리스트

일일 점검 사항

  • [ ] 디스크 사용량 확인 (df -h)
  • [ ] inode 사용량 확인 (df -i)
  • [ ] 메모리 사용량 확인 (free -h)
  • [ ] 스왑 사용량 확인 (swapon -s)

주간 점검 사항

  • [ ] 파일 시스템 무결성 검사 (fsck)
  • [ ] 로그 파일 정리
  • [ ] 불필요한 파일 삭제
  • [ ] 시스템 성능 지표 분석

비상 상황 대응

  • [ ] 백업 스크립트 작동 확인
  • [ ] 응급 복구 절차 숙지
  • [ ] 연락망 및 에스컬레이션 프로세스 준비

파일 시스템과 스왑 메모리 관리는 서버 안정성의 기초입니다. 오늘 배운 내용들을 실제 환경에서 차근차근 실습해 보시고, 모니터링 스크립트를 활용해서 proactive한 시스템 관리자가 되시길 바랍니다!

기억하세요: 예방이 최고의 해결책입니다. 🛡️

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다