13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] ZFS 스토리지

  • [Proxmox] ZFS 스토리지 1년 운영 회고: 성능, 안정성, 그리고 후회되는 점

    [Proxmox] ZFS 스토리지 1년 운영 회고: 성능, 안정성, 그리고 후회되는 점

    [Proxmox] ZFS 스토리지 1년 운영 회고: 성능, 안정성, 그리고 후회되는 점

    안녕하세요, 13년차 서버실 주인장입니다. 오늘은 제가 홈랩에서 Proxmox VE (Virtual Environment)와 ZFS를 조합한 스토리지 시스템을 1년간 운영해본 솔직한 경험담을 풀어볼게요. 많은 분들이 홈랩 서버를 구축하거나 작은 규모의 프로덕션 환경에서 가상화를 고민할 때, 스토리지 구성이 가장 큰 고민이 되더라고요. 저 역시 그랬거든요. 특히 데이터의 안정성과 성능이라는 두 마리 토끼를 잡으려다 보면, Proxmox ZFS 스토리지 조합이 매력적인 선택지로 다가오기 마련입니다.

    13년차 인프라 엔지니어로서 직접 경험한 Proxmox ZFS 스토리지의 성능, 안정성, 그리고 솔직히 ‘아, 이건 좀 후회된다’ 싶었던 점들까지 가감 없이 공유해드리겠습니다. 제 삽질 경험이 여러분의 시행착오를 줄이는 데 조금이나마 도움이 되었으면 좋겠어요. 💡


    왜 Proxmox ZFS를 선택했을까?

    제가 Proxmox ZFS 스토리지 조합을 선택한 이유는 명확했어요. 바로 데이터 무결성(Data Integrity)과 유연한 스토리지 관리 기능 때문이었죠. ZFS는 단순한 파일 시스템을 넘어, 자체적으로 볼륨 관리 기능과 RAID 기능을 포함하고 있습니다. 특히 다음과 같은 점들이 저를 매료시켰어요.

    • Copy-on-Write (CoW): 데이터를 덮어쓰지 않고 새로운 블록에 저장하기 때문에, 데이터 손상 위험이 현저히 줄어들더라고요.
    • 스냅샷(Snapshots): 특정 시점의 파일 시스템 상태를 저장할 수 있어서, VM이나 컨테이너 백업 및 롤백이 정말 편리합니다. Proxmox와의 연동은 정말 환상적이었죠.
    • 데이터 스크러빙(Data Scrubbing): 주기적으로 데이터의 무결성을 검사하고 손상된 데이터를 자동으로 복구합니다. 이 덕분에 몇 번 안심했네요.
    • RAID-Z: 소프트웨어 RAID 기능으로, 하드웨어 RAID 컨트롤러 없이도 안정적인 다중 디스크 구성을 할 수 있어요.

    Proxmox는 이런 ZFS의 강력한 기능을 웹 UI에서 손쉽게 관리할 수 있도록 통합해놨어요. 처음엔 CLI(Command Line Interface)로만 ZFS를 다루다가, Proxmox의 간편함에 감탄했었죠.


    저의 Proxmox ZFS 스토리지 구성

    제 홈랩 서버는 인텔 i5-8500 CPU에 32GB RAM을 사용하고 있어요. 스토리지 구성은 다음과 같았습니다.

    1. 데이터 풀 (Data Pool): 4TB HDD 4개로 RAIDZ1 풀 구성
    2. L2ARC (Level 2 Adaptive Replacement Cache): 250GB SATA SSD 1개
    3. SLOG (Separate Log Device): 처음에는 없었으나, 나중에 128GB NVMe SSD 추가

    처음엔 RAIDZ1으로도 충분하다고 생각했어요. 디스크 하나가 죽어도 데이터 손실 없이 버틸 수 있으니까요. L2ARC는 저렴한 SATA SSD로 시작해서 캐싱 효과를 보려고 했고, SLOG는 VM의 쓰기 성능에 큰 영향을 준다고 해서 나중에 추가해봤습니다. 이 구성으로 1년 동안 다양한 VM (Ubuntu, Windows Server), 컨테이너 (Docker, LXC), 그리고 여러 서비스들을 운영했어요.

    제 Proxmox ZFS 홈랩 스토리지 구성 다이어그램입니다. HDD로 데이터 풀을 구성하고, SSD를 L2ARC와 SLOG로 활용했어요.


    1년 운영 후 성능 분석

    실제로 1년간 Proxmox ZFS 스토리지를 사용해보니, 예상보다 훨씬 만족스러운 부분도 있었고, 아쉬운 부분도 명확했습니다.

    ARC (Adaptive Replacement Cache) 효과

    ZFS는 시스템 RAM을 캐시로 정말 활용하는 ARC (Adaptive Replacement Cache) 덕분에 자주 접근하는 데이터는 정말 빠르게 읽을 수 있더라고요. 32GB RAM 중 상당 부분을 ARC가 사용했는데, 웹서버나 DB 서버처럼 특정 데이터를 반복적으로 요청하는 VM에서는 HDD임에도 불구하고 SSD에 버금가는 읽기 성능을 보여주더라고요. ARC hit ratio가 90% 이상을 유지할 때는 정말 쾌적했습니다. 🎉

    L2ARC (Level 2 ARC)의 활용

    RAM이 아무리 많아도 모든 데이터를 캐시할 수 없죠. 그래서 저렴한 SATA SSD를 L2ARC (Level 2 ARC)로 추가해봤는데, 생각보다 효과가 좋더라고요. 주로 사용되는 VM이나 컨테이너의 데이터가 L2ARC에 캐시되면서, 초기 로딩 시간이나 간헐적인 I/O 성능이 눈에 띄게 개선되는 걸 체감했습니다. 물론 NVMe SSD만큼은 아니지만, 비용 대비 성능 향상은 정말 분명했어요.

    SLOG (Separate Log Device)의 중요성

    가장 큰 성능 향상을 가져온 건 바로 SLOG (Separate Log Device)였습니다. 처음에는 SLOG 없이 운영했는데, VM의 동기 쓰기(Synchronous Write) 작업이 많아지자 I/O 대기 시간이 길어지는 문제가 발생하더라고요. 특히 데이터베이스나 로그를 많이 쓰는 서비스에서 체감 성능 저하가 심했습니다. 나중에 NVMe SSD를 SLOG로 추가하고 나니, 쓰기 성능이 정말 비약적으로 향상되었어요. VM I/O가 많은 경우에는 SLOG용 NVMe SSD는 거의 필수라고 생각합니다. 신세계를 경험했네요! ✨

    결론적으로, 일반적인 웹서버, 개발 환경 VM, 파일 서버 등을 돌리는 데는 Proxmox ZFS 스토리지가 충분한 성능을 제공했어요. 물론 고성능 NVMe RAID 풀에 비할 바는 아니지만, 홈랩 환경에서는 정말 차고 넘치는 수준이었죠.

    Proxmox 웹 UI ZFS 스토리지 대시보드 및 성능 모니터링 화면

    Proxmox 웹 UI에서 ZFS 스토리지의 상태와 성능을 모니터링하는 화면입니다. ARC Hit Ratio와 I/O 대역폭을 확인할 수 있어요.


    예상치 못한 안정성 경험 (그리고 삽질)

    ZFS의 가장 큰 장점 중 하나는 바로 데이터 무결성(Data Integrity)이잖아요? 실제로 1년간 운영하면서 이 부분에서 몇 번 감탄했어요.

    주기적인 Pool Scrub의 위력

    저는 한 달에 한 번씩 zpool scrub 명령어를 통해 풀 스크럽(Pool Scrub)을 돌렸습니다. 이게 정말 중요하더라고요. 한번은 스크럽 중 미세한 데이터 불일치를 감지하고 자동으로 복구하는 걸 로그를 통해 확인했어요. 만약 ZFS가 아니었다면 알지도 못하고 지나갈 뻔한 문제였죠. ⚠️

    디스크 장애와 RAIDZ1의 복구 경험

    불행인지 다행인지, 1년 사이에 4개 중 하나의 HDD가 고장 났어요. S.M.A.R.T. 경고가 뜨고, zpool status 명령어로 확인해보니 DEGRADED 상태가 되었더군요. 하지만 RAIDZ1으로 구성했기에 디스크 하나가 죽어도 데이터는 안전하게 보호되었습니다. 데이터를 잃을 걱정 없이 새 디스크를 주문할 수 있었죠.

    새 디스크가 도착하고 교체하는 과정에서 제가 삽질 좀 했습니다. 🤦‍♂️ 핫스왑(Hot-swap)이 되는 케이스가 아니라서 서버를 끄고 디스크를 교체했는데, 그 과정에서 명령어 사용이 미숙해서 잠시 헤맸어요. 정확한 zpool replace 명령어를 아는 게 정말 중요하더라고요.

    # 1. zpool status 명령어로 죽은 디스크의 경로 확인
    # 예: /dev/sdb
    root@proxmox:~# zpool status storage_pool
    
    # 2. 새 디스크를 서버에 장착 (예: /dev/sdc)
    
    # 3. 죽은 디스크를 새 디스크로 교체 시작
    root@proxmox:~# zpool replace storage_pool /dev/sdb /dev/sdc
    
    # 4. 교체 진행 상황 확인
    root@proxmox:~# zpool status storage_pool
    # reslivering이 완료되면 'ONLINE' 상태로 돌아옵니다.
    

    교체 후 리실버링(Resilvering)이 완료되고 풀이 다시 ONLINE 상태가 되었을 때의 안도감이란… 드디어 됐다! ✅ ZFS는 똑똑하지만, 관리자의 정확한 명령이 필수라는 걸 다시 한번 느꼈어요.


    후회되는 점과 개선 방향

    솔직히 1년간 Proxmox ZFS 스토리지를 운영하면서 후회되는 점도 몇 가지 있습니다.

    1. 초기 RAIDZ1 선택의 아쉬움: 처음에 RAIDZ1으로 구성한 게 살짝 아쉬워요. 디스크 하나만 더 추가해서 4TB HDD 5개로 RAIDZ2로 갔다면, 디스크 두 개가 동시에 고장 나도 버틸 수 있어 안정성이 훨씬 높았을 텐데 말이죠. 홈랩이긴 하지만, 중요한 데이터가 많아질수록 RAIDZ2의 안정성이 더 매력적으로 느껴집니다.
    2. SLOG/L2ARC 초기 계획 미흡: SLOG와 L2ARC를 처음부터 제대로 고려하지 못한 것도 후회돼요. 저렴한 SATA SSD로 시작했지만, 나중엔 고성능 NVMe SSD의 필요성을 절실히 느꼈거든요. 초기 투자 비용을 아끼려다 나중에 더 큰 비용과 시간을 들여 업그레이드했습니다.
    3. 디스크 종류 혼용: 데이터 풀은 HDD, L2ARC는 SATA SSD, SLOG는 NVMe SSD… 성능 때문에 다양한 디스크를 섞어 썼는데, 관리 복잡도가 올라가고 벤더별 드라이버 관리나 S.M.A.R.T. 모니터링이 조금 번거로워졌어요.

    다음 번에 Proxmox ZFS 스토리지를 구성한다면, 저는 다음과 같은 방향으로 개선할 생각이에요.

    • 안정성을 최우선으로 하여 RAIDZ2 또는 미러(Mirror) 구성 고려.
    • 처음부터 고성능 NVMe SSD를 SLOG 및 L2ARC로 할당하여 최대 성능 확보.
    • 가급적 동일한 벤더의 디스크를 사용하여 관리 편의성 증대.
    Proxmox ZFS 운영 문제점과 해결책 비교표

    Proxmox ZFS 운영 시 발생할 수 있는 주요 문제점과 제가 경험했던 해결책을 비교 정리한 표입니다.


    Proxmox ZFS 스토리지 운영 팁

    1년간 운영하면서 얻은 몇 가지 꿀팁을 공유해드릴게요.

    1. RAM은 많을수록 좋습니다.
      ZFS는 정말 RAM을 좋아합니다. ARC (Adaptive Replacement Cache) 효율을 높이려면 시스템 RAM을 최대한 많이 확보하세요. 최소 16GB, 가능하다면 32GB 이상을 추천합니다.
    2. SLOG는 선택 아닌 필수?
      VM I/O가 많거나 동기 쓰기(Synchronous Write)가 중요한 서비스(예: 데이터베이스)를 운영한다면 SLOG용 NVMe SSD는 꼭 고려하세요. 체감 성능이 확 달라집니다. 특히 저가형 NVMe라도 없어서는 안 될 부분이에요.
    3. 주기적인 스크럽은 생명입니다.
      데이터 무결성을 지키려면 zpool scrub 명령어를 통해 주기적으로 풀 스크럽을 해주세요. 저는 cron으로 매월 첫째 주 일요일 새벽 3시에 돌리도록 설정했어요. 자고 일어났을 때 스크럽 완료 메시지를 보면 왠지 모르게 뿌듯하더라고요. 😊
    4. # cron 설정 예시 (매월 첫째 주 일요일 새벽 3시)
      0 3 1-7 * 0 /usr/sbin/zpool scrub storage_pool
      
    5. 백업은 언제나 중요합니다.
      아무리 ZFS가 튼튼해도 백업은 필수예요. Proxmox의 내장 백업 기능을 활용하거나, zfs send/receive를 이용해 다른 곳으로 스냅샷을 보내는 방식으로 이중 백업 체계를 갖추세요. 데이터는 언제나 소중하니까요.
    ZFS 풀 스크럽 진행 과정을 보여주는 콘솔 화면

    ZFS 풀 스크럽(scrub)이 진행되는 콘솔 화면이에요. 주기적인 스크럽은 데이터 무결성을 유지하는 데 필수적입니다.


    마무리하며

    1년간 Proxmox ZFS 스토리지를 운영해보면서 성능과 안정성 모두 만족스러웠습니다. 특히 데이터 무결성에 대한 ZFS의 강력한 보장은 인프라 엔지니어로서 큰 신뢰를 줬어요. 하지만 완벽한 시스템은 없다는 것, 그리고 초기 설계의 중요성을 다시 한번 깨달았습니다. 제 삽질 경험과 팁들이 Proxmox ZFS 스토리지 구성을 고민하고 계신 여러분께 조금이나마 도움이 되었으면 좋겠어요.

    다음 글에서는 Proxmox ZFS 스냅샷과 복제(Replication) 기능을 활용한 백업 전략에 대해 더 자세히 다뤄볼 예정입니다. 기대해주세요! 👋

  • [Proxmox] Proxmox VE ZFS 스토리지 최적화: 성능과 안정성 동시 확보 가이드

    [Proxmox] Proxmox VE ZFS 스토리지 최적화: 성능과 안정성 동시 확보 가이드

    ZFS를 Proxmox에 올리면 생기는 일

    홈랩을 운영하다 보면 어느 순간 이런 생각이 드시죠. “스토리지 관리 좀 제대로 해보고 싶다.” 저도 그랬거든요. 처음엔 그냥 ext4 파티션에 LVM(논리 볼륨 관리자) 얹어서 쓰다가, 어느 날 디스크 하나가 조용히 세상을 떠나면서 VM 이미지를 통째로 날린 경험이 있습니다. 그날 이후로 ZFS(Zettabyte File System)를 진지하게 공부하기 시작했어요.

    Proxmox VE ZFS 조합은 사실 홈랩 커뮤니티에서 꽤 오래된 조합입니다. Proxmox VE가 ZFS를 기본 지원하기 시작한 이후로, 별도의 커널 모듈 컴파일 없이도 ZFS를 바로 쓸 수 있게 됐거든요. 근데 막상 써보면 “설치는 쉬운데, 최적화는 어디서부터 시작해야 하지?” 하는 막막함이 있더라고요. 오늘은 그 막막함을 같이 해소해 보겠습니다.

    Proxmox VE ZFS 스토리지 아키텍처 전체 계층 구조 다이어그램

    ▲ Proxmox VE + ZFS 스토리지 구성 전체 아키텍처 — VM/CT 레이어부터 ZFS 풀(Pool), 물리 디스크까지의 계층 구조를 보여줍니다.

    ZFS가 뭔지 먼저 짚고 가겠습니다

    쉽게 말해서 ZFS는 “똑똑한 파일 시스템”입니다

    일반 파일 시스템과 ZFS의 가장 큰 차이점은, ZFS가 파일 시스템과 볼륨 관리자를 동시에 담당한다는 점이에요. 기존에는 파티션 → LVM → 파일 시스템 이렇게 레이어가 쌓였다면, ZFS는 이걸 하나로 통합해서 관리합니다.

    핵심 기능만 짚어볼게요:

    • Copy-on-Write(CoW, 쓰기 시 복사): 데이터를 덮어쓰지 않고 항상 새 블록에 씁니다. 시스템이 갑자기 꺼져도 데이터가 깨지지 않아요.
    • Checksum(체크섬, 데이터 무결성 검증): 모든 블록에 체크섬이 붙어 있어서, 읽을 때마다 데이터가 정상인지 자동으로 확인합니다. Silent Data Corruption(무음 데이터 손상)을 잡아내는 거죠.
    • Snapshot(스냅샷): 순간적으로 파일 시스템 상태를 저장합니다. Proxmox에서 VM 백업할 때 이게 핵심이에요.
    • RAID-Z(레이드-Z): 소프트웨어 RAID를 ZFS 레벨에서 처리합니다. 하드웨어 RAID 컨트롤러 없이도 충분한 안정성을 확보할 수 있어요.
    • ARC(Adaptive Replacement Cache, 적응형 교체 캐시): RAM을 읽기 캐시로 활용합니다. 메모리가 많을수록 성능이 올라가요.

    Proxmox VE에서 ZFS 스토리지를 쓰면 좋은 이유

    솔직히 말하면, Proxmox + ZFS 조합의 가장 큰 장점은 스냅샷 기반 백업이 기가 막히게 편하다는 겁니다. VM을 백업할 때 ZFS 스냅샷을 찍으면 거의 순간적으로 완료되거든요. 100GB짜리 VM이라도 스냅샷 자체는 1초도 안 걸립니다. 실제 데이터 복사가 아니라 메타데이터만 기록하는 방식이라서요.

    항목 기존 LVM + ext4 ZFS
    데이터 무결성 파일 시스템 레벨만 블록 레벨 체크섬
    스냅샷 속도 데이터 크기에 비례 거의 즉각적
    RAID 관리 별도 mdadm 필요 ZFS 내장
    압축 지원 안 함 투명 압축 지원
    RAM 요구량 낮음 높음 (ARC 때문에)
    설정 복잡도 낮음 중간~높음

    Proxmox VE ZFS 풀(Pool) 구성하기

    1단계: ZFS 풀 생성 전 디스크 확인

    먼저 사용할 디스크들을 확인합니다. 중요한 건 ZFS는 반드시 디스크 전체를 넘겨줘야 한다는 거예요. 파티션 위에 ZFS를 올리는 것도 기술적으로는 가능하지만, 권장하지 않습니다. 저도 처음에 파티션 위에 올렸다가 나중에 풀 교체하는 데 고생했거든요.

    # 현재 연결된 디스크 목록 확인
    lsblk -d -o NAME,SIZE,MODEL,SERIAL
    
    # 디스크 상태 확인 (스마트 정보)
    smartctl -a /dev/sdb
    
    # ZFS에서 사용할 디스크 ID 확인 (권장: ID 방식으로 지정)
    ls -la /dev/disk/by-id/ | grep -v part

    💡 팁: ZFS 풀 생성 시 /dev/sdb 같은 경로 대신 /dev/disk/by-id/ 아래의 ID를 사용하세요. 재부팅 후 디스크 순서가 바뀌어도 안전합니다.

    2단계: ZFS 풀 생성

    Proxmox에서 ZFS 풀을 만드는 방법은 두 가지입니다. GUI로 하거나 CLI로 하거나. 저는 CLI를 선호해요. 정확히 뭘 하는지 눈에 보이니까요.

    # 미러(Mirror, RAID-1과 유사) 풀 생성 예시 — 디스크 2개
    zpool create -o ashift=12 \
      -O compression=lz4 \
      -O atime=off \
      -O xattr=sa \
      -O dnodesize=auto \
      rpool mirror \
      /dev/disk/by-id/ata-디스크1_시리얼 \
      /dev/disk/by-id/ata-디스크2_시리얼
    
    # RAID-Z1 풀 생성 예시 — 디스크 3개 이상
    zpool create -o ashift=12 \
      -O compression=lz4 \
      -O atime=off \
      -O xattr=sa \
      -O dnodesize=auto \
      datapool raidz1 \
      /dev/disk/by-id/ata-디스크1_시리얼 \
      /dev/disk/by-id/ata-디스크2_시리얼 \
      /dev/disk/by-id/ata-디스크3_시리얼

    여기서 각 옵션이 뭔지 짚어볼게요:

    • ashift=12: 4KB 섹터 디스크에 맞는 설정. 요즘 HDD/SSD 대부분이 4KB 섹터 또는 그 이상이라서 거의 필수입니다. 풀 생성 후 변경 불가니까 처음에 꼭 확인하세요.
    • compression=lz4: LZ4 압축 활성화. CPU 부하가 거의 없으면서 10~30% 정도 공간을 아낄 수 있어요.
    • atime=off: 파일 접근 시간 기록 비활성화. I/O 성능 향상에 도움이 됩니다.
    • xattr=sa: 확장 속성을 inode에 저장. 성능 향상에 기여해요.
    • dnodesize=auto: dnode 크기 자동 조정. 대용량 파일 시스템에 유리합니다.

    3단계: Proxmox에 ZFS 스토리지 등록

    풀을 만들었으면 Proxmox가 이걸 스토리지로 인식하게 해줘야 합니다.

    # /etc/pve/storage.cfg 에 추가하거나
    # Proxmox GUI: Datacenter > Storage > Add > ZFS 선택
    
    # CLI로 추가하는 방법
    pvesm add zfspool datapool-storage \
      --pool datapool \
      --content images,rootdir \
      --sparse 1

    GUI에서 하시면 Datacenter → Storage → Add → ZFS 선택하고 풀 이름 입력하면 됩니다. 훨씬 직관적이에요.

    Proxmox VE 웹 GUI ZFS 스토리지 추가 설정 화면

    ▲ Proxmox VE 관리 콘솔에서 ZFS 풀을 스토리지로 등록하는 화면 — 풀 이름, Content 타입, Sparse 옵션 등을 설정합니다.

    ZFS 성능 최적화 핵심 설정

    ARC 메모리 설정 — 제일 중요합니다

    ZFS의 ARC(Adaptive Replacement Cache)는 기본적으로 사용 가능한 RAM의 절반 정도까지 사용하려고 합니다. 홈랩이나 소규모 서버에서는 이게 VM들이 쓸 메모리를 잡아먹는 문제가 생겨요. 저도 처음에 이 설정 안 하고 쓰다가 “왜 VM이 이렇게 느리지?” 하면서 한참 삽질했습니다.

    # 현재 ARC 사용량 확인
    cat /proc/spl/kstat/zfs/arcstats | grep -E '^(size|c_max|c_min|hits|misses)'
    
    # ARC 최대 크기 제한 설정 (예: 8GB로 제한)
    # /etc/modprobe.d/zfs.conf 파일 생성/편집
    cat > /etc/modprobe.d/zfs.conf << 'EOF'
    options zfs zfs_arc_max=8589934592
    EOF
    
    # 즉시 적용 (재부팅 없이)
    echo 8589934592 > /sys/module/zfs/parameters/zfs_arc_max
    
    # 변경 확인
    cat /sys/module/zfs/parameters/zfs_arc_max

    ⚠️ 주의: ARC를 너무 작게 설정하면 ZFS 성능이 크게 떨어집니다. 일반적으로 전체 RAM의 20~25% 정도는 ARC에 남겨두는 걸 권장해요. 16GB RAM이면 최소 4GB는 ARC에 할당하는 게 좋습니다.

    L2ARC와 ZIL/SLOG 설정 — SSD 있으면 써먹어야죠

    SSD가 여분으로 있다면 L2ARC(Level 2 ARC, 2차 읽기 캐시)와 SLOG(Separate Intent Log, 분리 의도 로그)로 활용할 수 있습니다.

    # L2ARC 추가 (읽기 캐시, SSD 권장)
    zpool add datapool cache /dev/disk/by-id/ssd-캐시디스크_시리얼
    
    # SLOG/ZIL 추가 (쓰기 캐시, 저지연 SSD 권장)
    # 미러 구성을 강력히 권장 (SLOG 손실 시 데이터 손실 위험)
    zpool add datapool log mirror \
      /dev/disk/by-id/ssd-slog1_시리얼 \
      /dev/disk/by-id/ssd-slog2_시리얼
    
    # 현재 풀 구성 확인
    zpool status datapool

    💡 팁: SLOG는 반드시 미러로 구성하세요. SLOG 디스크가 고장나면 최근 쓰기 데이터가 날아갈 수 있거든요. 비용이 두 배가 되더라도 미러가 맞습니다.

    ZFS 데이터셋 최적화 설정

    Proxmox에서 VM 이미지를 저장하는 데이터셋은 별도로 최적화해 주는 게 좋아요. VM 워크로드 특성에 맞게요.

    # VM 이미지용 데이터셋 최적화
    # recordsize를 VM 디스크 블록 크기에 맞게 조정
    zfs set recordsize=64K datapool/images
    
    # 또는 데이터베이스 VM이 많다면
    zfs set recordsize=16K datapool/images
    
    # 압축 설정 (lz4가 성능/압축률 균형이 좋음)
    zfs set compression=lz4 datapool
    
    # 현재 데이터셋 속성 확인
    zfs get all datapool | grep -E '(compression|recordsize|atime|sync)'
    
    # sync 설정 (주의: disabled는 데이터 손실 위험 있음)
    # VM이 많고 성능이 중요하다면 standard 유지 권장
    zfs set sync=standard datapool/images

    Scrub(스크럽, 데이터 무결성 검사) 자동화

    ZFS의 핵심 기능 중 하나가 스크럽이에요. 모든 데이터 블록을 읽어서 체크섬을 검증하는 작업인데, 주기적으로 해줘야 Silent Data Corruption을 조기에 발견할 수 있습니다.

    # 수동으로 스크럽 실행
    zpool scrub datapool
    
    # 스크럽 진행 상황 확인
    zpool status datapool
    
    # 자동 스크럽 설정 (Proxmox는 기본적으로 월 1회 cron 설정됨)
    # /etc/cron.d/zfsutils-linux 확인
    cat /etc/cron.d/zfsutils-linux
    
    # 직접 cron 설정 (매월 1일 새벽 2시)
    crontab -e
    # 아래 내용 추가:
    # 0 2 1 * * /sbin/zpool scrub datapool

    ⚠️ 실제로 겪은 문제들과 해결법

    문제 1: VM 성능이 생각보다 안 나온다

    ZFS를 처음 올렸을 때 “왜 이렇게 느리지?” 하는 경험을 많이들 하세요. 저도 그랬는데, 원인이 몇 가지 있더라고요.

    원인 및 해결책:

    1. ashift 설정 오류: zpool status -v로 확인. 이미 풀이 생성됐다면 재생성 외에는 방법이 없어요. 처음부터 ashift=12를 꼭 넣어주세요.
    2. ARC 부족: arcstat 명령으로 hit ratio 확인. 70% 이하면 ARC가 부족한 겁니다.
    3. recordsize 불일치: VM 워크로드에 따라 recordsize를 조정하세요. 랜덤 I/O가 많은 DB 워크로드는 작은 recordsize가 유리합니다.
    # ARC 히트율 확인
    arcstat 1 5
    
    # ZFS I/O 통계 모니터링
    zpool iostat -v datapool 2
    
    # 상세 ZFS 통계
    zfs-stats -a

    문제 2: 디스크 오류 발견 시 대응

    어느 날 아침에 zpool status를 실행했더니 DEGRADED 상태가 뜨는 경험을 한 적이 있습니다. 심장이 쿵 내려앉더라고요. 근데 ZFS가 있으니까 침착하게 대응할 수 있었어요.

    # 풀 상태 확인
    zpool status -v datapool
    
    # 오류 난 디스크 교체 후 resilvering(데이터 재동기화) 시작
    # 1. 오류 디스크 오프라인 처리
    zpool offline datapool /dev/disk/by-id/문제디스크_시리얼
    
    # 2. 물리적으로 디스크 교체 후 새 디스크 지정
    zpool replace datapool \
      /dev/disk/by-id/문제디스크_시리얼 \
      /dev/disk/by-id/새디스크_시리얼
    
    # 3. resilvering 진행 상황 확인
    zpool status datapool

    문제 3: 스냅샷이 쌓여서 공간이 부족해진다

    Proxmox 자동 백업 설정해 놓으면 스냅샷이 계속 쌓입니다. 어느 순간 “왜 공간이 이렇게 없지?” 하고 보면 스냅샷이 수십 개 쌓여 있는 경우가 있어요.

    # 스냅샷 목록 확인
    zfs list -t snapshot -o name,used,creation | sort -k3
    
    # 오래된 스냅샷 삭제
    zfs destroy datapool/images/vm-100-disk-0@2024-01-01
    
    # 특정 패턴의 스냅샷 일괄 삭제 (주의해서 사용!)
    zfs list -t snapshot -H -o name | grep 'vm-100' | xargs -n1 zfs destroy
    
    # Proxmox 백업 보존 정책 설정 (GUI 권장)
    # Datacenter > Backup > 해당 작업 편집 > Keep 설정
    ZFS ARC 히트율 및 스토리지 I/O 성능 모니터링 대시보드

    ▲ ZFS ARC 히트율과 풀 I/O 성능 모니터링 — arcstat 및 zpool iostat 출력 결과를 시각화한 예시입니다. 히트율 80% 이상을 목표로 합니다.

    ZFS 스토리지 상태 검증하기

    일상적인 헬스체크 루틴

    이 명령어들은 저도 주기적으로 확인하는 것들이에요. 습관처럼 만들어 두면 정말 든든합니다.

    # 전체 풀 상태 한눈에 보기
    zpool status
    
    # 풀 사용량 확인
    zpool list
    
    # 데이터셋별 사용량 (스냅샷 포함)
    zfs list -t all -o name,used,avail,refer,mountpoint
    
    # 압축 효율 확인
    zfs get compressratio datapool
    
    # 전체 ZFS 이벤트 로그 확인
    zpool events -v | tail -50

    성능 벤치마크 기준점 잡기

    최적화 전후를 비교하려면 기준점이 있어야 하죠. fio(Flexible I/O Tester)로 간단히 측정해 볼 수 있습니다.

    # fio 설치
    apt install fio
    
    # 순차 쓰기 테스트
    fio --name=seqwrite \
      --filename=/datapool/testfile \
      --rw=write \
      --bs=1M \
      --size=4G \
      --numjobs=1 \
      --ioengine=libaio \
      --direct=1 \
      --group_reporting
    
    # 랜덤 읽기 테스트 (4K 블록)
    fio --name=randread \
      --filename=/datapool/testfile \
      --rw=randread \
      --bs=4K \
      --size=4G \
      --numjobs=4 \
      --ioengine=libaio \
      --direct=1 \
      --group_reporting
    
    # 테스트 파일 정리
    rm /datapool/testfile

    정리: ZFS 최적화 체크리스트

    Proxmox VE ZFS 최적화 핵심 설정 체크리스트 요약 인포그래픽

    ▲ Proxmox VE ZFS 최적화 핵심 설정 요약 — 풀 생성부터 ARC 튜닝, 스크럽 자동화까지 단계별 체크리스트입니다.

    지금까지 다룬 내용을 정리해 보겠습니다. 처음엔 복잡해 보여도, 하나씩 따라가면 충분히 할 수 있어요.

    필수 설정 체크리스트

    • ✅ ashift=12 — 풀 생성 시 반드시 지정
    • ✅ compression=lz4 — 성능 영향 없이 공간 절약
    • ✅ atime=off — 불필요한 I/O 제거
    • ✅ ARC 크기 제한 — VM 메모리와 균형 맞추기
    • ✅ 정기 스크럽 — 월 1회 이상 실행
    • ✅ 디스크 ID 방식 사용 — 재부팅 후 안정성 확보
    • ✅ 스냅샷 보존 정책 — 디스크 공간 관리
    • ✅ SLOG 미러 구성 — SLOG 사용 시 필수

    자주 묻는 질문 (FAQ)

    Q. ZFS는 ECC 메모리가 없으면 위험한가요?
    A. ECC 메모리가 없어도 ZFS를 쓸 수 있습니다. 다만 메모리 오류로 인한 데이터 손상 가능성이 이론적으로 존재해요. 홈랩 수준에서는 크게 걱정 안 해도 되지만, 프로덕션 환경이라면 ECC를 권장합니다.

    Q. ZFS 풀 크기를 나중에 늘릴 수 있나요?
    A. 네, 가능합니다. 미러 풀은 동일한 크기의 디스크 쌍을 추가해서 확장할 수 있어요. RAID-Z는 같은 VDEV(가상 디바이스) 내에서 디스크 추가가 어렵고, 새 VDEV를 추가하는 방식으로 확장합니다.

    Q. 압축을 켜면 CPU 사용률이 많이 올라가나요?
    A. lz4 압축은 CPU 영향이 매우 적습니다. 요즘 프로세서에서는 거의 체감이 안 될 정도예요. 오히려 I/O 양이 줄어서 전체 성능이 올라가는 경우도 있어요.

    마무리하며

    Proxmox VE ZFS 조합은 한번 제대로 세팅해 두면 정말 든든합니다. 디스크 하나가 죽어도 침착하게 교체하고 resilvering 기다리면 되고, 실수로 VM 날려도 스냅샷에서 복구하면 되고. 처음 세팅이 좀 복잡해 보이지만, 그 이후의 편안함은 진짜 다르더라고요.

    물론 ZFS가 만능은 아닙니다. 메모리를 많이 먹고, 설정이 복잡하고, 한번 만든 풀 구조를 바꾸기 어렵다는 단점도 있어요. 그래도 데이터 안정성과 스냅샷 편의성을 생각하면, 홈랩에서 ZFS를 선택하지 않을 이유가 없다고 생각합니다.

    다음 글에서는 Proxmox VE의 백업 자동화와 원격 ZFS 복제(Replication)를 다뤄볼 예정이에요. 오늘 설정한 ZFS 풀을 활용해서 다른 서버로 데이터를 자동으로 복제하는 방법인데, 이것도 꽤 유용하더라고요. 기대해 주세요!

    궁금한 점이나 다른 삽질 경험이 있으시면 댓글로 공유해 주세요. 같이 해결해 봐요!