13년차의 서버실

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

[태그:] ZFS 성능 튜닝

  • [Proxmox] Proxmox ZFS 메모리 사용량 최적화: ARC 캐시 튜닝 전략

    [Proxmox] Proxmox ZFS 메모리 사용량 최적화: ARC 캐시 튜닝 전략

    Proxmox ZFS 메모리 사용량 최적화: ARC 캐시 튜닝 전략

    안녕하세요, 13년차의 서버실입니다. 오늘은 홈랩이나 작은 서버 환경에서 Proxmox VE와 ZFS를 함께 사용하시는 분들이라면 한 번쯤 겪어보셨을 법한, 바로 메모리 사용량 최적화에 대한 이야기를 해볼까 합니다. 특히 ZFS의 ARC 캐시(Adaptive Replacement Cache) 때문에 램이 부족하다고 느끼는 경우가 많으실 텐데요. 제가 직접 여러 번의 삽질 끝에 찾아낸 ZFS 성능 튜닝 전략을 솔직하게 공유해드리겠습니다. 혹시 Proxmox 서버의 램이 항상 꽉 차 있는 것 같아 답답하셨다면, 이 글이 좋은 해결책이 될 거예요!

    Proxmox VE와 ZFS가 메모리를 사용하는 일반적인 아키텍처 다이어그램

    Proxmox VE와 ZFS가 메모리를 사용하는 일반적인 아키텍처 다이어그램입니다. ARC 캐시가 시스템 메모리에 어떻게 자리 잡는지 보여줍니다.

    ZFS ARC 캐시, 너는 누구니?

    ZFS를 사용하면 스토리지 성능을 극대화하기 위해 ARC 캐시(Adaptive Replacement Cache)라는 똑똑한 녀석이 작동합니다. 쉽게 말해, 자주 접근하는 데이터를 메모리에 미리 올려두어 디스크 I/O를 줄이고 속도를 높여주는 역할을 하죠. 웹 서버의 프록시 캐시나 데이터베이스의 버퍼 캐시와 비슷하다고 생각하시면 됩니다.

    근데 여기서 문제가 발생해요. ZFS는 기본적으로 시스템 메모리의 절반까지 ARC 캐시로 사용하도록 설계되어 있거든요. 예를 들어, 32GB 램을 가진 서버라면 ZFS는 최대 16GB를 ARC 캐시로 끌어다 쓸 수 있다는 거죠. 문제는 Proxmox VE 위에 가상머신(VM)이나 컨테이너(LXC)를 여러 개 돌리다 보면, 이 녀석들도 각자 램을 필요로 한다는 겁니다. 결국 ZFS ARC가 너무 많은 램을 차지해서 VM들이 램 부족에 시달리거나, 스왑(Swap)이 발생해서 전체적인 성능 저하로 이어지는 경우가 허다하더라고요. 저도 처음엔 이게 뭔가 싶었는데, 알고 보니 ARC 캐시가 범인이었죠.

    ARC 캐시, 이제 너를 길들이자!

    그럼 이 똑똑하지만 탐욕스러운 ARC 캐시를 어떻게 길들일 수 있을까요? 핵심은 zfs_arc_max라는 커널 파라미터를 조절하는 거예요. 이 값을 통해 ARC 캐시가 사용할 수 있는 최대 메모리 양을 제한할 수 있습니다. 저도 이 값을 찾기 위해 꽤나 삽질을 했었는데, 몇 번의 시행착오 끝에 안정적인 방법을 찾았으니 너무 걱정 마세요!

    단계별로 차근차근 따라 해보시면 돼요. 중요한 건, 자신의 서버 환경과 워크로드를 고려해서 적절한 값을 찾아야 한다는 점이에요. 무작정 너무 낮게 설정하면 오히려 ZFS 성능이 떨어질 수 있으니 주의해야 합니다.

    1. ZFS 모듈 설정 파일 생성 및 수정:
      /etc/modprobe.d/zfs.conf 파일을 만들거나 수정해서 ARC 캐시의 최대 크기를 설정합니다. 저는 보통 최소 1GB, 최대 4GB 정도로 설정해서 사용하고 있어요. 램이 넉넉하다면 더 여유 있게 잡아도 좋고요. 값은 바이트 단위로 입력해야 합니다. 예를 들어 4GB는 4294967296입니다.

      # /etc/modprobe.d/zfs.conf 파일 생성 또는 편집
      sudo nano /etc/modprobe.d/zfs.conf
      
      options zfs zfs_arc_min=1073741824  # 1GB
      options zfs zfs_arc_max=4294967296  # 4GB
      

      위 예시는 ARC 캐시의 최소 크기를 1GB, 최대 크기를 4GB로 제한하는 설정입니다. zfs_arc_min은 ARC 캐시가 최소한으로 유지할 메모리 양을 지정하며, zfs_arc_max는 ARC 캐시가 최대로 사용할 수 있는 메모리 양을 지정해요.

    2. initramfs 업데이트:
      커널 모듈 설정을 시스템에 적용하려면 initramfs를 업데이트해야 합니다. 이 작업은 재부팅 시 ZFS 드라이버가 새로운 설정값을 가지고 로드되도록 해줍니다.

      sudo update-initramfs -u -k all
      
    3. 시스템 재부팅:
      모든 변경 사항을 적용하려면 시스템을 재부팅해야 합니다. 재부팅 후에 새로운 ARC 캐시 설정이 적용돼요.

      sudo reboot
      
    ZFS ARC 캐시 설정을 위해 zfs.conf 파일을 편집하는 터미널 화면

    터미널에서 zfs.conf 파일을 편집하는 모습입니다. 정확한 파라미터 설정을 확인하세요.

    ⚠️ 주의사항 및 트러블슈팅: 제가 겪었던 삽질

    제가 처음 이 설정을 만지면서 겪었던 가장 큰 삽질은 zfs_arc_max 값을 너무 낮게 설정한 거였어요. 제 홈랩 서버는 16GB 램을 사용하고 있었고, Proxmox 위에 VM 몇 개랑 Plex 서버까지 돌리느라 램이 항상 부족했거든요. 그래서 욕심이 과해서 ARC 캐시를 512MB(536870912 바이트)로 확 줄여버렸죠. 결과는요? VM들의 디스크 I/O 성능이 눈에 띄게 저하되고, 특히 ZFS 스토리지에 있는 파일들을 읽어올 때 버벅거림이 심해지더라고요. Plex 서버에서 영화를 재생하는데 계속 끊기는 현상까지 발생해서 멘붕이 왔었습니다. 😭

    이 경험을 통해 깨달은 것은 워크로드에 맞는 적절한 값을 찾는 것이 정말 중요하다는 거예요. 아무리 램이 부족해도, ZFS가 캐시로 쓸 최소한의 공간은 보장해줘야 해요. 저는 결국 1GB ~ 2GB 정도로 다시 설정하고 나서야 안정적인 성능을 되찾을 수 있었습니다.

    만약 설정 후 문제가 발생했다면, /etc/modprobe.d/zfs.conf 파일을 다시 편집해서 options zfs zfs_arc_min=... zfs_arc_max=... 줄을 주석 처리(#)하거나 삭제한 후, 다시 sudo update-initramfs -u -k all 명령을 실행하고 재부팅하면 기본값으로 되돌릴 수 있어요.

    검증 및 결과 확인: 드디어 됐다! 🎉

    설정을 변경하고 재부팅했다면, 이제 제대로 적용되었는지 확인해야겠죠? 다음 명령어를 통해 현재 시스템에 적용된 ARC 캐시의 최대 크기를 확인할 수 있습니다.

    cat /sys/module/zfs/parameters/zfs_arc_max
    cat /sys/module/zfs/parameters/zfs_arc_min
    

    이 명령어로 출력되는 값이 여러분이 zfs.conf 파일에 설정한 바이트 단위의 값과 일치한다면 성공적으로 적용된 거예요! 그리고 실제 ARC 캐시의 동작을 더 자세히 보고 싶다면 arc_summary 도구를 사용해보세요. 이 도구는 ZFS ARC 캐시의 상세 통계를 보여줍니다. arc_summary는 zfsutils-linux 또는 zfs-initramfs 패키지에 포함되어 있는데, 설치되어 있지 않다면 다음 명령으로 설치할 수 있습니다.

    sudo apt install zfsutils-linux
    
    arc_summary
    

    arc_summary 출력에서 ARC Size와 Min Size, Max Size 항목을 보면 현재 ARC 캐시가 얼마나 사용되고 있고, 설정된 제한 범위는 얼마인지 한눈에 파악할 수 있어요. 💡 팁: arc_summary를 정기적으로 모니터링하면서, 실제 워크로드에 따라 Max Size에 가까워지는지, 아니면 여유가 있는지 확인해보세요. 만약 Max Size에 항상 도달해있는데도 시스템 성능이 만족스럽지 않다면, 조금 더 여유를 주는 방향으로 zfs_arc_max 값을 늘려볼 수도 있습니다.

    arc_summary 명령어를 통해 ZFS ARC 캐시 사용량과 설정된 최대값을 확인하는 화면

    arc_summary 명령어 실행 결과 화면입니다. ARC 캐시의 현재 사용량과 설정된 최대/최소값을 확인할 수 있습니다.

    ARC 캐시 튜닝 가이드라인

    어떤 값을 설정해야 할지 고민이신 분들을 위해, 제가 경험했던 상황별 가이드라인을 표로 정리해봤습니다. 물론 절대적인 기준은 아니지만, 시작점으로 삼기에는 충분할 거예요.

    서버 환경/용도 전체 시스템 RAM 권장 zfs_arc_max (예시) 추가 고려사항
    홈랩/NAS (가벼운 VM, 파일 공유) 8GB ~ 16GB 2GB ~ 4GB VM에 할당할 램을 우선 고려하고, 파일 I/O가 아주 빈번하지 않다면 낮게 설정.
    미디어 서버 (Plex, Jellyfin) 16GB ~ 32GB 4GB ~ 8GB 대용량 미디어 파일 스트리밍이 많으므로, 캐시를 충분히 확보하여 I/O 부하 감소.
    경량 개발/테스트 서버 (VM 다수) 32GB 이상 8GB ~ 16GB VM 개수와 각 VM의 램 할당량을 기준으로, 남는 램을 ARC에 배분.
    고성능 스토리지 서버 (DB, IOPS 중요) 64GB 이상 전체 램의 1/4 ~ 1/2 ZFS 본연의 성능을 최대로 활용하기 위해 충분한 ARC 할당. VM 램과 균형 중요.
    Proxmox ZFS ARC 캐시 튜닝의 이점과 모범 사례를 요약한 인포그래픽

    ZFS ARC 캐시 튜닝의 주요 이점과 모범 사례를 요약한 인포그래픽입니다.

    마무리하며: 나에게 맞는 최적의 값을 찾아서!

    Proxmox ZFS 환경에서 메모리 사용량 최적화는 단순히 램을 아끼는 것을 넘어, 전체 시스템의 안정성과 성능에 직접적인 영향을 미치는 중요한 작업입니다. zfs_arc_max 값을 튜닝함으로써 ZFS ARC 캐시가 과도하게 메모리를 점유하는 것을 막고, 가상머신이나 다른 서비스들이 충분한 리소스를 확보할 수 있도록 도울 수 있어요.

    제가 겪었던 삽질처럼 너무 극단적인 값으로 설정하기보다는, 위에서 제시된 가이드라인을 참고하여 자신의 워크로드와 서버 사양에 맞는 최적의 값을 찾아가는 과정이 필요합니다. 처음에는 조금 어렵게 느껴질 수 있지만, 몇 번의 시도와 모니터링을 통해 분명 만족스러운 결과를 얻으실 수 있을 거예요. 궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 다음에는 ZFS 성능 모니터링 도구들에 대해 좀 더 자세히 다뤄볼까 합니다. 다음에 또 만나요! 👋