• 돌아가기
  • 아래로
  • 위로
  • 목록
  • 댓글

Proxmox에서 ZFS를 활용하는 방법

eyeball 1775

16

14

여기 서버포럼에는 헤놀과 같은 개인 NAS와 간단한 서비스를 다루시는 분들이 대부분인 것 같지만, 가끔씩 문자 그대로 홈랩을 꾸려서 개인 스터디나 프로젝트를 운영하시는 분도 보이고 스타트업 같은 곳에서 홀로 고군분투 하시는 분도 계시는 것 같아 나름대로 제가 활용하는 방식과 경험을 공유해보고자 합니다.

 

일단 현재 제가 하고 있는 일은 개발환경 인프라 전반에 대한 구축과 운영 관리입니다. 온갖 실험용 프로젝트와 알 수 없는 무언가가 잔뜩 생겼다가 사라지는 것을 전부 케어해야 하지요. 한정된 자원에서 어떻게든 쥐어짜내어 공간과 성능을 끌어내야 하다보니 많은 고민을 하게 되고 그 중 가장 큰 골칫거리가 바로 스토리지 문제입니다.

 

CPU와 메모리는 사실 개발환경이라면 감수할 만 합니다. CPU 로드 천장 쳐서 느리면 좀 기다리면 되고, 메모리는 KSM으로 중복제거 되는 양이 제법 되고 지금 안 쓰는 VM은 내리면 되기 때문에 관리적인 스킬로 해결이 됩니다.

 

하지만 데이터는 어떻게 처리하기가 난감하지요. 언제 다시 쓸지 모르는데 그때마다 백업 했다 복원했다 하기도 어렵고, 시간도 오래 걸리고, 용량증설 하자니 돈 먹는 하마인데 SSD라면 더욱더 부담이죠.

그래서 저는 이 문제를 해결하기 위해 ZFS를 적극적으로 활용하는 편입니다.

 

ZFS는 아시는 분은 아시겠지만 파일시스템 계의 끝판왕이라고 불리는 녀석입니다. 하지만 그렇다고 만능은 아니고 다루기도 까다로운 녀석이기 때문에 그냥 좋다고 하니까 좋은가보다 하고 쓰시면 오히려 ext4 보다 못한 성능이 나옵니다. ZFS는 철저히 엔터프라이즈 환경을 위해 나온 파일시스템이고 목적에 맞게 알맞게 튜닝이 필요합니다.

 

 

 

그래도 일단 ZFS를 쓰면 뭐가 어떻게 좋은지 알아야 쓰던 말던 할테니 이번에 적용한 사례를 하나 소개해드리겠습니다.

 

개발팀에서 자체적으로 PC에 리눅스 깔고 돌리던 서버를 개발서버에 이관요청이 들어왔습니다. 해당 서버는 Oracle 11g를 사용하고 도커로 톰켓 3개와 nginx가 돌고 있는 시스템입니다. 그리고 4TB HDD에 DB 데이터가 약 3.3TB가 들어있죠

 

해당 서버를 이관하기 위에 다음과 같은 VM을 생성했습니다.

pve_vm.png.jpg

scsi0은 OS 및 APP 구동용, scsi1은 L2ARC용, scsi2는 데이터 디스크입니다.

local-lvm은 nvme ssd이고 ceph-hdd는 일전에 구축했던 공유 스토리지죠.

 

 

여기에 해당 PC서버에 있던 서비스와 데이터를 전부 이관했습니다. 그리고 비교를 위해 다음과 같은 순서로 구성을 진행했습니다.

 

1. data 볼륨을 ext4로 구성 후 데이터 이관

2. DB 기동 후 업무에서 실제 사용하는 대용량 조회 쿼리 실행 후 시간과 자원 소모량 측정

3. ext4 볼륨을 날리고 zfs로 구성 후 데이터 이관

4. 2번 항목 반복

 

ZFS 데이터셋 옵션은 오라클 공식 가이드 문서를 참고해서 아래와 같이 구성했습니다.

 

- 4TB 싱글 디스크 풀

- NVME SSD 30GB L2ARC 추가

- ARC 메모리 8GB 할당

- ashift 12, recordsize 8k, zstd 압축

 

 

 

일단 가장 먼저 체감할 수 있는 부분은 바로 용량입니다.

ext4

ext4_df.png.jpg

zfs

zfs_df.png.jpg

사용 용량이 3.3TB에서 479GB로 무려 2.8TB나 감소했습니다.

 

zfs_status.png.jpg

압축률이 7x나 되네요. zstd의 공식 압축성능은 2.88x지만 텍스트가 대부분인 DB데이터 특성 상 공백과 중복 문자열이 많기 때문에 압축효율이 급격히 높아집니다. 거기에 오라클을 비롯한 DB들은 미리 설정된 용량만큼 선할당된 파일을 사용하기 때문에 1GB의 파일 안에 실제 데이터는 1MB만 들어있을 수도 있죠. 이런 부분들이 전부 압축되어 용량을 확보할 수 있게 됩니다.

 

 

다음은 성능입니다.

성능 측정은 fio 같은 벤치마크 툴을 이용해 숫자로 비교하기 보단 그냥 확실하게 응용 프로그램을 구동해서 측정해봤습니다. 캐시가 적용 안 된 깡성능을 측정하기 위애 재부팅 후 바로 DB 기동 뒤 idle 상태까지 기다렸다가 실제 업무에서 사용하는 조회 쿼리를 날려봤습니다.

ext4

zfs_query.png.jpg

zfs

ext4_query.png.jpg

캐시가 적용되지 않은 깡성능으로도 3배가 넘는 속도를 보여줍니다. 이게 가능한 이유는 디스크에서 읽는 속도는 동일하지만 압축이 해제되면서 실제로 읽어들이는 데이터가 뻥튀기 되기 때문입니다.

zfs.png.jpg

OS에서 인식하는 속도를 보여주는 iotop 명령어와 ZFS에서 처리하는 실제 속도를 보여주는 zpool iostat 명령어를 비교한 모습입니다. ZFS에서는 23MB/s의 속도로 읽고 있지만 OS는 173MB/s의 속도로 읽는 것으로 인식하고 있습니다.

 

 

하지만 압축과 해제를 하기 위해 CPU 사용량은 조금 오르는 편인데요.

ext4

ext4_graph.png.jpg

zfs

zfs_graph.png.jpg

ext4 대비 약 10% 정도 사용량이 증가하는 모습을 보여줍니다. 하지만 어차피 평소에도 놀고있는 CPU에 10%정도 일 시키고 3배의 성능을 얻는다면 남는 장사죠

 

이 외에도 arc와 l2arc 캐시를 통한 읽기성능 향상과 스냅샷을 이용한 백업과 복원 등 많은 활용방법이 있습니다.

이렇듯 목적을 가지고 그에 알맞게 사용하면 엄청난 효율과 성능을 보여줍니다. 물론 그만큼 어렵기 때문에 공부가 필요하지만요.

 

 

서론이 길었습니다. 그래서 Proxmox에서 ZFS를 어떤 식으로 써야 좋은걸까요?

일단 여기 계신 대부분의 분들의 여건일 것이라 생각되는 단일서버 혹은 Proxmox + NAS 조합으로 추천을 드리자면

 

- NVME SSD, ZFS : Proxmox 설치 및 VM OS 디스크용, 미러 구성은 여건에 따라.

- [옵션]SATA SSD, ZFS : VM OS 및 앱 구동용, 미러 구성은 여건에 따라.

- SATA HDD, LVM-Thin : 데이터용, 레이드 1, 10 혹은 5, 50. NAS에서 NFS나 iSCSI로 붙여도 무방

 

머신런닝이나 빅데이터, 혹은 대용량 로그가 발생하는 서비스를 개발, 운영하신다면 좋은 구성입니다. 사실 저런 셋팅이 필요하신 분들은 이런 분들이 대부분이지요.

개발자분들이 OS 까지 다루기는 쉽지 않기 때문에 VM에 ZFS로 부팅볼륨까지 잡기엔 난이도가 조금 있습니다. 하지만 Proxmox는 설치할 때 간편하게 ZFS로 설치할 수 있고 그 스토리지에 VM을 생성하면 게스트 OS에 손 대지 않고도 Proxmox에서 제공하는 ZFS를 통해 동일한 효과를 얻을 수 있습니다. 물론 ZFS를 지원하지 않는 윈도우에서도 마찬가지입니다.

 

데이터용 스토리지에는 LVM-Thin을 적용하는 이유는 크게 두 가지 인데요.

첫번째는 RAID5(RAIDZ) 때문입니다.

ZFS에서 VM용 디스크를 생성하는 것은 ZVOL인데 레이드5에서는 패리티비트용 용량을 추가로 필요하기 때문에 이미 레이드5에서 디스크 1개분을 손해본 것에 더해 설정한 용량에 비례하여 추가로 손해를 봅니다. 이를 최소화 하려면 블록사이즈를 늘려야 하는데 Proxmox 자체 기능으론 지원하지 않아 명령어를 이용해야 하고 블록사이즈를 늘린다면 랜덤 I/O에서 성능하락이 있기도 하고 그렇다고 완벽하게 해결이 되는 것도 아닙니다. 물론 이 문제는 레이드 1이나 0을 사용하면 발생하지 않습니다.

 

두번째는 옵션 튜닝입니다.

깊게 들어갈 것 없이 랩 수준에서 튜닝할 만한 것은 L2ARC와 블록사이즈 정도입니다. L2ARC는 ZFS 풀에 SSD를 읽기 캐시로 사용하는 것인데요. 특성에 따라 이 캐시가 필요 없을 수도. 별도 디스크를 추가해서라도 대용량으로 필요할 수도 있는데 Proxmox에서 캐시를 일괄 적용해버리면 비싼 SSD를 효율적으로 분배가 어렵겠지요.

그리고 블록사이즈는 늘릴 수록 순차 I/O 성능이 증가하고 압축률이 증가하며 줄이면 랜덤 I/O 성능이 증가합니다. 그리고 오라클과 같은 DBMS는 사용하는 블록사이즈가 따로 있기 때문에 스펙에 맞게 ZFS의 블록사이즈를 일치시켜주면 성능이 향상됩니다. 이것도 마찬가지로 Proxmox에서 일괄적용 해버리면 튜닝을 할 수가 없지요.

 

때문에 Proxmox에서 데이터 스토리지는 LVM-Thin으로 구성하고 게스트 OS에 ZFS를 설치하여 데이터 볼륨만 사용하는 방식이 셋팅과 관리가 용이합니다. 백업도 VM 내에서 ZFS를 사용해도 좋지만 Proxmox에도 스냅샷 백업을 지원하고 PBS라는 좋은 백업서버도 있으니 이것을 적극 활용하는 편이 낫습니다.

 

그리고 번외로 영상과 3D를 주로 다루시는 분은 ZFS를 쓰기보단 그냥 풀 SSD 구성으로 셋팅하시는 것이 낫습니다. 영상은 이미 압축이 되어있기 때문에 추가적인 공간 확보를 기대할 수도 없고 대용량 단일 파일들이라 캐시빨도 비교적 적게 받습니다.

 

 

읽기 힘들게 너무 장문의 글이 되어버렸네요. 그래도 누군가에게는 도움이 되었기를 바랍니다.

신고공유스크랩
14
1등
콜라 2023.04.05. 21:44
zstd가 성능이 엄청 좋더군요..
저는 btrfs에 zstd 선호합니다.
zfs는 쓰기 캐시가 꽤 작아요..ㅠㅠ
읽기는 훨씬 좋은데 쓰기가 그렇게 좋지 않아요.ㅠ
eyeball 글쓴이 2023.04.05. 21:59
콜라

저도 단순 저장용 스토리지에는 btrfs에 zstd를 사용합니다. 관리가 더 편하거든요 ㅎㅎ
서비스가 돌아가는 파일시스템은 쓰기보다는 읽기 성능이 더 중요하기 때문에 아직은 zfs를 쓰는 편입니다.

그리고 쓰기캐시가 큰 것이 썩 좋은것만은 아니에요.. 그게 다 장애와 데이터 크래시의 요소거든요..

콜라 2023.04.05. 22:21
eyeball
음.. 관리 면에서 zfs가 더 편하지 않나요?
btrfs는 서브볼륨과 파일이 구분되지 않아서 너무 어렵더라구요..
eyeball 글쓴이 2023.04.05. 22:36
콜라
음.. 제가 말하는 관리는 단일 서버나 해당 풀에 국한된 것이 아니라 인프라 전체를 놓고 보는 관점이라...
서비스용 백업 및 잡무용 시스템을 구분해서 서비스용 시스템에는 ZFS를 사용하고 백업스토리지나 삼바 공유폴더용 시스템은 그냥 생각 없이 막 쓰는 편입니다.
제가 아직 기능을 다 모르는 것 때문일 수도 있지만 btrfs는 딱히 튜닝할만한 것이 없어서 마음이 편하거든요 ㅎㅎ
콜라 2023.04.06. 07:32
eyeball
아.. 그건 맞는것 같아요.
open zfs도 리눅스로 포팅된지 5년 이상 되었는데도 아직도 뭔가 하려고 하면 튜닝이 많이 필요하더라구요.ㅠㅠ
매우 공감합니다.
DarkAcid 2023.04.06. 00:19
저도 10번은 읽어봐야겠어요! 사실 체감상 ZFS와 LVM-thin을 구별하기 쉽지 않아서 램을 적게먹는 LVM으로 구성했는데 ZFS읽어보니 보전해보고싶은 욕구도 듭니다!
우아아아앙 2023.04.06. 17:41
"scsi0은 OS 및 APP 구동용, scsi1은 L2ARC용, scsi2는 데이터 디스크입니다."
L2ARC 및 SLOG SSD를 RDM이나 패스쓰루 하지 않고, 가상화 DISK로 용량을 쪼개서 진행 하셨나요 ?

Truenas에서 쓸려면 정장 장치의 원시데이터에 접근일 필수인 줄 알았는데,
일반 HDD는 RDM으로 붙이고, L2ARC 및 SLOG는 가상화 DISK로 붙여 봐야겠습니다.

하나씩 배워 갑니다. ㅎㅎ
감사합니다.
eyeball 글쓴이 2023.04.06. 18:30
우아아아앙

네 l2arc와 slog는 호스트에서 가상디스크 생성 해서 사용했습니다. 물론 데이터 디스크도 마찬가지구요
ZFS에서 원시데이터에 접근 하지 못하더라도 기능이 작동 못 하는 것은 아닙니다.
원시데이터에 대한 접근이 필요한 이유는 궁극적으로는 Disk fail에 대한 보정과 안정성 확보인 측면이 크거든요.
캐시와 로그는 날아가도 상관 없는 장치이고 게다가 Disk fail에 대한 것은 호스트에서 보장해 주고 있으니 싱글디스크와 연산부하가 적은 스프라이트 까지는 가상디스크로도 별 상관이 없습니다. AWS나 에저에서 ZFS 사용하는 방식도 대부분 이런식입니다.
다만 raidz의 경우는 패리티비트 연산이 들어가기 때문에 일말의 불안감이 남아있어서 저는 미러, 스프라이트까지만 가상디스크로 사용하고 raidz는 hba카드로 패스스루 하여 사용하고 있습니다.

테루 2023.12.02. 22:18
굉장한 글이네요!! 여러번 읽어도 전부 이해되지는 않지만 흥미롭고 재미있게 읽었습니다 ㅋ

너무 진지하게 읽어서 였는지 "CPU 로드 천장 쳐서 느리면" 이라는 의미를 심각하게 해석하다가 뒤늦게 웃었네요 ㅋㅋ

댓글 쓰기 권한이 없습니다. 로그인

취소 댓글 등록

cmt alert

신고

"님의 댓글"

이 댓글을 신고하시겠습니까?

댓글 삭제

"님의 댓글"

삭제하시겠습니까?


목록

공유

facebooktwitterpinterestbandkakao story
번호 분류 제목 글쓴이 날짜 조회 추천
잡담 Ubuntu 24 가 정식출시되었습니다~~ 2 달소 3시간 전10:37 119 +1
가이드 Proxmox 설치시 [ERROR] no device with valid ISO found 해결방법 3 달소 15시간 전23:10 66 +1
정보 proxmox/debian 레포 변경사항 (N: Repository 'Debian bookworm' changed its 'non-free component' value from 'non-free' to 'non-free non-free-firmware') 1 달소 1일 전08:21 159 +1
3863 잡담
image
달소 3시간 전10:37 120 +1
3862 가이드
image
달소 15시간 전23:10 67 +1
3861 가이드
image
달소 15시간 전22:54 68 0
3860 질문
normal
감자칩 19시간 전18:56 182 0
3859 질문
image
게르노 22시간 전16:08 62 0
3858 질문
image
동도리군 1일 전12:14 86 0
3857 정보
image
달소 1일 전08:21 159 +1
3856 잡담
image
달소 1일 전07:46 275 +1
3855 가이드
image
달소 1일 전07:24 240 0
3854 질문
normal
서버구축하자 2일 전13:09 399 0
3853 질문
image
미스터빈 2일 전20:09 216 0
3852 질문
image
초보나스 3일 전08:05 261 +1
3851 질문
normal
웹서버구축관심 4일 전02:22 325 0
3850 잡담
normal
달소 4일 전23:39 215 +2
3849 질문
normal
게르노 5일 전03:11 200 0
3848 질문
image
감자칩 5일 전20:04 295 0
3847 질문
normal
ljr10 5일 전19:45 210 0
3846 질문
image
TANG 6일 전11:33 239 0
3845 질문
normal
감자칩 6일 전18:55 155 0
3844 질문
normal
숲형 24.04.19.11:21 279 0