====== ZFS Commands ======
zfs list shows USED and AVAILABLE after parity/redundancy are removed
zpool list shows ALLOCATED and FREE including space occupied by parity/redundancy
----
====== Create ZFS dataset ======
===== PostgreSQL =====
~~REFNOTES~~
==== notes ====
* use ZFS's cache is postgresql dataset exceeds RAM, use postgres's cache if dataset fits in RAM
* disable postgres cache, enable ZFS cache
* enable postgres cache, disable ZFS cache
==== zfs ====
* **atime=off** -- disable access time recording for files when they are read
* **compression=lz4** -- turn on compression
* **recordsize=8k** -- set record size to postgres's default write block size 8k
* **logbias=throughput** --
* **primarycache=metadata** -- ARC only cache metadata (dnode entries), not page data itself. DO NOT disable if PostgreSQL's cache is disabled!
* quota=500G
==== postgres ====
* disable full_page_writes
* disable PostgreSQL TOAST compression
* dedicate 15%-25% physical ram to ARC, and 50% to shared_buffers
=== raw benchmark data ===
{{tablelayout?tableSort=1}}
^ pgbench -c 10 -j 2 -t 10000 ^ inc. connections est. ^ exc. connections est. ^ latency ^
| BASE | 6775 | 6776 | 1.476 ms |
| primarycache=metadata | 3850 | 3850 | 2.597 ms |
| primarycache=metadata compression=lz4 | 4815 | 4816 | 2.077 ms |
| primarycache=metadata compression=lz4 recordsize=16k | 4160 | 4160 | 2.404 ms |
| primarycache=metadata, compression=lz4, recordsize=16k, atime=off | 3415 | 3415 | 2.928 ms |
| primarycache=metadata, compression=lz4, recordsize=8k, atime=off | 4362 | 4363 | 2.292 ms |
| primarycache=metadata, compression=lz4, recordsize=8k, atime=off, \\ shared_buffers=2048MB | 5862 | 5863 | 1.706 ms |
| primarycache=metadata, compression=lz4, recordsize=16k, atime=off, \\ shared_buffers=2048MB | 5819 | 5820 | 1.718 ms |
| compression=lz4, recordsize=16k, atime=off, \\ shared_buffers=2048MB | 7628 | 7628 | 1.311 ms |
| compression=lz4, recordsize=16k, atime=off, \\ shared_buffers=4096MB | 7332 | 7333 | 1.364 ms |
| compression=lz4, recordsize=16k, atime=off, logbias=throughput, \\ shared_buffers=4096MB, synchronous_commit=off | 27052 | 27067 | 0.370 ms |
| compression=lz4, recordsize=16k, atime=off, logbias=throughput, \\ shared_buffers=4096MB, synchronous_commit=off, full_page_writes=off | 30348 | 30366 | 0.330 ms |
----
====== /boot/loader.conf ======
# ZFS tuning. arc min at 2GB, max at 8GB. ashift to 12 for 4k sectors
# settings are in 1024*1024, not sure if need be
vfs.zfs.min_auto_ashift="12"
vfs.zfs.arc_min="2147483648"
# real memory = 6442450944 (6144 MB)
# avail memory = 5916946432 (5642 MB)
# Setting limit to 2/3 of available memory
vfs.zfs.arc_max="3944630954"
Create ZFS raid6 zpool named ''storage'' with ''da'' devices
zpool create storage raidz2 da0 da1 da2 da3 da4 da5 da6
Create ZFS dataset ''media''
zfs create storage/media
Create ZFS dataset ''data'' with lz4 compression, acl mode passthrough, acl inherit, and visible snapdir
zfs create -o aclmode=passthrough -o aclinherit=passthrough -o snapdir=visible -o compression=lz4 storage/data
Create folders in storage/media and storage/data, set proper owner:group
mkdir /storage/media/4k/
mkdir /storage/media/anime/
mkdir /storage/media/anime_movies/
mkdir /storage/media/documentary/
mkdir /storage/media/international/
mkdir /storage/media/japanese/
mkdir /storage/media/movies/
mkdir /storage/media/mp3/
mkdir /storage/media/russian_movies/
mkdir /storage/media/russian_shows/
mkdir /storage/media/shows/
mkdir /storage/data/smb/
chown -R nobody:nobody /storage/media
chown -R nobody:nobody /storage/data
----
===== Benchmarks =====
{{tablelayout?tableSort=1}}
^ Type ^ zpool command ^
| 4 x stripe | zpool create storage da0 da1 da2 da3 |
| 7 x stripe | zpool create storage da0 da1 da2 da3 da4 da5 da6 |
| 4 x raid5 | zpool create storage raidz da0 da1 da2 da3 |
| 7 x raid5 | zpool create storage raidz da0 da1 da2 da3 da4 da5 da6 |
| 7 x raid6 | zpool create storage raidz2 da0 da1 da2 da3 da4 da5 da6 |
{{tablelayout?tableSort=1}}
^ name ^ command ^
| dd 30gb zero write | dd if=/dev/zero of=/storage/30gb.zero.test bs=1m count=30000 |
| dd 30gb zero read | dd if=/storage/30gb.zero.test of=/dev/null bs=1m |
| fio | fio fio-seq-read.job |
| fio | fio fio-seq-write.job |
| fio | fio fio-seq-rw.job |
| fio | fio fio-rand-read.job |
| fio | fio fio-rand-write.job |
| fio | fio fio-rand-rw.job |
| iozone | iozone -a -b results.xls -f /storage/iozone.tmp |
^ zfs type ^ dd 30gb read ^ dd 30gb write ^ 1 ^ 2 ^ 3 ^ 4 ^
| 4x stripe | 747370298 | 761272125 | | | | |
| 7x stripe | 1174415124 | 1254250847 | | | | |
| 4x raid5 | 500529216 | 479107026 | | | | |
| 7x raid5 | 954371168 | 665795046 | | | | |
| 7x raid6 | 736157517 | 571027892 | | | | |
4x stripe = 764801997
7x stripe = 1254250847
4x raid5 = 479107026
7x raid5 = 665795046
===== Links =====
ZFS Tuning Guide[(https://wiki.freebsd.org/ZFSTuningGuide)]
FreeBSD Enterprise 1 PB Storage[(https://vermaden.wordpress.com/2019/06/19/freebsd-enterprise-1-pb-storage/)]