Hello everyone. And sorry for my poor english - it's not my native language =)
I'm in process of installing and testing a new server with FreeBSD11 and ZFS. I try to put up complicated(not so much?) config of 3 pools and ask you fellow $username advice.
The script i use to install (questions are at the end of post, you can skip reading script for now, synopsis is: crate boot partition and ROOT pool on usb stick \\ create DATA pool and add SSD partitions as ARC+ZIL with 2x HDDs as spare to DATA pool \\ create SSD fast pool, install system.):
This gives me following:
Seems OK and works also without noticeable troubles. Although it's just the beginning of tests =)
Few questions:
I'm in process of installing and testing a new server with FreeBSD11 and ZFS. I try to put up complicated(not so much?) config of 3 pools and ask you fellow $username advice.
Chassis contains:
Code:
- LSI(Avago) 9271-8i + 16xSAS HDDs (HGST HUS726040AL5214) in JBOD mode;
- Supermicro X10DRi + 2xIntel DC SSDs. (3 partitions on each - for ARC, ZIL and data)
- 128 GB DDR4 ECC RAM
ZFS pools:
Code:
- 1st: FreeBSD OS root pool @ internal 16GB USB3.0 flash drive;
- 2nd: pool for "data" @ LSI 9271 of [CMD]14 HDDs for raidz3 and 2 HDDs for spare[/CMD] + [CMD]2x ssdXp0 arc stripe[/CMD] + [CMD]2x ssdXp1 zil mirror[/CMD];
- 3rd: pool for fast data zfs mirror @ ssd partitions (2x adaXp3)
Code:
#!/bin/sh
dev0="da0" # USB3.0 flash stick @ internal X10DRi's USB3.0 port
ssd0="ada0" # 2x SSDs @ X10DRi's Intel AHCI SATA controller
ssd1="ada1"
hdd0="mfisyspd0" # 16x HDDs @ LSI 9271
<...>
hdd15="mfisyspd15"
#
gpart create -s gpt $dev0
gpart create -s gpt $ssd0
gpart create -s gpt $ssd1
gpart create -s gpt $hdd0
<...>
gpart create -s gpt $hdd15
#
gpart add -b 2048 -a 4k -s 478 -t freebsd-boot $dev0
gpart add -s 12G -a 4k -t freebsd-zfs -l zroot0 $dev0
gpart add -s 32G -a 4k -t freebsd-zfs -l l2arc0 $ssd0
gpart add -s 16G -a 4k -t freebsd-zfs -l zil0 $ssd0
gpart add -s 32G -a 4k -t freebsd-zfs -l l2arc1 $ssd1
gpart add -s 16G -a 4k -t freebsd-zfs -l zil1 $ssd1
gpart add -s 136G -a 4k -t freebsd-zfs -l zssd0 $ssd0
gpart add -s 136G -a 4k -t freebsd-zfs -l zssd1 $ssd1
gpart add -a 4k -t freebsd-zfs -l hdd0 $hdd0
<...>
gpart add -a 4k -t freebsd-zfs -l hdd15 $hdd15
#
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 $dev0
#
gnop create -S 4096 /dev/gpt/zroot0
gnop create -S 4096 /dev/gpt/l2arc0
gnop create -S 4096 /dev/gpt/l2arc1
gnop create -S 4096 /dev/gpt/zil0
gnop create -S 4096 /dev/gpt/zil1
gnop create -S 4096 /dev/gpt/zssd0
gnop create -S 4096 /dev/gpt/zssd1
gnop create -S 4096 /dev/gpt/hdd0
<...>
gnop create -S 4096 /dev/gpt/hdd15
#
zpool create -f -o cachefile=/var/tmp/zpool.cache -R /mnt -m / zroot /dev/gpt/zroot0.nop
zpool create -f -o cachefile=/var/tmp/zpool.cache -R /mnt/zdata -m /zdata zdata raidz3 /dev/gpt/hdd0.nop <...> /dev/gpt/hdd13.nop \
cache /dev/gpt/l2arc0.nop /dev/gpt/l2arc1.nop \
log mirror /dev/gpt/zil0.nop /dev/gpt/zil1.nop
zpool add zdata spare /dev/gpt/hdd14.nop
zpool add zdata spare /dev/gpt/hdd15.nop
zpool create -f -o cachefile=/var/tmp/zpool.cache -R /mnt/zssd -m /zssd zssd mirror /dev/gpt/zssd0.nop /dev/gpt/zssd1.nop
#
zpool export zssd
zpool export zdata
zpool export zroot
#
gnop destroy /dev/gpt/zroot0.nop
gnop destroy /dev/gpt/l2arc0.nop
gnop destroy /dev/gpt/l2arc1.nop
gnop destroy /dev/gpt/zil0.nop
gnop destroy /dev/gpt/zil1.nop
gnop destroy /dev/gpt/zssd0.nop
gnop destroy /dev/gpt/zssd1.nop
gnop destroy /dev/gpt/hdd0.nop
<...>
gnop destroy /dev/gpt/hdd15.nop
#
zpool import -d /dev/gpt -o cachefile=/var/tmp/zpool.cache -R /mnt zroot
zpool import -d /dev/gpt -o cachefile=/var/tmp/zpool.cache -R /mnt/zdata zdata
zpool import -d /dev/gpt -o cachefile=/var/tmp/zpool.cache -R /mnt/zssd zssd
#
zpool set bootfs=zroot zroot
zpool set feature@lz4_compress=enabled zroot
zpool set feature@lz4_compress=enabled zdata
zpool set feature@lz4_compress=enabled zssd
zfs set checksum=fletcher4 zroot
zfs set checksum=fletcher4 zdata
zfs set checksum=fletcher4 zssd
zpool set autoexpand=on zroot
zpool set autoexpand=on zssd
zpool set autoexpand=on zdata
zfs set atime=off zroot
zfs set atime=off zssd
#
zfs create zroot/usr
zfs create zroot/var
zfs create -o mountpoint=/usr/home -o compression=lz4 zdata/home
zfs create -o mountpoint=/usr/src -o compression=lz4 -o exec=off -o setuid=off zdata/src
zfs create -o mountpoint=/usr/ports -o compression=lz4 -o setuid=off zdata/ports
zfs create -o mountpoint=/usr/ports/distfiles -o compression=off -o exec=off -o setuid=off zdata/ports/distfiles
zfs create -o mountpoint=/usr/ports/packages -o compression=off -o exec=off -o setuid=off zdata/ports/packages
zfs create -o mountpoint=/var/crash -o compression=lz4 -o exec=off -o setuid=off zssd/crash
zfs create -o mountpoint=/var/db -o exec=off -o setuid=off zssd/db
zfs create -o mountpoint=/var/db/pkg -o compression=lz4 -o exec=on -o setuid=off zdata/pkgdb
zfs create -o mountpoint=/var/db/ports -o compression=lz4 -o setuid=off zdata/portsdb
zfs create -o mountpoint=/var/db/portsnap -o compression=lz4 zdata/portsnapdb
zfs create -o exec=off -o setuid=off zroot/var/empty
zfs create -o compression=lz4 -o exec=off -o setuid=off zdata/log
zfs create -o mountpoint=/var/mail -o compression=lz4 -o utf8only=on -o exec=off -o setuid=off zdata/mail
zfs create -o mountpoint=/var/run -o compression=lz4 -o exec=off -o setuid=off zssd/varrun
zfs create -o mountpoint=/var/tmp -o compression=lz4 -o exec=on -o setuid=off zssd/vartmp
zfs create -V 8G zdata/swap
zfs set org.freebsd:swap=on zdata/swap
zfs set checksum=off zdata/swap
#
cd /usr/freebsd-dist
export DESTDIR=/mnt
for file in base.txz lib32.txz kernel.txz ; do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}) ; done
cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cache
cat << EOF > /mnt/etc/rc.conf
zfs_enable="YES"
EOF
echo 'zfs_load="YES"' > /mnt/boot/loader.conf
touch /mnt/etc/fstab
echo "md /tmp mfs rw,-s4096m 2 0" >> /mnt/etc/fstab
# zpool status
Code:
pool: zdata
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zdata ONLINE 0 0 0
raidz3-0 ONLINE 0 0 0
gpt/hdd0 ONLINE 0 0 0
gpt/hdd1 ONLINE 0 0 0
gpt/hdd2 ONLINE 0 0 0
gpt/hdd3 ONLINE 0 0 0
gpt/hdd4 ONLINE 0 0 0
gpt/hdd5 ONLINE 0 0 0
gpt/hdd6 ONLINE 0 0 0
gpt/hdd7 ONLINE 0 0 0
gpt/hdd8 ONLINE 0 0 0
gpt/hdd9 ONLINE 0 0 0
gpt/hdd10 ONLINE 0 0 0
gpt/hdd11 ONLINE 0 0 0
gpt/hdd12 ONLINE 0 0 0
gpt/hdd13 ONLINE 0 0 0
logs
mirror-1 ONLINE 0 0 0
gpt/zil0 ONLINE 0 0 0
gpt/zil1 ONLINE 0 0 0
cache
ada0p1 ONLINE 0 0 0
ada1p1 ONLINE 0 0 0
spares
mfisyspd14p1 AVAIL
mfisyspd15p1 AVAIL
errors: No known data errors
pool: zroot
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
gpt/zroot0 ONLINE 0 0 0
errors: No known data errors
pool: zssd
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zssd ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
gpt/zssd0 ONLINE 0 0 0
gpt/zssd1 ONLINE 0 0 0
errors: No known data errors
Few questions:
- 4K AF HDDs: IMO, all my HDDs are 4k sector size, but MegaCli util show HDDs @ LSI 9271 controller as:
Code:<...> Sector Size: 512 Logical Sector Size: 512 Physical Sector Size: 4096 Firmware state: JBOD <...>
- Script: installation goes OK, but i'm in doubt about "export/import pools" part of script - does sequence (in my script it's 1-zssd, 2-zdata, 3-zroot) matter? Do i need to use different zpool.cache on each pool?
- Config: overall layout of this HW/SW config - what do you think of it (zfs on HDDs in JBOD+SSD partitioning for caches)? Does this config makes sense? In your opinion, does it contains "bugs" or caveats/bottlenecks? Total goal in performance side is to use Intel SSDs to speed up array of slow HDDs (CasheCade is not an option in my case). At this point i plan to test and use server as bhyve(8) and jail(8) host.
- GPT labels: What is wrong with ARC and SPARE gpt labels on DATA pool in
zpool status
listing? Install script use them but at the end they just ignored in pool config? ZIL mirror is with appropriate gpt labels... Confusing.