Proxmox VE: ZFS 8k ZVOL 생성 및 PostgreSQL용 VM 디스크 할당 방법

XFS 파일시스템으로 구성된 디스크에서 PostgreSQL 데이터를 관리할 때, 기존 XFS의 블록 크기(16k)와 PostgreSQL의 블록 크기(8k)가 불일치하는 문제가 있습니다. 이를 해결하고 읽기/쓰기 성능을 향상하기 위해, 8k 블록 크기의 zvol을 생성하여 VM에 추가하는 절차를 알아보겠습니다.

아래와 같은 환경입니다.

  • zfs 파일시스템 이름: xfs1
    xfs 파일시스템
  • VM id: 105

  1. VM-105를 정지시킵니다.
    $ qm stop 105
    
  2. zfs파일시스템의 Pool을 확입니다. zfs1에 생성된 디스크를 rpool 위치로 재생성할 예정입니다.
    $ zpool list
    NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
    rpool   370G  22.6G   347G        -         -     6%     6%  1.00x    ONLINE  -
    zfs1   1.81T  62.1G  1.75T        -         -    23%     3%  1.00x    ONLINE  -
    
  3. 기존 디스크 “vm-105-disk-1″를 분리/삭제합니다.
    $ zfs list | grep vm-105
    zfs1/vm-105-disk-0                          3.65G  1.58T  3.65G  -
    zfs1/vm-105-disk-1                            56K  1.58T    56K  -
    
    $ qm set 105 --delete scsi1
    $ qm config 105 | grep unused              # unused0 확인
    $ qm disk unlink 105 --idlist unused0      # 실제 zvol 제거
    $ zfs list | grep vm-105                   # vm-105-disk-1이 사라졌는지 확인
    zfs1/vm-105-disk-0                          3.65G  1.58T  3.65G  -
    
  4. 8K zvol 직접 생성합니다. rpool/는 Proxmox 호스트 OS가 설치/사용하는 디렉토리입니다. Proxmox 호스트 OS를 설치한 물리 디스크가 SSD라 선택했습니다.
    # rpool/data 위치에 vm-105-disk-1 디스크를 생성
    $ zfs create -V 120G -b 8K -s -o compression=lz4 rpool/data/vm-105-disk-1
    
    # 8K / lz4 확인
    $ zfs get volblocksize,compression rpool/data/vm-105-disk-1
    NAME                      PROPERTY      VALUE           SOURCE
    rpool/data/vm-105-disk-1  volblocksize  8K              -
    rpool/data/vm-105-disk-1  compression   lz4             local
    
  5. 생성한 zvol을 VM-105에 부착하고 결과를 확인합니다.
    $ qm set 105 --scsihw virtio-scsi-single
    $ qm set 105 --scsi1 local-zfs:vm-105-disk-1,iothread=1,discard=on,ssd=1,cache=none
    update VM 105: -scsi1 local-zfs:vm-105-disk-1,iothread=1,discard=on,ssd=1,cache=none
    $ zfs list | grep vm-105
    rpool/data/vm-105-disk-1                      56K   336G    56K  -
    zfs1/vm-105-disk-0                          3.65G  1.58T  3.65G  -
    
  6. VM-105를 재기동하고, 설정값을 확인합니다.
    $ qm start 105
    $ qm config 105 | grep scsi1
    scsi1: local-zfs:vm-105-disk-1,cache=none,discard=on,iothread=1,size=120G,ssd=1
    
  7. VM-105에 접속하여 xfs 파일시스템을 구성합니다.
    # SSD드라이브의 쓰기 성능 저하를 방지하고 수명을 연장하기 위해 주기적인 TRIM 작업을 자동화
    $ systemctl enable --now fstrim.timer
    
    # sdb → ROTA=0, PHY-SEC=512 확인
    $ lsblk -o NAME,ROTA,PHY-SEC
    
    # 비어 있는지 먼저 확인
    $ lsblk -f /dev/sdb && blkid /dev/sdb
    NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
    sdb
    
    # xfs 파일시스템 생성
    $ mkfs.xfs -f -s size=4096 -d su=8k,sw=1 /dev/sdb
    meta-data=/dev/sdb               isize=512    agcount=16, agsize=1966080 blks
             =                       sectsz=4096  attr=2, projid32bit=1
             =                       crc=1        finobt=1, sparse=1, rmapbt=0
             =                       reflink=1    bigtime=1 inobtcount=1 nrext64=0
    data     =                       bsize=4096   blocks=31457280, imaxpct=25
             =                       sunit=2      swidth=2 blks
    naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
    log      =internal log           bsize=4096   blocks=16384, version=2
             =                       sectsz=4096  sunit=1 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    Discarding blocks...Done.
    
    # sectsz=4096 확인
    $ xfs_info /dev/sdb | grep -E 'sectsz|bsize|sunit|swidth'   
             =                       sectsz=4096  attr=2, projid32bit=1
    data     =                       bsize=4096   blocks=31457280, imaxpct=25
             =                       sunit=2      swidth=2 blks
    naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
    log      =internal log           bsize=4096   blocks=16384, version=2
             =                       sectsz=4096  sunit=1 blks, lazy-count=1
    
    # PostgreSQL 데이터가 저장되는 /var/lib/pgsql 디렉토리에 파일시스템 마운팅
    $ lsblk -f /dev/sdb
    NAME FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
    sdb  xfs                eb317d41-097e-4c39-ac8f-57ce3bbca41c
    $ UUID=$(blkid -s UUID -o value /dev/sdb)
    $ echo "UUID=$UUID /var/lib/pgsql xfs defaults,noatime,logbsize=256k 0 0" | tee -a /etc/fstab
    UUID=eb317d41-097e-4c39-ac8f-57ce3bbca41c /var/lib/pgsql xfs defaults,noatime,logbsize=256k 0 0
    $ mkdir -p /var/lib/pgsql && sudo mount -a
    $ lsblk -f /dev/sdb
    NAME FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
    sdb  xfs                eb317d41-097e-4c39-ac8f-57ce3bbca41c  119.1G     1% /var/lib/pgsql
    

You may also like...

답글 남기기

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