Mengapa ZFS jauh lebih lambat daripada ext4 dan btrfs?

11

Masalah

Saya baru-baru ini menginstal disk baru dan membuat zpool di atasnya:

/# zpool create morez /dev/sdb

Setelah menggunakannya sebentar, saya perhatikan itu sangat lambat:

/morez# fio --name rw --rw rw --size 10G
   read: IOPS=19.6k, BW=76.6MiB/s (80.3MB/s)(5120MiB/66834msec)
  write: IOPS=19.6k, BW=76.6MiB/s (80.3MB/s)(5120MiB/66834msec)

Tes ini sangat mirip dengan use case saya yang sebenarnya. Saya membaca gambar dalam jumlah sedang (~ 10rb) (masing-masing ~ 2 MIB) dari disk. Mereka ditulis sekaligus ketika disk sebagian besar kosong, jadi saya tidak berharap mereka terfragmentasi.

Sebagai perbandingan, saya menguji ext4:

/# gdisk /dev/sdb
...
/# mkfs.ext4 -f /dev/sdb1 && mount /dev/sdb1 /mnt && cd /mnt
/mnt# fio --name rw --rw rw --size 10G
   read: IOPS=48.3k, BW=189MiB/s (198MB/s)(5120MiB/27135msec)
  write: IOPS=48.3k, BW=189MiB/s (198MB/s)(5120MiB/27135msec)

Dan btrfs:

/# mkfs.btrfs -f /dev/sdb1 && mount /dev/sdb1 /mnt && cd /mnt
/mnt# fio --name rw --rw rw --size 10G
   read: IOPS=51.3k, BW=201MiB/s (210MB/s)(5120MiB/25528msec)
  write: IOPS=51.3k, BW=201MiB/s (210MB/s)(5120MiB/25528msec)

Apa yang mungkin menyebabkan masalah kinerja dengan ZFS dan bagaimana saya bisa membuatnya lebih cepat?

Upaya gagal pada solusi

Saya juga mencoba secara eksplisit mengatur ukuran sektor untuk zpool, karena disk saya ( Seagate ST1000DM003 ) menggunakan sektor fisik 4096 byte:

/# zpool create -o ashift=12 morez /dev/sdb

Ini tidak meningkatkan kinerja:

/morez# fio --name rw --rw rw --size 10G
   read: IOPS=21.3k, BW=83.2MiB/s (87.2MB/s)(5120MiB/61573msec)
  write: IOPS=21.3k, BW=83.2MiB/s (87.2MB/s)(5120MiB/61573msec)

Pengamatan

Anehnya, menggunakan zvol memiliki kinerja hebat:

/# zfs create -V 20G morez/vol
/# fio --name rw --filename /dev/zvol/morez/vol --rw rw --size 10G
   read: IOPS=52.7k, BW=206MiB/s (216MB/s)(5120MiB/24852msec)
  write: IOPS=52.7k, BW=206MiB/s (216MB/s)(5120MiB/24852msec)

Mengapa ini hanya berdampak pada sistem file ZFS dan bukan zvol?

Pengujian diperpanjang untuk btrfs

Dalam komentar, disarankan perbedaan mungkin karena caching. Setelah pengujian lebih lanjut, saya tidak percaya ini masalahnya. Saya meningkatkan ukuran uji btrf jauh di atas jumlah memori yang dimiliki komputer saya dan kinerjanya masih jauh lebih besar daripada ZFS:

/# mkfs.btrfs -f /dev/sdb1 && mount /dev/sdb1 /mnt && cd /mnt
/mnt# $ fio --name rw --rw rw --size 500G --runtime 3600 --time_based --ramp_time 900
   read: IOPS=41.9k, BW=164MiB/s (172MB/s)(576GiB/3600003msec)
  write: IOPS=41.9k, BW=164MiB/s (172MB/s)(576GiB/3600003msec)

Sistem Informasi

Perangkat lunak

  • Arch Linux, kernel versi 4.11.6
  • ZFS di Linux 0.6.5.10
  • untuk 2.21

Perangkat keras

Info ZFS

Berikut adalah sifat-sifat ZFS sebelum menjalankan fio. Ini hanya hasil dari membuat zpool dengan pengaturan default.

# zpool get all morez
NAME   PROPERTY                    VALUE            SOURCE
morez  size                        928G             -
morez  capacity                    0%               -
morez  altroot                     -                default
morez  health                      ONLINE           -
morez  guid                        [removed]        default
morez  version                     -                default
morez  bootfs                      -                default
morez  delegation                  on               default
morez  autoreplace                 off              default
morez  cachefile                   -                default
morez  failmode                    wait             default
morez  listsnapshots               off              default
morez  autoexpand                  off              default
morez  dedupditto                  0                default
morez  dedupratio                  1.00x            -
morez  free                        928G             -
morez  allocated                   276K             -
morez  readonly                    off              -
morez  ashift                      0                default
morez  comment                     -                default
morez  expandsize                  -                -
morez  freeing                     0                default
morez  fragmentation               0%               -
morez  leaked                      0                default
morez  feature@async_destroy       enabled          local
morez  feature@empty_bpobj         enabled          local
morez  feature@lz4_compress        active           local
morez  feature@spacemap_histogram  active           local
morez  feature@enabled_txg         active           local
morez  feature@hole_birth          active           local
morez  feature@extensible_dataset  enabled          local
morez  feature@embedded_data       active           local
morez  feature@bookmarks           enabled          local
morez  feature@filesystem_limits   enabled          local
morez  feature@large_blocks        enabled          local

# zfs get all morez
NAME   PROPERTY              VALUE                  SOURCE
morez  type                  filesystem             -
morez  creation              Thu Jun 29 19:34 2017  -
morez  used                  240K                   -
morez  available             899G                   -
morez  referenced            96K                    -
morez  compressratio         1.00x                  -
morez  mounted               yes                    -
morez  quota                 none                   default
morez  reservation           none                   default
morez  recordsize            128K                   default
morez  mountpoint            /morez                 default
morez  sharenfs              off                    default
morez  checksum              on                     default
morez  compression           off                    default
morez  atime                 on                     default
morez  devices               on                     default
morez  exec                  on                     default
morez  setuid                on                     default
morez  readonly              off                    default
morez  zoned                 off                    default
morez  snapdir               hidden                 default
morez  aclinherit            restricted             default
morez  canmount              on                     default
morez  xattr                 on                     default
morez  copies                1                      default
morez  version               5                      -
morez  utf8only              off                    -
morez  normalization         none                   -
morez  casesensitivity       sensitive              -
morez  vscan                 off                    default
morez  nbmand                off                    default
morez  sharesmb              off                    default
morez  refquota              none                   default
morez  refreservation        none                   default
morez  primarycache          all                    default
morez  secondarycache        all                    default
morez  usedbysnapshots       0                      -
morez  usedbydataset         96K                    -
morez  usedbychildren        144K                   -
morez  usedbyrefreservation  0                      -
morez  logbias               latency                default
morez  dedup                 off                    default
morez  mlslabel              none                   default
morez  sync                  standard               default
morez  refcompressratio      1.00x                  -
morez  written               96K                    -
morez  logicalused           72.5K                  -
morez  logicalreferenced     40K                    -
morez  filesystem_limit      none                   default
morez  snapshot_limit        none                   default
morez  filesystem_count      none                   default
morez  snapshot_count        none                   default
morez  snapdev               hidden                 default
morez  acltype               off                    default
morez  context               none                   default
morez  fscontext             none                   default
morez  defcontext            none                   default
morez  rootcontext           none                   default
morez  relatime              off                    default
morez  redundant_metadata    all                    default
morez  overlay               off                    default
Semakin bertambah
sumber
Tidak ada detail seperti perangkat keras yang digunakan, OS dan versi, pengontrol, pengaturan sistem, dll. Saya tidak yakin apa yang dapat kami sampaikan kepada Anda!
ewwhite
2
Apa drive itu sendiri? Ini adalah drive SATA konsumen yang siap digunakan. Anda memiliki jalan panjang untuk membuktikan bahwa itu benar-benar dapat menangani 200+ MB / detik berkelanjutan. Sebagian besar drive SATA tingkat konsumen dalam kondisi dunia nyata akan beruntung mendapatkan lebih dari 70-80 operasi I / O per detik, atau lebih dari 100-120 MB / detik. Dan jika Anda melakukan operasi kecil-blok I / O acak ke drive seperti itu, Anda mungkin akan mendapatkan sekitar 30-40 KB / detik. 10 GB semuanya bisa dengan mudah ditutup dalam cache.
Andrew Henle
1
@ewwhite Tidak ada pengaturan tuning di/etc/modprobe.d/zfs.conf
Snowball
1
@ewwhite Mereka. Saya menghapus tabel partisi di antara setiap tes. Dalam semua kasus, partisi memiliki offset 1 MiB dari awal disk.
Bola Salju
1
Catatan untuk diri sendiri / siapa pun yang tersandung pada pertanyaan ini: pengaturan penyetelan yang menyebutkan ewwhite disebutkan man 5 zfs-module-parameters.
Bola Salju

Jawaban:

6

Meskipun sudah tua, saya merasa pertanyaan ini pantas dijawab.

fiomasalah, secara default, TIO berukuran 4KB; Dataset ZFS, sebagai gantinya, gunakan 128KB recordize secara default. Ketidakcocokan ini berarti bahwa setiap penulisan 4K menyebabkan baca / modifikasi / tulis dari seluruh catatan 128K.

ZVOLs, di sisi lain, menggunakan volblocksize 8K secara default. Ini berarti bahwa penulisan 4K menyebabkan siklus baca / modifikasi / tulis catatan 8K yang jauh lebih kecil dan, dengan sedikit keberuntungan, dua tulisan 4K dapat digabungkan menjadi satu penulisan 8K (yang tidak memerlukan baca / modifikasi / tulis sama sekali).

Ukuran dataset ZFS dapat diubah dengan zfs set recordize=8K <dataset>dan, dalam hal ini, ia harus memberikan kinerja yang lebih atau kurang setara dengan ZVOL. Namun, ketika digunakan untuk transfer yang relatif besar (OP berbicara tentang 2 MB file yang, sebagai gambar, harus sepenuhnya dibaca setiap kali diakses) lebih baik untuk memiliki ukuran recordsize / volblocksize besar, kadang-kadang bahkan lebih besar daripada pengaturan default (128K).

shodanshok
sumber
4

Catatan: karena kekurangan pekerjaan fio direct=1( http://fio.readthedocs.io/en/latest/fio_doc.html#cmdoption-arg-direct ) beberapa jumlah I / O yang dilakukan (baik baca dan tulis) dapat di-cache oleh sistem operasi, mendistorsi hasil Anda (dan membuat angka menjadi terlalu tinggi). Ini sendiri semakin rumit dengan yang berikut:

Berhati-hatilah O_DIRECTmasih melakukan buffered I / O masih diperbolehkan karena di Linux O_DIRECTlebih merupakan petunjuk (lihat bagian referensi /programming//a/46377629/2732969 ).

Jika Anda berada dalam situasi di mana Anda tidak dapat mem-bypass cache dengan benar, penting bahwa Anda melakukan cukup I / O di area yang cukup besar untuk meminimalkan dampak caching (kecuali, tentu saja, Anda benar-benar ingin menguji caching) ...

Segera
sumber