laporan penggunaan ruang disk ZFS yang aneh untuk ZVOL

8

Kami memiliki 100G ZVOL pada host FreeBSD 10.0-CURRENT yang mengklaim menggunakan ruang disk 176G:

root@storage01:~ # zfs get all zroot/DATA/vtest
NAME              PROPERTY              VALUE                  SOURCE
zroot/DATA/vtest  type                  volume                 -
zroot/DATA/vtest  creation              Fri May 24 20:44 2013  -
zroot/DATA/vtest  used                  176G                   -
zroot/DATA/vtest  available             10.4T                  -
zroot/DATA/vtest  referenced            176G                   -
zroot/DATA/vtest  compressratio         1.00x                  -
zroot/DATA/vtest  reservation           none                   default
zroot/DATA/vtest  volsize               100G                   local
zroot/DATA/vtest  volblocksize          8K                     -
zroot/DATA/vtest  checksum              fletcher4              inherited from zroot
zroot/DATA/vtest  compression           off                    default
zroot/DATA/vtest  readonly              off                    default
zroot/DATA/vtest  copies                1                      default
zroot/DATA/vtest  refreservation        none                   local
zroot/DATA/vtest  primarycache          all                    default
zroot/DATA/vtest  secondarycache        all                    default
zroot/DATA/vtest  usedbysnapshots       0                      -
zroot/DATA/vtest  usedbydataset         176G                   -
zroot/DATA/vtest  usedbychildren        0                      -
zroot/DATA/vtest  usedbyrefreservation  0                      -
zroot/DATA/vtest  logbias               latency                default
zroot/DATA/vtest  dedup                 off                    default
zroot/DATA/vtest  mlslabel                                     -
zroot/DATA/vtest  sync                  standard               default
zroot/DATA/vtest  refcompressratio      1.00x                  -
zroot/DATA/vtest  written               176G                   -
zroot/DATA/vtest  logicalused           87.2G                  -
zroot/DATA/vtest  logicalreferenced     87.2G                  -
root@storage01:~ # 

Ini terlihat seperti bug, bagaimana bisa mengkonsumsi lebih dari itu volsizejika tidak memiliki snapshot, pemesanan dan anak-anak? Atau mungkin kita kehilangan sesuatu?

Pembaruan:

Hasil dari zpool status -v:

root@storage01:~ # zpool status -v
  pool: zroot
 state: ONLINE
  scan: scrub repaired 0 in 0h6m with 0 errors on Thu May 30 05:45:11 2013
config:

        NAME           STATE     READ WRITE CKSUM
        zroot          ONLINE       0     0     0
          raidz2-0     ONLINE       0     0     0
            gpt/disk0  ONLINE       0     0     0
            gpt/disk1  ONLINE       0     0     0
            gpt/disk2  ONLINE       0     0     0
            gpt/disk3  ONLINE       0     0     0
            gpt/disk4  ONLINE       0     0     0
            gpt/disk5  ONLINE       0     0     0
        cache
          ada0s2       ONLINE       0     0     0

errors: No known data errors
root@storage01:~ # 

Hasil dari zpool list:

root@storage01:~ # zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
zroot  16.2T   288G  16.0T     1%  1.05x  ONLINE  -
root@storage01:~ # 

Hasil dari zfs list:

root@storage01:~ # zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
zroot                           237G  10.4T   288K  /
zroot/DATA                      227G  10.4T   352K  /DATA
zroot/DATA/NFS                  288K  10.4T   288K  /DATA/NFS
zroot/DATA/hv                  10.3G  10.4T   288K  /DATA/hv
zroot/DATA/hv/hv001            10.3G  10.4T   144K  -
zroot/DATA/test                 288K  10.4T   288K  /DATA/test
zroot/DATA/vimage              41.3G  10.4T   288K  /DATA/vimage
zroot/DATA/vimage/vimage_001   41.3G  10.5T  6.47G  -
zroot/DATA/vtest                176G  10.4T   176G  -
zroot/SYS                      9.78G  10.4T   288K  /SYS
zroot/SYS/ROOT                  854M  10.4T   854M  /
zroot/SYS/home                 3.67G  10.4T  3.67G  /home
zroot/SYS/tmp                   352K  10.4T   352K  /tmp
zroot/SYS/usr                  4.78G  10.4T   427M  /usr
zroot/SYS/usr/local             288K  10.4T   288K  /usr/local
zroot/SYS/usr/obj              3.50G  10.4T  3.50G  /usr/obj
zroot/SYS/usr/ports             895K  10.4T   320K  /usr/ports
zroot/SYS/usr/ports/distfiles   288K  10.4T   288K  /usr/ports/distfiles
zroot/SYS/usr/ports/packages    288K  10.4T   288K  /usr/ports/packages
zroot/SYS/usr/src               887M  10.4T   887M  /usr/src
zroot/SYS/var                   511M  10.4T  1.78M  /var
zroot/SYS/var/crash             505M  10.4T   505M  /var/crash
zroot/SYS/var/db               1.71M  10.4T  1.43M  /var/db
zroot/SYS/var/db/pkg            288K  10.4T   288K  /var/db/pkg
zroot/SYS/var/empty             288K  10.4T   288K  /var/empty
zroot/SYS/var/log               647K  10.4T   647K  /var/log
zroot/SYS/var/mail              296K  10.4T   296K  /var/mail
zroot/SYS/var/run               448K  10.4T   448K  /var/run
zroot/SYS/var/tmp               304K  10.4T   304K  /var/tmp
root@storage01:~ # 

Pembaruan 2:

Kami membuat sejumlah ZVOL dengan parameter berbeda dan digunakan dduntuk memindahkan konten. Kami memperhatikan hal aneh lainnya, penggunaan disk adalah normal untuk ZVOL dengan 16k dan 128k volblocksizedan tetap tidak normal untuk ZVOL dengan 8k volblocksizebahkan setelah dd(jadi ini bukan masalah fragmentasi):

root@storage01:~ # zfs get all zroot/DATA/vtest-3
NAME                PROPERTY              VALUE                  SOURCE
zroot/DATA/vtest-3  type                  volume                 -
zroot/DATA/vtest-3  creation              Fri May 31  7:35 2013  -
zroot/DATA/vtest-3  used                  201G                   -
zroot/DATA/vtest-3  available             10.2T                  -
zroot/DATA/vtest-3  referenced            201G                   -
zroot/DATA/vtest-3  compressratio         1.00x                  -
zroot/DATA/vtest-3  reservation           none                   default
zroot/DATA/vtest-3  volsize               100G                   local
zroot/DATA/vtest-3  volblocksize          8K                     -
zroot/DATA/vtest-3  checksum              fletcher4              inherited from zroot
zroot/DATA/vtest-3  compression           off                    default
zroot/DATA/vtest-3  readonly              off                    default
zroot/DATA/vtest-3  copies                1                      default
zroot/DATA/vtest-3  refreservation        103G                   local
zroot/DATA/vtest-3  primarycache          all                    default
zroot/DATA/vtest-3  secondarycache        all                    default
zroot/DATA/vtest-3  usedbysnapshots       0                      -
zroot/DATA/vtest-3  usedbydataset         201G                   -
zroot/DATA/vtest-3  usedbychildren        0                      -
zroot/DATA/vtest-3  usedbyrefreservation  0                      -
zroot/DATA/vtest-3  logbias               latency                default
zroot/DATA/vtest-3  dedup                 off                    default
zroot/DATA/vtest-3  mlslabel                                     -
zroot/DATA/vtest-3  sync                  standard               default
zroot/DATA/vtest-3  refcompressratio      1.00x                  -
zroot/DATA/vtest-3  written               201G                   -
zroot/DATA/vtest-3  logicalused           100G                   -
zroot/DATA/vtest-3  logicalreferenced     100G                   -
root@storage01:~ # 

dan

root@storage01:~ # zfs get all zroot/DATA/vtest-16
NAME                 PROPERTY              VALUE                  SOURCE
zroot/DATA/vtest-16  type                  volume                 -
zroot/DATA/vtest-16  creation              Fri May 31  8:03 2013  -
zroot/DATA/vtest-16  used                  102G                   -
zroot/DATA/vtest-16  available             10.2T                  -
zroot/DATA/vtest-16  referenced            101G                   -
zroot/DATA/vtest-16  compressratio         1.00x                  -
zroot/DATA/vtest-16  reservation           none                   default
zroot/DATA/vtest-16  volsize               100G                   local
zroot/DATA/vtest-16  volblocksize          16K                    -
zroot/DATA/vtest-16  checksum              fletcher4              inherited from zroot
zroot/DATA/vtest-16  compression           off                    default
zroot/DATA/vtest-16  readonly              off                    default
zroot/DATA/vtest-16  copies                1                      default
zroot/DATA/vtest-16  refreservation        102G                   local
zroot/DATA/vtest-16  primarycache          all                    default
zroot/DATA/vtest-16  secondarycache        all                    default
zroot/DATA/vtest-16  usedbysnapshots       0                      -
zroot/DATA/vtest-16  usedbydataset         101G                   -
zroot/DATA/vtest-16  usedbychildren        0                      -
zroot/DATA/vtest-16  usedbyrefreservation  886M                   -
zroot/DATA/vtest-16  logbias               latency                default
zroot/DATA/vtest-16  dedup                 off                    default
zroot/DATA/vtest-16  mlslabel                                     -
zroot/DATA/vtest-16  sync                  standard               default
zroot/DATA/vtest-16  refcompressratio      1.00x                  -
zroot/DATA/vtest-16  written               101G                   -
zroot/DATA/vtest-16  logicalused           100G                   -
zroot/DATA/vtest-16  logicalreferenced     100G                   -
root@storage01:~ # 
Alex
sumber
Kami menduga ini bisa menjadi fragmentasi tetapi kami tidak tahu bagaimana membuktikannya
Alex
Mungkinkah itu terkait dengan snapshot?
Steve Wills
Tidak, kami tidak memiliki snapshot apa pun dalam buku ini
Alex
Sedih ketika saya melihat kompresi dinonaktifkan pada volume / sistem file ZFS. Lagi pula, dapatkah Anda memposting zpool status -vdan zpool listdan zfs list?
ewwhite
1
Dari semua yang saya lihat di ini, sepertinya ada bug. 'Penggunaan' zvol dengan volume 100G tidak boleh melebihi 100G melewati jika tidak ada anak atau reservasi atau sejenisnya. Mungkin itu sebenarnya 200+ GB volsize dan Anda mengubah parameter volsize? Jika tidak, FreeBSD-10.0 belum merupakan rilis produksi; mengajukan bug dengan mereka.
Nex7

Jawaban:

2

VOLSIZE menunjukkan ukuran volume yang akan dilihat oleh klien, bukan ukuran volume yang disimpan di pool.

Perbedaan ini dapat berasal dari berbagai sumber:

  • ruang yang dibutuhkan untuk metadata
  • ruang yang dibutuhkan untuk menyimpan banyak salinan (parameter "salinan")
  • "ruang terbuang" karena bantalan sementara menyelaraskan blok ukuran "volblocksize" ke struktur vdev; oleh struktur vdev maksud saya dua parameter: jumlah disk di raidz-N, dan ukuran blok fisik perangkat.

Saat membuat volume, zfs akan memperkirakan berapa banyak ruang yang perlu digunakan untuk dapat menyajikan volume "volsize" kepada kliennya. Anda dapat melihat bahwa perbedaan dalam volume vtest-16 dan vtest-3 (di mana refreservasi 102GB dan volsize 100GB). Perhitungannya dapat ditemukan di libzfs_dataset.c (zvol_volsize_to_reservation (uint64_t volsize, nvlist_t * props))

Apa yang tidak diperhitungkan dengan perhitungan itu adalah sumber ketiga. Sumber ketiga memiliki dampak kecil pada vdev yang dibuat dengan disk yang memiliki sektor 512 byte. Dari percobaan saya (saya telah menguji bahwa dengan mengisi seluruh zvol untuk memeriksanya) itu benar-benar membuat perbedaan ketika vdev dibuat pada disk sektor 4K yang lebih baru.

Hal lain yang saya temukan dalam eksperimen saya adalah memiliki mirror tidak menunjukkan perbedaan antara refreservasi yang dihitung dan apa yang akhirnya digunakan.

Ini adalah hasil saya ketika menggunakan drive 4K dengan volume yang memiliki volblocksize default (8K). Kolom pertama menunjukkan jumlah disk dalam vdev:

    raidz1  raidz2
3   135%    101%
4   148%    148%
5   162%    181%
6   162%    203%
7   171%    203%
8   171%    217%
9   181%    232%
10  181%    232%
11  181%    232%
12  181%    232%

Ini adalah hasil saya ketika menggunakan drive sektor 512 byte dan volblocksize default 8K. Kolom pertama menunjukkan jumlah disk dalam vdev:

    raidz1  raidz2
3   101%    101%
4   104%    104%
5   101%    113%
6   105%    101%
7   108%    108%
8   110%    114%
9   101%    118%
10  102%    106%
11  103%    108%
12  104%    110%

Kesimpulan saya adalah sebagai berikut:

  • Jangan gunakan drive 4K
  • Jika Anda benar-benar perlu menggunakannya, buat volume menggunakan volblocksize lebih besar dari atau sama dengan 32K; Ada dampak kinerja yang dapat diabaikan, dan overhead penggunaan ruang yang dapat diabaikan (ukuran blok yang lebih besar membutuhkan lebih sedikit bantalan untuk menyelaraskan dengan benar).
  • Lebih suka garis-garis cermin untuk kolam Anda; Tata letak ini memiliki manfaat kinerja dan lebih sedikit kejutan terkait ruang seperti ini.
  • Estimasi ini jelas salah untuk kasus-kasus yang diuraikan di atas, dan ini adalah bug di zfs.
Dan Vatca
sumber
2
Menggunakan drive 4k di kumpulan ashift=9diketahui menyebabkan masalah. Ini bukan hal baru. Mengubah ukuran blok juga tidak menyelaraskan drive. Solusi yang benar adalah membuat kolam dengan ashift=12.
Chris S
ashift=12pada 4K drive tidak menyelesaikan ini; pada kenyataannya, pada zpool dengan ashift=12, 5 buah drive 4K dan raidz, ruang yang dikonsumsi dekat dengan yang disebutkan di atas, misalnya volume 7T mengkonsumsi 11T.
drookie
-1

Jika saya membaca ini dengan benar, Anda sebenarnya memiliki logicalreferenced87,6 GB data pada volume. Angka 170 GB yang Anda lihat adalah seberapa banyak ruang fisik yang digunakan data. Jadi jika Anda memiliki drive Anda dicerminkan, saya harapkan referencedsekitar 2x logicalreferenced.

leher panjang
sumber
Hmm, FS lain di pool yang sama memiliki referenced 3.50Gdan logicalreferenced 3.00Grasio 2x tidak konsisten di antara FSe di pool.
Alex
Dan omong-omong kolam renang raidz2, bukan cermin biasa
Alex
Ya, saya baru saja melakukan beberapa tes cepat pada VM dan teori saya tidak bertahan.
longneck