Sistem file kompresi transparan dalam hubungannya dengan ext4

26

Saya mencoba untuk menguji proyek yang memerlukan penyimpanan terkompresi dengan menggunakan sistem file ext4 karena aplikasi yang saya gunakan bergantung pada fitur-fitur ext4.

Apakah ada solusi produksi / stabil di luar sana untuk kompresi transparan pada ext4?

Apa yang saya coba:

Ext4 lebih dari volume ZFS dengan kompresi diaktifkan. Ini sebenarnya memiliki dampak buruk. Saya mencoba membuat volume ZFS dengan kompresi lz4 diaktifkan dan membuat sistem file ext4 di / dev / zvol / ... tetapi volume zfs menunjukkan dua kali lipat penggunaan aktual dan kompresi tampaknya tidak berpengaruh.

# du -hs /mnt/test
**1.1T**    /mnt/test
# zfs list
NAME        USED  AVAIL  REFER  MOUNTPOINT
pool       15.2T  2.70G   290K  /pool
pool/test  15.2T  13.1T  **2.14T**  -

Perintah Pembuatan ZFS

zpool create pool raidz2 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde2 /dev/sdf1 /dev/sdg1 /dev/sdh2 /dev/sdi1
zfs set recordsize=128k pool
zfs create -p -V15100GB pool/test
zfs set compression=lz4 pool/test
mkfs.ext4 -m1 -O 64bit,has_journal,extents,huge_file,flex_bg,uninit_bg,dir_nlink /dev/zvol/pool/test

Fusecompress: Tampaknya bekerja tetapi tidak 100% stabil. Mencari alternatif.

LessFS: Apakah mungkin menggunakan Lessfs dalam hubungannya dengan ext4? Saya belum mencoba tetapi akan tertarik dengan wawasan pengguna.

Satu masalah utama: transparansi tidak benar

Masalah yang saya lihat dengan fusecompress adalah kuota. Sebagai contoh, jika saya mengaktifkan kompresi pada sistem file, saya ingin sistem saya mendapat manfaat dari kompresi, tidak harus pengguna akhir. Jika saya mengaktifkan kuota 1GB untuk pengguna, dengan rasio kompresi 1,5, mereka akan dapat mengunggah data 1,5GB, daripada 1GB data dan sistem mendapat manfaat dari kompresi. Ini juga muncul untuk ditampilkan di df -h. Apakah ada solusi untuk memiliki kompresi transparan ke kuota?

pengguna235918
sumber
Yakin. Bisakah Anda mendaftar OS / distro / versi dan detail tentang sifat data yang ingin Anda simpan?
ewwhite
Juga detail perangkat keras.
ewwhite
1
@ewwhite 8x3TB dalam Perangkat Lunak RAID6. Data akan dicadangkan cadangan dari server lain sehingga beragam tipe data dan berbagai pengguna akhir, dokumen, dll. CentOS 6.5 x64.
user235918
Apakah Anda yakin ini? Apakah Anda memiliki banyak file besar dan jarang? Ruang disk murah hari ini.
Andrew Schulman
@AndrewSchulman: Mengambil keuntungan dari kompresi adalah metode yang lebih baik dari perhitungan saya. Biaya disk tambahan dan pengontrol yang mendukungnya lebih dari biaya CPU.
user235918

Jawaban:

27

Saya menggunakan ZFS di Linux sebagai manajer volume dan sarana untuk memberikan perlindungan dan fungsionalitas tambahan ke sistem file tradisional. Ini termasuk membawa snapshot tingkat blok, replikasi, deduplikasi, kompresi, dan caching lanjutan ke sistem file XFS atau ext4.

Lihat: https://pthree.org/2012/12/21/zfs-administration-part-xiv-zvols/ untuk penjelasan lainnya.

Dalam kasus penggunaan saya yang paling umum, saya memanfaatkan fitur ZFS zvol untuk membuat volume yang jarang pada zpool yang ada. Properti zvol itu dapat diatur seperti sistem file ZFS normal. Pada titik ini, Anda dapat mengatur properti seperti tipe kompresi, ukuran volume, metode caching, dll.

Membuat zvol ini menghadirkan perangkat blok ke Linux yang dapat diformat dengan sistem file pilihan Anda. Gunakan fdiskatau parteduntuk membuat partisi Anda dan mkfsvolume yang sudah jadi.

Pasang ini dan Anda pada dasarnya memiliki sistem file yang didukung oleh zvol dan dengan semua propertinya.


Inilah alur kerja saya ...

Buat zpool yang terdiri dari empat disk:
Anda perlu ashift=12arahan untuk jenis disk yang Anda gunakan. Nama zpool adalah "vol0" dalam kasus ini.

zpool membuat -o ashift = 12 -f vol0 cermin scsi-AccOW140403AS1322043 scsi-AccOW140403AS1322042 cermin scsi-AccOW140403AS1322013 scsi-AccOW140403AS1322044

Tetapkan pengaturan zpool awal:
Saya atur autoexpand=ondi tingkat zpool jika saya pernah mengganti disk dengan drive yang lebih besar atau memperluas kumpulan dalam pengaturan mirror ZFS . Saya biasanya tidak menggunakan ZFS raidz1 / 2/3 karena kinerja yang buruk dan ketidakmampuan untuk memperluas zpool.

zpool set autoexpand=on vol0

Setel properti sistem file zfs awal:
Silakan gunakan lz4algoritma kompresi untuk instalasi ZFS baru. Tidak apa-apa membiarkannya sepanjang waktu.

zfs set compression=lz4 vol0
zfs set atime=off vol0

Buat ZFS zvol:
Untuk ZFS di Linux, sangat penting bahwa Anda menggunakan ukuran blok yang besar. -o volblocksize=128ksangat penting di sini. The -spilihan menciptakan zvol jarang dan tidak mengkonsumsi ruang kolam renang sampai diperlukan. Anda dapat terlalu berkomitmen di sini, jika Anda tahu data Anda dengan baik. Dalam hal ini, saya memiliki sekitar 444GB ruang disk yang dapat digunakan di kolam, tapi saya menyajikan volume 800GB ke XFS.

zfs create -o volblocksize=128K -s -V 800G vol0/pprovol

Perangkat partisi zvol:
( harus / dev / zd0 untuk zvol pertama; / dev / zd16, / dev / zd32, dll. Untuk zvol berikutnya )

fdisk /dev/zd0 # (create new aligned partition with the "c" and "u" parameters)

Buat dan
pasang sistem file: mkfs.xfs atau ext4 pada partisi yang baru dibuat, / dev / zd0p1.

mkfs.xfs -f -l size=256m,version=2 -s size=4096 /dev/zd0p1

Raih UUID dengan blkiddan modifikasi /etc/fstab.

UUID=455cae52-89e0-4fb3-a896-8f597a1ea402 /ppro       xfs     noatime,logbufs=8,logbsize=256k 1 2

Pasang sistem file baru.

mount /ppro/

Hasil ...

[root@Testa ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sde2        20G  8.9G  9.9G  48% /
tmpfs            32G     0   32G   0% /dev/shm
/dev/sde1       485M   63M  397M  14% /boot
/dev/sde7       2.0G   68M  1.9G   4% /tmp
/dev/sde3        12G  2.6G  8.7G  24% /usr
/dev/sde6       6.0G  907M  4.8G  16% /var
/dev/zd0p1      800G  398G  403G  50% /ppro  <-- Compressed ZFS-backed XFS filesystem.
vol0            110G  256K  110G   1% /vol0

Daftar sistem file ZFS.

[root@Testa ~]# zfs list
NAME           USED  AVAIL  REFER  MOUNTPOINT
vol0           328G   109G   272K  /vol0
vol0/pprovol   326G   109G   186G  -   <-- The actual zvol providing the backing for XFS.
vol1           183G   817G   136K  /vol1
vol1/images    183G   817G   183G  /images

ZFS daftar zpool.

[root@Testa ~]# zpool list -v
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
vol0   444G   328G   116G    73%  1.00x  ONLINE  -
  mirror   222G   164G  58.1G         -
    scsi-AccOW140403AS1322043      -      -      -         -
    scsi-AccOW140403AS1322042      -      -      -         -
  mirror   222G   164G  58.1G         -
    scsi-AccOW140403AS1322013      -      -      -         -
    scsi-AccOW140403AS1322044      -      -      -         -

Properti ZFS zvol ( perhatikan referenced, compressratiodanvolsize ).

[root@Testa ~]# zfs get all vol0/pprovol
NAME          PROPERTY               VALUE                  SOURCE
vol0/pprovol  type                   volume                 -
vol0/pprovol  creation               Sun May 11 15:27 2014  -
vol0/pprovol  used                   326G                   -
vol0/pprovol  available              109G                   -
vol0/pprovol  referenced             186G                   -
vol0/pprovol  compressratio          2.99x                  -
vol0/pprovol  reservation            none                   default
vol0/pprovol  volsize                800G                   local
vol0/pprovol  volblocksize           128K                   -
vol0/pprovol  checksum               on                     default
vol0/pprovol  compression            lz4                    inherited from vol0
vol0/pprovol  readonly               off                    default
vol0/pprovol  copies                 1                      default
vol0/pprovol  refreservation         none                   default
vol0/pprovol  primarycache           all                    default
vol0/pprovol  secondarycache         all                    default
vol0/pprovol  usedbysnapshots        140G                   -
vol0/pprovol  usedbydataset          186G                   -
vol0/pprovol  usedbychildren         0                      -
vol0/pprovol  usedbyrefreservation   0                      -
vol0/pprovol  logbias                latency                default
vol0/pprovol  dedup                  off                    default
vol0/pprovol  mlslabel               none                   default
vol0/pprovol  sync                   standard               default
vol0/pprovol  refcompressratio       3.32x                  -
vol0/pprovol  written                210M                   -
vol0/pprovol  snapdev                hidden                 default
putih
sumber
Mengapa mempartisi zvol? Tidak bisakah itu digunakan secara langsung saja?
Michael Hampton
3
@MichaelHampton Terutama untuk penyelarasan dan konsistensi. Juga, saya ingin fleksibilitas jika saya memperluas volume yang mendasarinya. Ada beberapa lapisan abstraksi di sini. Ini mirip dengan argumen menggunakan /dev/sdbversus /dev/sdb1.
ewwhite
1
Terima kasih atas informasi anda. Banyak saran bagus di sini. Saya akan mengujinya.
user235918
2
@MichaelHampton BTW, hari ini, saya tidak mempartisi lagi ... terutama dengan mesin virtual.
ewwhite
1
Bisakah Anda memberi tahu tentang biaya sumber daya tambahan untuk lapisan ZFS dalam pengaturan ini (RAM, CPU)?
Sz.
4

Anda juga perlu mengaktifkan discard pada sistem file ext4. Tanpa membuang, zfs tidak mendapatkan kembali ruang ketika file dihapus. Hal ini dapat menyebabkan perbedaan ruang besar antara apa yang dilaporkan oleh filesystem ext4 dan laporan volume zfs.

Devon
sumber
4
Red Hat tidak merekomendasikan melakukan ini secara online dengan opsi discard mount (dengan ext4 atau xfs), karena ada dampak kinerja. Lebih bersih menjalankan fstrimperintah secara berkala .
ewwhite
wrt komentar tentang discard mounts yang memengaruhi kinerja: Ini berlaku untuk SSD lama dan berkualitas rendah. Itu tidak benar dengan yang baru.
Stoat