13년차의 서버실

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

[태그:] ZFS 성능

  • [Proxmox] Proxmox ZFS, 왜 선택해야 할까? 성능·안정성·운영 분석

    [Proxmox] Proxmox ZFS, 왜 선택해야 할까? 성능·안정성·운영 분석

    Proxmox ZFS, 왜 선택해야 할까? 성능, 안정성, 운영 관점 분석

    Proxmox ZFS를 처음 검토할 때는 보통 CPU나 메모리보다 스토리지에서 먼저 막히더라고요. VM은 뜨는데 백업이 길어지고, 디스크 한 장이 수상해 보여도 어디부터 봐야 할지 감이 안 잡히는 식입니다. 저도 처음엔 “여기까지 꼭 ZFS로 가야 하나?” 싶었는데, 오래 써보니 핵심은 최고 속도보다 문제가 생겼을 때 상태를 읽기 쉬운 구조를 만든다는 점이었습니다.

    그래서 이 글은 “ZFS가 좋다더라” 수준에서 끝내지 않겠습니다. ZFS 성능이 어떤 워크로드에서 살아나는지, ZFS 안정성이 왜 높게 평가되는지, 그리고 Proxmox 스토리지를 설계할 때 초기에 뭘 잘못 고르면 나중에 오래 고생하는지까지 실무 기준으로 정리해보겠습니다. 결론부터 말하면 이 조합은 만능은 아니지만, 설계를 제대로 하면 꽤 오래 편합니다.

    Proxmox ZFS 기반 홈랩 스토리지 아키텍처 개요

    Proxmox 호스트, ZFS 풀(pool), VM 디스크, 백업 스토리지가 한눈에 보이는 구조도입니다.

    왜 Proxmox ZFS를 많이 선택할까요

    제가 Proxmox에서 ZFS를 높게 보는 이유는 기능 수보다 운영 일관성 때문입니다. VM 디스크가 어느 풀에 있고, 스냅샷이 어디 계층에서 관리되고, 장애가 났을 때 어떤 명령으로 상태를 확인해야 하는지가 한 체계 안에 들어옵니다. RAID 컨트롤러, 파일시스템, 논리 볼륨을 따로따로 추적할 때보다 훨씬 덜 산만하죠.

    특히 Proxmox 같은 가상화 환경에서는 아래 세 가지가 크게 작용합니다.

    • 스냅샷과 복제 흐름이 자연스럽습니다. 작업 전 스냅샷, 테스트 후 롤백, 다른 노드로 복제까지 같은 철학으로 움직입니다.
    • 풀 상태를 읽기 쉽습니다. 디스크가 느린지, 깨졌는지, 일부만 이상한지 판단 포인트가 zpool status와 zpool iostat에 비교적 잘 드러납니다.
    • 설계 실수가 초기에 드러납니다. 이건 불편해 보여도 사실 장점입니다. ZFS는 “대충 붙여도 되겠지”를 잘 용서하지 않거든요.

    반대로 ZFS가 덜 맞는 환경도 분명합니다. 메모리 여유가 거의 없고, 디스크를 즉흥적으로 하나씩 늘려야 하고, 운영 점검을 거의 하지 않는 환경이라면 단순한 LVM 계열이 더 편할 때도 있습니다. 그래서 저는 Proxmox ZFS를 성능 기능이 아니라 운영 모델의 선택으로 보는 편입니다.

    Proxmox ZFS를 이해할 때 먼저 봐야 할 구조

    용어 정의보다 중요한 건 어느 계층이 성능과 장애 허용을 좌우하느냐입니다.

    1. pool(풀)은 관리 단위입니다

    여러 디스크 묶음 전체를 가리키는 가장 큰 저장소입니다. Proxmox에서는 여기 위에 VM 디스크, 컨테이너 루트 디스크, 스냅샷이 올라갑니다. 운영자가 보는 용량, 상태, scrub 대상도 이 계층입니다.

    2. vdev는 성격을 결정합니다

    실제로 성능과 복구 가능성은 pool보다 vdev 구조가 더 크게 좌우됩니다. mirror인지 RAIDZ1인지 RAIDZ2인지에 따라 랜덤 I/O 성격이 달라지고, 디스크 고장 시 복구 여유도 달라집니다. 같은 풀 이름이라도 내부 vdev 구성이 다르면 체감이 완전히 달라집니다.

    3. dataset과 zvol은 용도가 다릅니다

    파일 단위 관리에는 dataset이, 블록 디바이스처럼 쓰는 VM 디스크에는 zvol이 더 직접적입니다. Proxmox의 로컬 ZFS 스토리지는 VM 이미지와 컨테이너 데이터를 ZFS 계층에서 관리하며, VM 디스크는 보통 블록 볼륨 성격으로 다뤄집니다. 여기서 중요한 건 VM은 작은 랜덤 I/O가 많다는 점입니다. 그래서 파일 아카이브에 유리한 구성과 VM에 유리한 구성이 갈립니다.

    4. scrub는 “점검”이지 “백업”이 아닙니다

    scrub는 풀 데이터를 읽으면서 체크섬을 검증하고, 중복 데이터가 있는 구성에서는 손상 블록 복구에 도움을 줍니다. 이 기능이 강한 이유는 “데이터가 있다”와 “데이터가 멀쩡하다”를 구분해주기 때문입니다. 운영해보면 이 차이가 생각보다 큽니다.

    제가 실무에서 특히 중요하게 보는 포인트는 이겁니다. ZFS는 데이터를 저장하는 시스템이면서, 동시에 상태를 해석할 단서를 남기는 시스템입니다. 장애를 없애준다기보다, 장애를 더 빨리 좁혀가게 해주는 쪽에 가깝습니다.

    성능 관점에서 보면, Proxmox ZFS는 “빠르다”보다 “구조를 탄다”가 맞습니다

    ZFS 성능을 한 줄로 단정하면 거의 항상 틀립니다. 같은 SSD라도 mirror인지 RAIDZ인지, sync 쓰기가 많은지, 압축이 잘 먹는지에 따라 결과가 크게 달라집니다. 제가 체감한 기준은 단순했습니다. VM이 많이 붙는 Proxmox 스토리지는 랜덤 I/O 관점에서 봐야 한다는 점입니다.

    구성 어울리는 워크로드 강점 약점 제가 권하는 용도
    Single Disk 테스트, 임시 랩 구성 간단, 실험 빠름 장애 허용 없음, 운영 검증용으론 취약 학습용, 일회성 검증
    Mirror VM, DB, 잦은 랜덤 I/O 랜덤 읽기 IOPS에 유리, 복구 판단 쉬움, 교체 절차 단순 가용 용량 효율이 낮음 Proxmox VM 스토리지의 기본 후보
    RAIDZ1 백업 저장, 파일 공유 용량 효율이 좋음 작은 랜덤 쓰기 많은 VM엔 답답할 수 있음 VM보다 백업/아카이브 쪽
    RAIDZ2 대용량 장기보관, 안정성 우선 디스크 장애 허용 폭이 넓음 쓰기 특성이 무겁고 설계 판단을 더 보수적으로 해야 함 중요 백업 풀, 대용량 저장소

    VM 스토리지에 mirror를 자주 권하는 이유는 단순히 “더 빠르다”여서가 아닙니다. 랜덤 I/O, 장애 추적, 디스크 교체 절차, 성능 편차 예측 가능성까지 합치면 운영 총비용이 낮기 때문입니다. RAIDZ는 용량 효율은 좋지만, VM 여러 대가 동시에 작은 블록을 읽고 쓰는 환경에서는 생각보다 거칠게 느껴질 수 있습니다.

    그리고 실제로 많이 놓치는 설정이 몇 가지 있습니다.

    • ashift: 물리 섹터 특성과 맞지 않으면 쓰기 증폭과 성능 손해를 볼 수 있습니다.
    • compression=lz4: CPU 부담이 비교적 낮고 I/O를 줄여, 로그나 텍스트 비중이 있는 VM에서 체감이 좋아질 때가 많습니다.
    • atime=off: 읽을 때마다 메타데이터 쓰기를 줄여 불필요한 I/O를 덜 만듭니다.
    • autotrim=on: SSD 기반 풀이면 장기 운용 시 상태 유지에 도움이 됩니다.
    • sync 특성: 데이터베이스, NFS, 일부 애플리케이션은 동기식 쓰기 비중이 높아 체감 성능이 갑자기 달라질 수 있습니다.

    제 경험상 ZFS가 느리다고 말하는 사례 중 적지 않은 비중이, 사실은 RAIDZ를 VM 스토리지로 써서 랜덤 I/O가 막힌 경우이거나, 동기식 쓰기 워크로드를 일반 파일서버 감각으로 올린 경우였습니다. ZFS 자체보다 구조 선택이 원인인 경우가 많다는 얘기죠.

    안정성은 왜 평가가 높을까요

    ZFS 안정성이 높게 평가되는 이유는 “절대 안 깨진다”가 아니라, 깨졌을 때 조용히 넘어가지 않게 설계돼 있다는 데 있습니다. 체크섬 기반 검증, 중복 데이터에서의 복구 가능성, 풀 상태와 오류 카운트 노출이 합쳐지면서 운영자가 놓치기 쉬운 문제를 빨리 수면 위로 끌어올립니다.

    저는 이 점을 꽤 높게 봅니다. SSD 한 장이 완전히 죽는 고전적인 장애보다, 간헐적 읽기 오류, 케이블 접촉 불량, 특정 시간대만 치솟는 I/O 지연 같은 애매한 문제가 실제 운영에서는 더 귀찮더라고요. 이럴 때 VM 내부 오류만 보면 원인 추적이 길어지는데, ZFS는 적어도 스토리지 계층에서 “뭔가 이상하다”는 신호를 먼저 주는 편입니다.

    다만 여기에는 오해도 많습니다.

    • 스냅샷은 백업이 아닙니다. 같은 풀 안에 있으면 풀 자체 장애나 운영 실수에서 자유롭지 않습니다.
    • 구성이 잘못되면 보호도 없습니다. single disk 풀은 손상 감지는 해도, 복구할 다른 사본이 없으면 자동 복구를 기대하면 안 됩니다.
    • 메모리가 부족하면 운영 체감이 나빠질 수 있습니다. 안정성과는 별개로 캐시 여유가 없으면 답답하다는 느낌이 반복될 수 있습니다.

    그래서 저는 안정성을 이렇게 정의합니다. 장애를 막는 기술이라기보다, 장애를 설명하고 복구 경로를 남기는 기술입니다. 운영자 입장에서는 이 차이가 꽤 큽니다.

    Proxmox 스토리지를 실제로 구성할 때 먼저 정할 것들

    디스크를 꽂고 바로 zpool create부터 치면 나중에 되돌리기 정말 귀찮습니다. 저는 Proxmox ZFS를 만들기 전에 아래 세 가지부터 정합니다.

    1. 이 풀이 VM용인지, 백업용인지
    2. 확장을 같은 형태의 vdev 추가로 할 건지, 큰 디스크 교체 업그레이드로 갈 건지
    3. 주 저장 장치가 SSD인지 HDD인지

    이걸 먼저 정하면 mirror와 RAIDZ 판단이 훨씬 빨라집니다. 아래는 SSD 두 장을 VM용 mirror 풀로 만드는 예시입니다. 핵심은 /dev/sdX 대신 /dev/disk/by-id/를 쓰고, 필요한 속성을 생성 시점에 같이 넣는 겁니다.

    lsblk -o NAME,SIZE,TYPE,MODEL,SERIAL
    ls -l /dev/disk/by-id/ | grep -E 'ata|nvme'
    
    zpool create -f \
      -o ashift=12 \
      -o autotrim=on \
      -O compression=lz4 \
      -O atime=off \
      -O xattr=sa \
      tank mirror \
      /dev/disk/by-id/ata-Samsung_SSD_1 \
      /dev/disk/by-id/ata-Samsung_SSD_2
    
    zpool status tank
    zfs list

    왜 이렇게 하느냐고요? 이유는 단순합니다.

    • ashift=12: 4K 섹터 계열 장치에 무난하게 많이 쓰는 선택입니다.
    • autotrim=on: SSD 풀이라면 장기 운영 시 도움이 됩니다.
    • compression=lz4, atime=off: 실사용에서 무난한 기본값으로 많이 잡습니다.
    • xattr=sa: 구형 풀이나 호환성을 직접 관리하는 환경에서는 명시해두면 확인이 쉽습니다. 다만 최신 OpenZFS 계열에서는 이미 기본값인 경우도 있어요.
    • by-id 경로 사용: 재부팅이나 하드웨어 변경 후 /dev/sdX 순서 변동 리스크를 줄입니다.

    그 다음은 Proxmox에 스토리지를 등록합니다. 웹 UI로 해도 되지만, 저는 설정 확인이 편해서 CLI도 같이 봅니다.

    pvesm add zfspool tank-vm \
      -pool tank \
      -content images,rootdir \
      -sparse 1
    
    pvesm status
    cat /etc/pve/storage.cfg
    zfspool: tank-vm
        pool tank
        content images,rootdir
        sparse 1

    content images,rootdir는 VM 디스크와 컨테이너 루트 디스크를 저장하겠다는 의미고, sparse 1은 씬 프로비저닝과 연결됩니다. 저는 여기서 한 번 더 확인합니다. 이 풀이 VM용이면 images가 들어가 있는지, 백업용이면 아예 다른 저장소로 분리하는 게 맞는지를요.

    Proxmox ZFS 스토리지 설정과 미러 디스크 구성 이미지

    스토리지 등록 화면이나 디스크 두 개를 미러로 묶는 구성을 설명하는 이미지가 들어가면 이해가 빨라집니다.

    운영하면서 꼭 보는 명령어와 읽는 순서

    스토리지는 만드는 순간보다, 느려졌을 때 어디를 먼저 보느냐가 더 중요합니다. 저는 보통 아래 순서대로 봅니다.

    zpool status -v
    zpool iostat -v 1
    zfs get compression,atime,xattr,recordsize,volblocksize tank
    pvesm status
    journalctl -k -n 100 --no-pager

    명령마다 해석 포인트가 다릅니다.

    • zpool status -v: 첫 줄의 state를 봅니다. ONLINE이 아니면 성능 튜닝보다 상태 복구가 먼저입니다.
    • zpool iostat -v 1: vdev와 개별 디스크 편중을 봅니다. 특정 장치만 유독 바쁘거나 응답이 수상하면 병목 가능성이 큽니다.
    • zfs get ...: 의도한 속성이 실제로 적용됐는지 확인합니다. 생성 후 누락된 경우가 생각보다 흔합니다.
    • pvesm status: Proxmox가 해당 스토리지를 usable하게 보고 있는지 확인합니다. ZFS는 정상인데 Proxmox 등록이 꼬인 경우도 있거든요.
    • journalctl -k: 케이블, 컨트롤러, I/O 에러 같은 커널 레벨 힌트를 봅니다.

    판단 순서도 중요합니다. 저는 늘 1) ONLINE 여부, 2) 오류 증가 여부, 3) 특정 디스크 편중, 4) 워크로드 특성 순서로 봅니다. 이 순서를 지키면 “ZFS가 느린가?” 같은 뭉뚱그린 질문이 “특정 디스크가 느린가?”, “sync 쓰기 때문에 밀리는가?” 같은 실행 가능한 질문으로 바뀝니다.

    예를 들어 백업 시간대에 VM이 버벅인다면, CPU가 널널할 때 저는 먼저 zpool iostat -v 1를 켭니다. 여기서 디스크가 포화되면 원인은 거의 스토리지 계층입니다. 반대로 디스크가 한가하면 백업 방식, 네트워크, 게스트 내부 I/O 패턴을 봐야겠죠. 이거 진짜 편한 게, 잘못 의심할 대상을 빨리 지워준다는 점입니다.

    ⚠️ 제가 자주 본 주의사항과 트러블슈팅

    매뉴얼에는 적혀 있어도 운영하다 보면 왜 이게 문제인지 체감이 늦게 오는 포인트가 있습니다. 아래는 제가 특히 자주 본 실패 모드입니다.

    1. 디스크 이름만 믿고 작업하는 문제

    근본 원인은 단순합니다. Linux의 /dev/sdX 이름은 영구 식별자가 아니기 때문입니다. 리부팅, HBA 변경, 디스크 추가 후 순서가 바뀌면 같은 sdb라고 믿고 작업했다가 다른 디스크를 건드릴 수 있습니다.

    ls -l /dev/disk/by-id/ | grep -E 'ata|nvme'
    
    zpool create -f tank mirror \
      /dev/disk/by-id/ata-Samsung_SSD_xxx \
      /dev/disk/by-id/ata-Samsung_SSD_yyy

    이건 편의가 아니라 사고 방지 습관입니다. 저도 이 규칙을 안 지켰을 때 교체 작업에서 괜히 더 오래 붙잡힌 적이 있었습니다.

    2. 용량 확장을 RAID 카드 감각으로 생각하는 문제

    근본 원인은 vdev 구조를 나중에 자유롭게 바꿀 수 있을 거라는 기대입니다. ZFS는 하드웨어 RAID처럼 아무 디스크나 한 장씩 붙여 모양을 쉽게 바꾸는 방식과는 거리가 있습니다. 최근 OpenZFS에서는 RAIDZ 확장 기능이 들어왔지만, 여전히 시간도 걸리고 제약도 있어 처음 설계를 대충 해도 된다는 뜻은 아닙니다.

    제가 운영 기준으로 내리는 판단은 이렇습니다.

    상황 더 나은 선택 이유
    VM이 중심이고 반응성 중요 Mirror 랜덤 I/O 대응과 장애 처리 절차가 단순합니다
    백업 저장이 중심이고 용량 효율 중요 RAIDZ1/RAIDZ2 가용 용량 확보에 유리합니다
    앞으로 디스크를 같은 쌍으로 늘릴 수 있음 Mirror vdev 추가 확장 전략이 예측 가능합니다
    디스크 추가 계획이 불규칙하고 제각각 ZFS 신중 검토 구조 제약 때문에 중간에 답답해질 가능성이 큽니다

    3. 스냅샷을 백업처럼 쌓는 문제

    근본 원인은 스냅샷의 비용이 낮아 보여서입니다. 너무 쉽게 찍히다 보니 보존 정책 없이 쌓이기 쉽습니다. 그런데 스냅샷이 많아질수록 운영자는 “무엇을 남길지”보다 “무엇을 지워도 되는지” 판단하는 데 시간을 쓰게 됩니다.

    그래서 저는 스냅샷 규칙을 아주 단순하게 둡니다.

    • 수동 스냅샷은 작업 전후처럼 목적이 분명할 때만 만듭니다.
    • 자동 스냅샷은 보존 개수와 이름 규칙을 먼저 정합니다.
    • 장기 보존은 스냅샷이 아니라 별도 백업 저장소로 보냅니다.

    4. scrub를 안 돌려서 이상 징후를 늦게 보는 문제

    근본 원인은 당장 눈에 띄는 장애가 없으니 미루게 된다는 점입니다. 그런데 ZFS의 장점은 문제가 터진 뒤보다, 아직 큰 사고가 되기 전에 상태를 읽는 데 있습니다. scrub를 미루면 그 장점을 스스로 줄이는 셈이죠.

    zpool scrub tank
    zpool status tank

    scan: 항목에서 scrub 진행 여부와 마지막 완료 기록을 봅니다. 에러가 보이면 거기서 멈추지 말고, 디스크 SMART 정보와 커널 로그까지 같이 확인하는 게 좋습니다. 실제 원인이 ZFS보다 SSD 자체, 케이블, 전원, 컨트롤러인 경우도 꽤 많더라고요.

    5. 동기식 쓰기 워크로드를 가볍게 보는 문제

    근본 원인은 “일반 파일 복사도 괜찮았으니 서비스도 괜찮겠지”라는 추정입니다. 하지만 데이터베이스, NFS, 일부 애플리케이션은 sync 쓰기 비중이 높습니다. 이 경우 평소에는 조용하다가 특정 서비스만 유독 느려 보일 수 있습니다. 여기서 필요한 건 막연한 튜닝이 아니라, 그 서비스가 실제로 어떤 쓰기 패턴을 갖는지 확인하는 일입니다.

    Proxmox ZFS 운영 중 장애 디스크 점검과 교체 흐름

    풀 상태가 ONLINE, DEGRADED로 바뀌는 모습과 디스크 교체 절차를 설명하는 시각 자료 위치입니다.

    검증은 어떻게 해야 할까: “된다”보다 “운영 가능하다”를 확인해야 합니다

    구성을 마쳤다면 단순 마운트 확인에서 끝내지 않는 게 좋습니다. 저는 최소한 아래 순서로 검증합니다.

    1. Proxmox가 스토리지를 정상 인식하는지 확인합니다.
    2. 테스트 VM 하나를 만들어 해당 ZFS 풀에 디스크를 올립니다.
    3. 스냅샷 생성과 삭제가 정상 동작하는지 봅니다.
    4. 백업 작업 중 체감 성능이 무너지는지 확인합니다.
    5. zpool status와 zpool iostat로 상태와 편중을 읽습니다.
    qm create 9000 --name zfs-test --memory 2048 --net0 virtio,bridge=vmbr0
    qm set 9000 --scsi0 tank-vm:32
    qm start 9000
    qm snapshot 9000 baseline
    qm listsnapshot 9000
    vzdump 9000 --mode snapshot --storage <backup-storage-name>

    이 단계에서 제가 보는 기준은 속도 숫자보다 일관성입니다.

    • 스냅샷 생성이 안정적으로 되는지: 한 번 되고 한 번 실패하면 저장소 등록 방식이나 설정부터 다시 봐야 합니다.
    • 백업 시 전체 VM 반응성이 무너지는지: 백업 저장소 분리, 시간대 분산, VM용 풀 구조 재검토가 필요할 수 있습니다.
    • 장애 시 상태가 읽히는지: 홈랩이라면 테스트 디스크를 오프라인 처리해 출력이 어떻게 달라지는지 보는 공부가 꽤 도움이 됩니다.

    제가 중요하게 보는 시나리오 하나를 들자면, 백업은 성공하는데 특정 시간대마다 게스트 OS가 갑자기 느려지는 경우입니다. 이때 많은 분들이 Proxmox 전체 문제로 보는데, 실제로는 백업 I/O와 VM I/O가 같은 풀에서 경쟁하는 구조 문제인 경우가 적지 않습니다. 이런 상황에선 튜닝보다 역할 분리가 더 크게 먹힙니다.

    Proxmox ZFS 검증 결과와 상태 확인 대시보드

    가상머신이 ZFS 스토리지에서 동작하고, 상태 명령어 결과가 정상인 모습을 함께 보여주는 검증 이미지입니다.

    어떤 환경에 추천하고, 어디엔 덜 맞을까

    이쯤 되면 선택 기준이 꽤 선명해집니다.

    환경 추천도 이유
    홈랩에서 VM 여러 대 운영 높음 스냅샷, 복제, 상태 확인이 운영 학습과 실사용 모두에 유리합니다
    중소규모 Proxmox 가상화 서버 높음 스토리지 상태를 읽기 쉽고 장애 대응 절차를 표준화하기 좋습니다
    백업/아카이브 저장소 중간 이상 RAIDZ 계열로 용량 효율을 챙길 여지가 있습니다
    메모리 여유가 매우 적은 장비 신중 운영 체감이 떨어질 수 있어 더 단순한 구성이 나을 수 있습니다
    디스크를 아무 규칙 없이 자주 덧붙여야 하는 환경 신중 ZFS의 구조 제약이 장점보다 먼저 불편으로 느껴질 수 있습니다

    여기서 제가 실제로 가장 많이 권하는 구성은 이렇습니다.

    • VM 중심: SSD 2개 이상 mirror 기반 ZFS
    • 백업 중심: 별도 저장소, 필요하면 RAIDZ 계열 검토
    • 역할 분리: OS용, VM용, 백업용을 가능하면 나눔

    특히 “모든 걸 한 풀에 몰아넣는” 설계는 초반엔 단순해 보여도 운영 후반에는 원인 분리가 어려워집니다. 저도 결국은 VM 스토리지와 백업 스토리지를 분리했을 때 제일 편했습니다. 느려지는 이유를 읽기 쉬워졌거든요.

    마무리: 제가 실제로 추천하는 선택 기준

    Proxmox ZFS는 모든 서버에 자동 정답인 기술은 아닙니다. 그래도 VM 중심 운영, 스냅샷 활용, 상태 가시성, 장애 대응 속도를 중요하게 본다면 상당히 강한 선택지입니다. 현업과 홈랩에서 반복해서 느낀 건, ZFS는 초반 진입장벽 대신 장기 운영 편의성을 준다는 점이었어요.

    그래서 제 권고는 분명합니다.

    • VM 위주의 홈랩이나 소규모 가상화 서버라면, 먼저 mirror 기반 Proxmox ZFS를 검토하는 쪽이 무난합니다.
    • 백업/아카이브 비중이 크고 용량 효율이 중요하다면, VM용 풀과 분리한 뒤 RAIDZ 계열을 고려하는 편이 낫습니다.
    • 메모리 여유가 거의 없고 디스크 확장 계획이 자주 바뀌는 장비라면, ZFS를 억지로 넣기보다 더 단순한 스토리지 구성이 운영 비용이 낮습니다.

    한 문장으로 요약하면 이렇습니다. 성능 수치만 보면 판단이 흔들릴 수 있지만, 운영 피로도까지 넣어 보면 Proxmox ZFS의 장점은 꽤 선명합니다. 특히 “장애가 났을 때 내가 빨리 읽고 대응할 수 있는가”를 중요한 기준으로 두신다면, 이 조합은 생각보다 만족도가 오래 갑니다.

    Proxmox 스토리지 비교나 백업 분리 전략도 같이 보시면 판단이 더 쉬워집니다. 다음 글에서는 mirror와 RAIDZ를 실제 운영비 관점에서 더 세밀하게 비교해보겠습니다.

    어떤 환경에 ZFS가 잘 맞는지, 미러와 RAIDZ 중 무엇을 고를지 한눈에 정리하는 요약 이미지입니다.

    FAQ: 실무에서 자주 묻는 포인트

    Proxmox에서 ZFS면 무조건 빠른가요?

    아닙니다. 풀 구조, 디스크 종류, 워크로드 특성이 더 중요합니다. 특히 VM처럼 작은 랜덤 I/O가 많으면 mirror가 더 유리한 경우가 많습니다.

    스냅샷만 있으면 백업은 필요 없나요?

    아니요. 스냅샷은 같은 스토리지 안의 시점 보존이고, 백업은 별도 위치에 독립적으로 남겨두는 개념입니다. 둘은 대체 관계가 아닙니다.

    처음 시작한다면 가장 무난한 구성은 뭔가요?

    테스트와 실사용을 같이 염두에 둔다면, SSD 2개를 mirror로 묶은 ZFS 풀이 가장 이해하기 쉽고 운영 실수도 적습니다. 여기서 감을 잡고 역할 분리를 넓혀가는 편이 실패가 적더라고요.

    RAIDZ를 VM 스토리지로 쓰면 안 되나요?

    못 쓰는 건 아닙니다. 다만 VM 여러 대가 작은 블록을 자주 읽고 쓰는 환경에서는 기대한 체감이 안 나올 수 있습니다. 용량 효율보다 반응성이 중요하면 mirror 쪽이 대체로 덜 후회됩니다.

    문제가 생기면 제일 먼저 뭘 봐야 하나요?

    저는 zpool status -v로 상태를 먼저 보고, 그다음 zpool iostat -v 1로 병목과 편중을 확인합니다. 그 후에야 Proxmox 설정과 게스트 내부 문제를 의심합니다.

  • [Linux] NVMe SSD 환경 파일 시스템 벤치마크: ext4, XFS, Btrfs, ZFS 성능 비교

    [Linux] NVMe SSD 환경 파일 시스템 벤치마크: ext4, XFS, Btrfs, ZFS 성능 비교

    [Linux] NVMe SSD 환경 파일 시스템 벤치마크: ext4, XFS, Btrfs, ZFS 성능 비교

    NVMe SSD 리눅스 파일 시스템 조합, 이거 생각보다 성능 차이가 꽤 크게 나더라고요. 저도 홈랩에서 VM 스토리지랑 컨테이너 볼륨을 굴리면서 처음엔 그냥 ext4로 통일했었는데, 실제로 써보니까 워크로드(작업 부하)에 따라 XFS가 더 편한 경우도 있고, Btrfs나 ZFS처럼 기능이 많은 파일 시스템이 운영 안정성 면에서 더 낫다고 느낀 순간도 있었습니다. 그래서 이번 글에서는 NVMe SSD 환경 리눅스 파일 시스템을 기준으로, ext4 성능, XFS 성능, Btrfs 성능, ZFS 성능을 어떻게 비교해야 하는지, 그리고 파일 시스템 벤치마크를 할 때 어떤 함정을 피해야 하는지 정리해보겠습니다.

    중요한 포인트부터 말씀드리면, 벤치마크 숫자 하나만 보고 파일 시스템을 고르면 나중에 꼭 후회합니다. 순차 읽기/쓰기만 빠르다고 끝이 아니거든요. 메타데이터(파일 정보) 처리, 작은 파일 다량 생성, 스냅샷(시점 복사), 압축, 복구 편의성까지 같이 봐야 합니다. 여기서 제일 중요한 건 벤치마크는 숫자 놀이가 아니라 운영 시나리오 검증이어야 한다는 거예요.

    NVMe SSD 위에서 여러 리눅스 파일 시스템이 서로 다른 특성과 워크로드를 가지는 모습을 한눈에 보여주는 개요 이미지입니다.

    1. 왜 NVMe SSD에서는 파일 시스템 선택이 더 중요할까요?

    예전 SATA SSD 시절에도 파일 시스템 차이는 있었지만, NVMe SSD로 오면 대기 시간(지연 시간)이 낮아지고 병렬 처리 성능이 올라가면서 병목이 더 위로 올라옵니다. 쉽게 말해, 디스크가 느려서 묻히던 차이가 파일 시스템 계층에서 더 잘 드러난다는 뜻입니다.

    • ext4: 기본기가 탄탄하고 범용성이 좋습니다.
    • XFS: 큰 파일, 병렬 I/O, 서버 워크로드에서 자주 거론됩니다.
    • Btrfs: 스냅샷과 서브볼륨(하위 볼륨)이 강점입니다.
    • ZFS: 데이터 무결성(데이터 정확성)과 고급 기능이 강력하지만 메모리 사용과 운영 복잡도도 같이 따라옵니다.

    실제로 써보니까, VM 이미지처럼 큰 파일을 연속으로 다루는 환경과, CI 캐시나 컨테이너 레이어처럼 작은 파일이 쏟아지는 환경은 체감이 완전히 다르더라고요. 그래서 NVMe SSD 리눅스 파일 시스템 비교는 단순 평균이 아니라 시나리오별 해석이 핵심입니다.

    2. ext4, XFS, Btrfs, ZFS를 쉽게 정리해보면

    저도 처음엔 헷갈렸는데, 이렇게 보면 좀 편합니다.

    파일 시스템 성격 강점 주의할 점
    ext4 표준형 안정적, 관리 쉬움, 범용성 좋음 고급 스냅샷 기능은 별도 계층 필요
    XFS 병렬 처리형 큰 파일, 높은 동시성, 서버 환경 적합 작은 파일/특정 메타데이터 패턴은 직접 검증 필요
    Btrfs 기능 통합형 스냅샷, 압축, 서브볼륨 CoW(Copy-on-Write) 특성 이해 필요
    ZFS 무결성 중심형 체크섬, 스냅샷, 압축, 관리 기능 풍부 메모리와 운영 방식 이해가 필요, 리눅스 기본 내장 FS는 아님

    ext4 성능은 대체로 예측 가능하고 무난한 편입니다. 반면 XFS 성능은 병렬 쓰기나 대용량 파일 위주에서 장점이 보이는 경우가 많고요. Btrfs 성능은 기능을 많이 켜는 대신 워크로드에 따라 편차가 생길 수 있습니다. ZFS 성능도 압축, recordsize, ARC(메모리 캐시) 설정에 영향을 꽤 받습니다.

    3. 벤치마크 전에 꼭 정해야 할 테스트 원칙

    여기서 삽질을 가장 많이 합니다 ㅎㅎ 저도 예전에 캐시를 비우는 절차 없이 돌렸다가 결과가 너무 예쁘게 나와서 좋아했는데, 다시 보니까 거의 메모리 테스트였던 적이 있거든요.

    1. 같은 NVMe SSD, 같은 파티션 크기, 같은 커널(운영체제 핵심) 환경에서 비교합니다.
    2. 가능하면 파일 시스템마다 새로 생성한 빈 볼륨에서 시작합니다.
    3. 순차 읽기/쓰기와 랜덤 읽기/쓰기, 둘 다 측정합니다.
    4. 작은 파일 메타데이터 성능과 큰 파일 처리 성능을 분리해서 봅니다.
    5. 압축, CoW, atime 같은 옵션은 켠 상태와 끈 상태를 구분합니다.
    6. 최소 2~3회 반복 실행해서 편차를 확인합니다.

    벤치마크 도구는 보통 fio를 많이 씁니다. 이유는 간단합니다. 블록 크기, 큐 깊이, 동시 작업 수를 세밀하게 조절할 수 있어서 실제 서버 부하에 가깝게 흉내 내기 좋거든요.

    4. NVMe SSD 리눅스 파일 시스템 벤치마크 실전 준비

    아래 예시는 테스트 디바이스를 별도 디스크 또는 실험용 파티션으로 가정합니다. 운영 중인 루트 파일 시스템에 바로 적용하면 위험합니다. 반드시 테스트 환경에서 진행하세요.

    4-1. 테스트 장치 확인

    lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,MODEL
    nvme list
    

    먼저 대상 NVMe 장치를 정확히 확인합니다. 장치명을 잘못 잡으면 진짜 눈물 납니다. 저도 예전에 테스트한다고 했다가 다른 디스크를 지울 뻔했었네요.

    4-2. 파일 시스템 생성 예시

    # ext4
    sudo mkfs.ext4 /dev/nvme1n1p1
    
    # XFS
    sudo mkfs.xfs -f /dev/nvme1n1p1
    
    # Btrfs
    sudo mkfs.btrfs -f /dev/nvme1n1p1
    
    # ZFS는 별도 풀(pool) 생성 방식 사용
    sudo zpool create benchpool /dev/nvme1n1p1
    sudo zfs create benchpool/testfs
    

    ZFS는 ext4, XFS, Btrfs처럼 단순 mkfs 흐름과는 좀 다릅니다. 처음엔 이게 뭔가 싶었는데, ZFS는 파일 시스템만 따로 보는 게 아니라 스토리지 관리 계층까지 같이 보는 구조라서 그렇습니다.

    4-3. 마운트 옵션 예시

    # ext4
    sudo mount -o noatime /dev/nvme1n1p1 /mnt/bench
    
    # XFS
    sudo mount -o noatime /dev/nvme1n1p1 /mnt/bench
    
    # Btrfs
    sudo mount -o noatime,compress=zstd /dev/nvme1n1p1 /mnt/bench
    
    # ZFS
    sudo zfs set atime=off benchpool/testfs
    sudo zfs set compression=lz4 benchpool/testfs
    

    noatime은 접근 시간(access time) 갱신을 줄여서 불필요한 쓰기를 줄이는 데 도움이 됩니다. 다만 환경에 따라 기본값이나 운영 정책이 다를 수 있으니 무조건 정답은 아닙니다.

    NVMe SSD 리눅스 파일 시스템 벤치마크 구성도

    벤치마크 대상 NVMe SSD, 마운트 포인트, fio 테스트 흐름을 단계별로 보여주는 실전 구성 이미지입니다.

    4-4. fio 벤치마크 스크립트 예시

    cat > fio-randread.fio <<'EOF'
    [global]
    ioengine=libaio
    direct=1
    runtime=60
    time_based=1
    group_reporting=1
    filename=/mnt/bench/testfile.bin
    size=8G
    
    [randread-4k]
    bs=4k
    rw=randread
    iodepth=32
    numjobs=4
    EOF
    
    fio fio-randread.fio
    
    cat > fio-seqwrite.fio <<'EOF'
    [global]
    ioengine=libaio
    direct=1
    runtime=60
    time_based=1
    group_reporting=1
    filename=/mnt/bench/testfile.bin
    size=8G
    
    [seqwrite-1m]
    bs=1m
    rw=write
    iodepth=32
    numjobs=1
    EOF
    
    fio fio-seqwrite.fio
    

    여기서 4K 랜덤 읽기는 작은 I/O가 많은 데이터베이스나 VM 메타데이터 패턴을 보는 데 좋고, 1M 순차 쓰기는 큰 파일 복사나 백업 이미지 생성 같은 상황을 가정하기 좋습니다.

    5. 파일 시스템별로 벤치마크 해석 포인트가 다릅니다

    같은 fio 결과라도 읽는 법이 다릅니다. 숫자만 보지 말고 특성까지 같이 봐야 합니다.

    • ext4: 전반적으로 균형이 좋고, 기본 설정에서도 큰 이슈 없이 결과가 나오는 편입니다.
    • XFS: 동시성(동시에 여러 작업 처리)과 대용량 파일 흐름에서 강점을 기대할 수 있습니다.
    • Btrfs: 압축과 스냅샷은 장점이지만, CoW 특성 때문에 일부 쓰기 패턴은 결과를 따로 봐야 합니다.
    • ZFS: recordsize, compression, ARC 같은 설정이 결과에 영향을 주므로 기본값만 보고 단정하면 안 됩니다.

    실제로 써보니까 Btrfs와 ZFS는 기능이 성능 결과에 직접 개입합니다. 그래서 기능을 끈 상태, 켠 상태를 분리해서 비교하는 게 맞더라고요. 예를 들어 압축이 켜졌다고 무조건 느려지는 게 아니라, CPU 여유가 있고 데이터 압축률이 괜찮으면 오히려 체감 I/O가 줄어드는 경우도 있습니다.

    6. ⚠️ 제가 실제로 겪었던 트러블슈팅 포인트

    이 섹션은 진짜 중요합니다. 벤치마크는 잘못하면 재현성(다시 해도 비슷한 결과가 나오는 성질)이 박살 나거든요.

    6-1. 페이지 캐시 때문에 결과가 이상하게 잘 나올 때

    첫 실행보다 두 번째 실행이 비정상적으로 빠르면 페이지 캐시를 의심해야 합니다. direct I/O를 써도 워크로드에 따라 캐시 영향이 완전히 사라지지 않는 경우가 있어서, 테스트 순서와 파일 초기화 상태를 일정하게 맞추는 게 중요합니다.

    6-2. Btrfs의 CoW가 로그/DB 파일에 불리할 때

    작은 랜덤 업데이트가 많은 파일은 CoW 특성 때문에 쓰기 증폭(실제 기록량 증가)이 체감될 수 있습니다. 이런 경우는 파일 단위 NOCOW 설정 같은 운영 전략을 별도로 검토합니다. 다만 이건 워크로드 의존성이 커서, 무조건 끄는 식으로 접근하면 또 다른 장점을 놓칠 수 있습니다.

    6-3. ZFS는 메모리와 설정을 같이 봐야 합니다

    ZFS는 데이터 무결성과 관리 기능이 강력한 대신, 메모리 캐시 활용이 중요한 편입니다. ARC가 잘 동작하는 환경과 그렇지 않은 환경의 체감 차이가 꽤 있습니다. 저도 처음엔 “왜 이렇게 다르지?” 했었는데, 결국 테스트 장비 메모리 구성과 dataset 속성 차이였더라고요.

    6-4. discard/TRIM 처리 방식 차이

    온라인 discard를 바로 걸지, 주기적으로 fstrim을 돌릴지는 배포판과 운영 정책에 따라 다를 수 있습니다. 벤치마크 중에는 이 배경 작업이 개입하지 않게 관리하는 게 좋습니다.

    6-5. 압축 옵션은 공정하게 맞춰야 합니다

    Btrfs나 ZFS에서 압축을 켠 상태와 ext4/XFS 기본 상태를 그대로 비교하면, 그건 “파일 시스템 비교”이면서 동시에 “기능 켠 상태 비교”가 됩니다. 글의 목적에 따라 비교 기준을 명확히 나눠야 합니다.

    Btrfs와 ZFS 옵션이 NVMe SSD 성능에 미치는 영향 이미지

    CoW, 압축, 캐시, TRIM 같은 요소가 벤치마크 결과를 흔드는 원인을 설명하는 트러블슈팅 이미지입니다.

    7. 검증과 결과 정리: 숫자보다 패턴을 보세요

    이번 글에서는 의도적으로 특정 수치를 단정해서 넣지 않았습니다. NVMe SSD 모델, 커널, 마운트 옵션, 메모리 용량, 테스트 데이터 특성에 따라 결과가 꽤 달라지기 때문입니다. 대신 일반적으로 많이 보는 해석 패턴을 정리해보면 아래와 같습니다.

    비교 항목 자주 관찰되는 경향 체크할 포인트
    순차 읽기/쓰기 ext4, XFS가 단순 구성에서 무난한 결과를 내기 쉬움 대용량 파일 위주인지 확인
    랜덤 4K 옵션과 큐 깊이에 따라 차이가 크게 남 DB/VM 패턴과 유사한지 확인
    메타데이터 작업 파일 생성/삭제/rename 패턴에서 차이가 드러남 작은 파일 수가 많은지 확인
    스냅샷/압축 Btrfs, ZFS가 기능상 이점이 큼 성능과 운영 편의성 함께 평가
    운영 단순성 ext4가 가장 익숙하고 단순한 편 장애 대응 경험도 고려

    검증 명령은 이런 식으로 같이 보시면 됩니다.

    fio fio-randread.fio
    fio fio-seqwrite.fio
    iostst -x 1
    vmstat 1
    mount | grep /mnt/bench
    

    iostat로 장치 사용률과 대기 시간을 보고, vmstat로 메모리와 시스템 상태를 같이 봅니다. 벤치마크 결과 파일만 보는 것보다 훨씬 해석이 쉬워집니다. 드디어 됐다! 싶은 순간이 여기서 오는데, 사실 이때부터가 진짜 시작입니다. 왜 빨랐는지, 왜 느렸는지를 설명할 수 있어야 하거든요.

    8. 그래서 어떤 파일 시스템을 고르면 좋을까요?

    정답은 하나가 아닙니다. 제가 직접 해보니 용도별로 이렇게 접근하는 게 현실적이었습니다.

    1. 범용 서버, 운영 단순성 우선: ext4
    2. 대용량 파일, 병렬 I/O, 로그성 서버: XFS 검토
    3. 스냅샷, 서브볼륨, 유연한 관리: Btrfs 검토
    4. 무결성, 스냅샷, 압축, 스토리지 통합 관리: ZFS 검토

    혹시 이런 경험 있으신가요? 벤치마크만 보면 A가 빨랐는데, 운영해보니 B가 훨씬 편했던 경우요. 이게 진짜 자주 일어납니다. 그래서 파일 시스템 벤치마크는 최종 결론이 아니라 의사결정 재료로 보는 게 맞습니다.

    체크리스트도 남겨보겠습니다.

    • 내 워크로드는 작은 파일 위주인가, 큰 파일 위주인가
    • 스냅샷이 꼭 필요한가
    • 압축으로 얻을 이점이 있는가
    • 복구와 운영 난이도를 감당할 수 있는가
    • 팀이 익숙한 파일 시스템인가
    NVMe SSD 리눅스 파일 시스템 선택 기준 비교 이미지

    워크로드별로 ext4, XFS, Btrfs, ZFS 중 어떤 선택이 어울리는지 요약한 비교 인포그래픽입니다.

    9. 마무리: 성능 비교보다 더 중요한 것

    NVMe SSD 리눅스 파일 시스템을 비교할 때 가장 중요한 건, “누가 더 빠르냐”보다 “내 환경에서 어떤 특성이 더 맞느냐”입니다. ext4 성능, XFS 성능, Btrfs 성능, ZFS 성능은 모두 의미가 있지만, 그 숫자는 설정과 부하에 따라 달라집니다. 반면 운영 편의성, 복구 경험, 스냅샷 전략, 백업 체계는 생각보다 오래 갑니다.

    저는 요즘도 홈랩에서 새 워크로드를 올릴 때 먼저 fio로 최소한의 패턴 검증부터 합니다. 한 번 해두면 감이 생기고, 다음에는 훨씬 덜 헤매게 되더라고요. 다음 글에서는 fio 결과를 읽는 법, 그리고 VM/컨테이너/DB별로 어떤 테스트 프로파일을 써야 하는지를 따로 정리해볼 예정입니다. 이전 글에서 다룬 스토리지 모니터링 내용과 함께 보시면 더 이해가 쉬우실 겁니다.

    정리 FAQ

    Q1. NVMe SSD에서는 무조건 XFS가 빠른가요?

    아닙니다. 워크로드에 따라 ext4가 더 무난하거나, 기능 요구 때문에 Btrfs나 ZFS가 더 적합할 수 있습니다.

    Q2. Btrfs나 ZFS는 느리기만 한가요?

    그렇게 단순하지 않습니다. 압축, 스냅샷, 무결성 같은 기능 가치까지 같이 봐야 합니다. 일부 상황에서는 운영 효율이 더 큰 장점이 됩니다.

    Q3. 벤치마크는 어떤 도구부터 시작하면 될까요?

    대부분의 경우 fio부터 시작하시면 됩니다. 순차/랜덤, 블록 크기, 큐 깊이를 조절해 실제 부하와 비슷하게 맞추기 좋습니다.

    Q4. 결과가 매번 다르게 나오는데 정상인가요?

    어느 정도는 정상입니다. 캐시, 백그라운드 작업, SSD 상태, 테스트 순서가 영향을 줄 수 있으니 조건을 최대한 통제해야 합니다.

  • [NAS] TrueNAS ZFS 풀 확장: 성능 저하 없이 용량 늘리는 방법 분석

    [NAS] TrueNAS ZFS 풀 확장: 성능 저하 없이 용량 늘리는 방법 분석

    [NAS] TrueNAS ZFS 풀 확장: 성능 저하 없이 용량 늘리는 방법 분석

    홈랩(Home Lab, 개인 실험실) NAS를 오래 굴리다 보면 결국 한 번은 맞닥뜨리는 문제가 있습니다. 분명 처음엔 넉넉하다고 생각했는데, 백업 데이터와 미디어 파일, VM 이미지가 쌓이면서 어느 순간 용량이 바닥을 보더라고요. 저도 TrueNAS ZFS 확장을 몇 번 직접 해보면서 느낀 건, 그냥 디스크 하나 더 꽂는다고 끝나는 구조가 아니라는 점이었습니다. 특히 TrueNAS ZFS 확장은 성능과 안정성을 같이 봐야 해서, 잘못 접근하면 NAS 용량 증설은 됐는데 ZFS 성능이 애매해지는 경우가 생깁니다.

    처음엔 저도 “디스크 추가만 하면 되겠지?”라고 생각했었는데, ZFS(제트에프에스, 파일시스템+볼륨 매니저 통합 구조)는 생각보다 설계 철학이 명확합니다. 그래서 오늘은 성능 저하 없이 용량을 늘리는 방법에 초점을 맞춰서, 어떤 방식이 안전한지, 어떤 방식은 조심해야 하는지, 그리고 실제로 확인해야 할 명령어까지 한 번에 정리해보겠습니다.

    TrueNAS ZFS 확장 개요를 보여주는 아키텍처 이미지

    TrueNAS ZFS 확장 전략을 한눈에 보여주는 개요 다이어그램입니다. 기존 풀, vdev, 디스크 추가 방향을 직관적으로 이해할 수 있게 배치하면 좋습니다.

    왜 TrueNAS ZFS 확장이 까다로운가

    쉽게 말해 ZFS는 단순히 디스크 몇 개를 묶는 수준이 아니라, vdev(Virtual Device, 가상 장치) 단위로 성능과 안정성을 관리합니다. 그리고 여러 vdev가 모여 하나의 pool(풀)을 만들죠. 여기서 중요한 포인트가 있습니다. 풀은 확장하기 쉬워 보여도, 기존 vdev 구조는 생각보다 보수적으로 다뤄야 한다는 점입니다.

    예를 들어 mirror(미러, 동일 데이터 복제) vdev 2개로 풀을 만들었다면, 나중에 같은 형태의 mirror vdev를 하나 더 추가하는 건 비교적 자연스럽습니다. 반면 RAIDZ(레이드지, 패리티 기반 보호) vdev 하나로 구성한 풀은, 전통적으로는 그 vdev에 디스크 하나만 툭 추가하는 방식이 깔끔하지 않았거든요. 여기서 많은 분들이 삽질을 시작합니다. 저도 처음엔 이게 뭔가 싶었는데, 구조를 이해하고 나니 왜 ZFS가 그렇게 동작하는지 보이더라고요.

    핵심 개념: 성능 저하 없이 용량 늘린다는 말의 의미

    “성능 저하 없이”라는 표현을 좀 더 정확히 풀어보겠습니다. ZFS에서 성능은 대체로 다음 요소에 영향을 받습니다.

    • vdev 개수: 일반적으로 vdev가 늘어나면 병렬성이 좋아질 수 있습니다.
    • 각 vdev의 디스크 수와 형태: mirror인지 RAIDZ인지에 따라 IOPS(Input/Output Operations Per Second, 초당 입출력 작업 수) 특성이 달라집니다.
    • 디스크 크기와 속도의 균형: 느린 디스크가 섞이면 전체 체감이 나빠질 수 있습니다.
    • 확장 과정 중 resilver(리실버, 데이터 재동기화) 부하: 이 과정에서 일시적으로 성능이 떨어질 수 있습니다.

    즉, 용량만 늘어나는 방식과 용량과 성능 특성을 함께 유지하는 방식은 다릅니다. 실제로 써보니까 가장 덜 후회하는 방법은 아래 두 가지였습니다.

    1. 기존과 동일한 성격의 vdev를 추가해서 풀 병렬성을 유지하는 방법
    2. 기존 디스크를 하나씩 더 큰 디스크로 교체한 뒤 자동 확장(autoexpand, 자동 확장)을 활용하는 방법

    반대로, 크기나 성능이 제각각인 디스크를 즉흥적으로 추가하면 NAS 용량 증설은 되더라도 장기적으로 운영이 피곤해집니다. 특히 장애 대응할 때 구조가 복잡해지더라고요.

    TrueNAS ZFS 확장 방법 비교

    방법 언제 적합한가 ZFS 성능 영향 장점 주의점
    동일한 새 vdev 추가 베이에 여유가 있고 구조를 깔끔하게 유지하고 싶을 때 대체로 유리 병렬성 유지, 확장 논리 명확 같은 급의 디스크를 여러 개 준비해야 함
    기존 디스크 순차 교체 후 확장 베이 여유가 없고 현재 구조를 유지해야 할 때 구조 유지 측면에서 안정적 기존 풀 레이아웃 유지 리실버 시간이 길고 교체 순서가 중요
    서로 다른 특성의 vdev 혼합 추가 임시 증설이 급할 때 예측 어려움 당장 공간 확보 가능 장기 운영, 장애 대응, 체감 성능 모두 애매해질 수 있음

    여기서 제 경험상 가장 추천하는 건 “같은 성격으로 확장하기”입니다. 처음 설계를 mirror로 했다면 mirror로, RAIDZ로 했다면 이후 확장 시에도 같은 패턴을 유지하는 쪽이 관리가 편합니다.

    TrueNAS ZFS 확장 구조에서 pool과 vdev 관계를 설명하는 이미지

    pool 아래에 여러 vdev가 있고, 각 vdev 아래에 디스크가 연결되는 구조를 시각적으로 보여주는 이미지가 들어가면 이해가 훨씬 빠릅니다.

    실전 1: 새 vdev 추가로 TrueNAS ZFS 확장하기

    이 방법은 제가 홈랩에서 가장 선호하는 방식입니다. 이유는 단순합니다. 설계 의도를 망가뜨리지 않고 확장할 수 있거든요. 예를 들어 2디스크 mirror vdev 두 개로 운영 중이었다면, 같은 2디스크 mirror vdev를 하나 더 추가하는 식입니다.

    확장 전 확인

    먼저 현재 풀 구성을 확인합니다.

    zpool status
    zpool list
    zpool iostat -v 1

    zpool status는 현재 풀과 vdev 상태를, zpool list는 용량과 사용률을, zpool iostat -v 1은 vdev별 I/O 흐름을 보는 데 유용합니다. 저는 확장 전에 이 세 개는 거의 습관처럼 확인합니다. 나중에 비교하기 좋거든요.

    절차

    1. 새 디스크를 장착하고 시스템이 정상 인식하는지 확인합니다.
    2. 기존 풀의 vdev 레이아웃과 동일한 방식으로 새 vdev를 구성합니다.
    3. TrueNAS GUI 또는 CLI(Command Line Interface, 명령줄 인터페이스)에서 풀에 추가합니다.
    4. 추가 직후 I/O 분산과 용량 변화를 확인합니다.

    CLI 예시는 아래처럼 볼 수 있습니다. 디바이스 이름은 환경마다 다르니 반드시 직접 확인하셔야 합니다.

    zpool add tank mirror /dev/disk/by-id/driveA /dev/disk/by-id/driveB

    예시에서 tank는 풀 이름입니다. 이 명령은 새 mirror vdev를 기존 풀에 추가하는 형태입니다. 한 번 추가한 vdev는 쉽게 되돌리기 어렵다는 점, 꼭 기억하셔야 합니다. 제가 예전에 이름 비슷한 디스크를 잘못 보고 진행했다가 식은땀 좀 흘렸습니다 ㅎㅎ

    이 방식이 성능 면에서 유리한 이유

    새 vdev가 추가되면 풀은 더 많은 vdev에 I/O를 분산할 수 있습니다. 물론 워크로드 특성에 따라 체감은 다르지만, 최소한 구조적으로 병렬 처리 경로를 늘리는 방향이라 논리가 깔끔합니다. 특히 VM 저장소나 작은 파일이 많은 환경에서는 이 차이가 은근히 보이더라고요.

    실전 2: 디스크를 하나씩 교체해서 NAS 용량 증설하기

    베이(Bay, 디스크 장착 슬롯)가 꽉 찬 경우에는 이 방법이 현실적입니다. 기존 풀 구조는 유지하면서 디스크 용량만 키우는 방식이죠. mirror든 RAIDZ든 많이 쓰는 패턴인데, 핵심은 한 번에 하나씩 교체하고, 각 교체마다 리실버가 완전히 끝날 때까지 기다리는 것입니다.

    기본 흐름

    1. 현재 상태를 확인합니다.
    2. 기존 디스크 하나를 오프라인 처리하거나 교체 절차에 맞춰 분리합니다.
    3. 더 큰 디스크로 교체합니다.
    4. 리실버 완료를 기다립니다.
    5. 다음 디스크로 같은 작업을 반복합니다.
    6. 모든 디스크가 교체된 뒤 풀 확장 여부를 확인합니다.
    zpool status
    zpool offline tank /dev/disk/by-id/old-drive
    zpool replace tank /dev/disk/by-id/old-drive /dev/disk/by-id/new-drive
    zpool status

    실제 명령은 환경과 장치 식별 방식에 따라 달라질 수 있습니다. 그래서 저는 항상 /dev/disk/by-id 경로처럼 상대적으로 식별이 명확한 쪽을 선호합니다. /dev/sdX 같은 이름은 재부팅이나 장치 순서에 따라 헷갈릴 수 있거든요.

    자동 확장 확인

    디스크를 모두 더 큰 용량으로 바꾼 뒤에도 풀 크기가 바로 기대만큼 안 늘어나는 경우가 있습니다. 이럴 때는 autoexpand(자동 확장) 설정과 풀 상태를 확인해봐야 합니다.

    zpool get autoexpand tank
    zpool set autoexpand=on tank
    zpool online -e tank /dev/disk/by-id/new-drive

    처음엔 저도 “왜 디스크는 바뀌었는데 용량이 그대로지?” 싶었는데, 이런 부분에서 한 번씩 막히더라고요. 특히 교체 직후 바로 결과만 보고 판단하면 놓치는 게 있습니다. 리실버가 완전히 끝났는지부터 확인하셔야 합니다.

    리실버 진행 상태, 풀 상태, 디스크 교체 흐름을 보여주는 운영 화면 이미지가 있으면 실전 감각이 살아납니다.

    TrueNAS GUI에서 볼 때 체크할 포인트

    CLI가 제일 명확하긴 하지만, 실제 운영에서는 TrueNAS GUI도 꽤 자주 보게 됩니다. 제가 보통 체크하는 항목은 이 정도입니다.

    • Pool 상태: ONLINE인지, DEGRADED인지
    • Disk 상태: 새 디스크가 정상 인식됐는지
    • 작업 진행률: 리실버가 끝났는지
    • Capacity 변화: 예상한 만큼 용량이 반영됐는지
    • Alert: SMART 관련 경고나 I/O 오류가 없는지

    GUI가 편하긴 한데, 중요한 작업일수록 CLI로 최종 확인하는 습관을 추천드립니다. 화면상으론 정상처럼 보여도 세부 상태는 zpool status 쪽이 더 직설적입니다.

    ⚠️ 주의사항과 트러블슈팅

    여기서부터는 정말 실전 얘기입니다. 이 부분 때문에 삽질 좀 했습니다 ㅎㅎ

    1. 디스크 하나만 추가해서 RAIDZ를 키우려는 시도

    많이 하는 착각입니다. 기존 RAIDZ vdev가 있다고 해서, 거기에 디스크 하나를 단순 추가하는 방식이 항상 안전하고 익숙한 운영 패턴은 아닙니다. 운영 환경에서는 지원 여부와 절차를 현재 문서로 꼭 재확인하셔야 하고, 검증된 방식은 동일한 새 vdev 추가 또는 순차 교체라고 보시는 게 안전합니다.

    2. 크기가 다른 디스크를 섞어 넣는 문제

    ZFS는 동작은 하더라도, 실제 활용 가능한 용량과 균형은 가장 작은 축에 맞춰 생각해야 하는 경우가 많습니다. 그리고 확장 계획이 지저분해집니다. 처음엔 급해서 그렇게 넣고 싶어지는데, 나중에 교체 주기 맞출 때 정말 귀찮아집니다.

    3. 리실버 중 성능 저하를 무시하는 문제

    성능 저하 없이라는 말은 확장 중에도 항상 아무 영향이 없다는 뜻은 아닙니다. 리실버 중에는 읽기/쓰기 지연이 늘 수 있습니다. 그래서 중요한 건 최종 구조가 성능 저하를 만들지 않는 방향이어야 한다는 겁니다. 저는 대용량 복제나 스크럽(scrub, 무결성 검사) 작업과 겹치지 않게 시간대를 따로 잡습니다.

    4. 백업 없이 확장 작업부터 들어가는 문제

    이건 정말 강조하고 싶습니다. ZFS가 안정적이라고 해도, 확장 작업은 결국 저장장치 구성 변경입니다. 디스크 자체 불량, 케이블 문제, 슬롯 접촉 불량 같은 변수는 늘 있습니다. 백업 없는 확장은 자신감이 아니라 도박에 가깝습니다.

    5. 디바이스 이름을 대충 보고 진행하는 문제

    /dev/sda, /dev/sdb 같은 이름만 믿고 교체하다가 엉뚱한 디스크를 건드리면 정말 아찔합니다. 가능하면 시리얼 기반 식별 경로를 쓰시고, 작업 전후로 꼭 대조해보세요. 저는 메모장에 디스크 시리얼과 베이 위치를 적어두고 합니다. 이거 진짜 편하더라고요.

    검증: 확장 후 무엇을 확인해야 하나

    확장이 끝났다고 바로 안심하시면 안 됩니다. 최소한 아래 항목은 체크하시는 게 좋습니다.

    1. 풀이 ONLINE 상태인지 확인
    2. 예상한 만큼 총 용량이 늘었는지 확인
    3. 각 vdev에 I/O가 비정상적으로 쏠리지 않는지 확인
    4. 에러 카운터가 증가하지 않는지 확인
    5. SMART 상태와 온도를 점검
    zpool status -v
    zpool list
    zpool iostat -v 5
    smartctl -a /dev/sdX

    zpool iostat -v 5는 5초 단위로 상태를 보기에 좋습니다. 제가 직접 해보니 확장 직후에는 단순히 용량만 보지 말고, 실제로 파일 복사나 백업 작업을 한 번 흘려보내면서 vdev 반응을 같이 보는 게 좋았습니다. 그래야 “늘긴 늘었는데 뭔가 이상하게 굼뜬다” 같은 문제를 빨리 잡을 수 있거든요.

    TrueNAS ZFS 확장 전후 용량과 성능 비교 이미지

    확장 전후의 총 용량, 사용률, I/O 분산 상태를 비교한 대시보드 이미지가 들어가면 결과 섹션의 설득력이 높아집니다.

    어떤 확장 전략이 가장 현실적인가

    환경별로 정리해보면 이렇습니다.

    상황 추천 전략 이유
    디스크 베이에 여유가 있음 동일한 새 vdev 추가 구조 확장이 자연스럽고 병렬성 유지에 유리
    베이가 꽉 참 디스크 순차 교체 현재 레이아웃을 유지하면서 용량만 키우기 좋음
    임시로 공간만 급함 가능하면 정식 확장 전 임시 데이터 정리 무리한 혼합 구성은 장기적으로 손해

    혹시 이런 경험 있으신가요? 급하게 공간이 필요해서 손에 잡히는 디스크부터 넣고 싶은 순간이요. 저도 그랬습니다. 그런데 ZFS는 급한 마음으로 건드릴수록 나중에 구조가 발목을 잡는 편이더라고요. 그래서 제 기준에선 “지금 가장 쉬운 방법”보다 “3년 뒤에도 설명 가능한 구조”가 더 중요했습니다.

    자주 묻는 질문

    Q1. 디스크 추가만 하면 자동으로 성능도 같이 좋아지나요?

    항상 그렇진 않습니다. 어떤 형태의 vdev를 추가했는지, 워크로드가 순차 읽기 위주인지, 랜덤 I/O 위주인지에 따라 다릅니다. 다만 동일한 성격의 vdev를 추가하는 방식은 구조적으로 예측 가능성이 높습니다.

    Q2. NAS 용량 증설 시 제일 먼저 볼 명령은 뭔가요?

    저는 zpool status부터 봅니다. 상태를 모르고 작업하는 건 위험합니다. 그다음 zpool list, 필요하면 zpool iostat -v를 봅니다.

    Q3. ZFS 성능을 위해 SSD 캐시만 추가하면 해결되나요?

    캐시 장치는 특정 워크로드에서 도움이 될 수 있지만, 기본 풀 구조가 좋지 않으면 근본 해결은 아닙니다. 먼저 풀 레이아웃과 vdev 구성을 정리하는 게 우선입니다. 캐시는 그 다음입니다.

    정리: TrueNAS ZFS 확장은 구조를 지키는 쪽이 결국 이깁니다

    오늘 정리한 내용을 한 줄로 줄이면 이렇습니다. TrueNAS ZFS 확장은 단순히 디스크 추가가 아니라, vdev 구조를 어떻게 유지하느냐의 문제입니다. 성능 저하 없이 가고 싶다면 검증된 방식으로 접근하시는 게 맞습니다. 즉, 베이에 여유가 있으면 동일한 새 vdev를 추가하고, 여유가 없으면 기존 디스크를 하나씩 더 큰 용량으로 교체하는 쪽이 가장 현실적입니다.

    저도 처음엔 용량만 보면 되는 줄 알았는데, 실제로 써보니까 결국 중요한 건 장기 운영의 일관성이었습니다. ZFS 성능, 장애 대응, 다음 증설 계획까지 생각하면 설계를 흐트러뜨리지 않는 게 제일 낫더라고요. 다음 글에서는 스크럽 주기, SMART 모니터링, 백업 전략까지 묶어서 홈랩 NAS 운영 체크리스트로 정리해보겠습니다. 이전 글에서 다뤘던 스토리지 모니터링 내용과 같이 보시면 더 도움이 되실 겁니다.

    TrueNAS ZFS 확장 전략을 요약한 인포그래픽 이미지

    추천 확장 방식, 피해야 할 방식, 점검 명령어를 한 장으로 정리한 요약 인포그래픽 이미지가 마무리용으로 잘 어울립니다.