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
- Drive sedang diuji: Seagate ST1000DM003 , terhubung ke port SATA 6Gb / s
- Motherboard: Gigabyte X99-SLI
- Memori: 8 GiB
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
sumber
/etc/modprobe.d/zfs.conf
man 5 zfs-module-parameters
.Jawaban:
Meskipun sudah tua, saya merasa pertanyaan ini pantas dijawab.
fio
masalah, 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).sumber
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:O_DIRECT
(jadi open gagal) atau jika tidak, maka dengan diam-diam kembali ke buffer I / O (lihat point 3 https://github.com/zfsonlinux/zfs/commit / a584ef26053065f486d46a7335bea222cb03eeea ).O_DIRECT
jatuh kembali ke buffer I / O.Berhati-hatilah
O_DIRECT
masih melakukan buffered I / O masih diperbolehkan karena di LinuxO_DIRECT
lebih 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) ...
sumber