ZFS bug: Creating ZIL ignores vfs.zfs.min_auto_ashift

Borja Marcos borjam at sarenet.es
Thu Nov 6 11:01:43 UTC 2014



Hi,

I have noticed that ZIL creation _ignores_ the vfs.zfs.min_auto_ashift variable. ZIL and cache on SSDs should use
this variable in order to apply the optimum sector size on SSDs or so-called advanced format drives.

The system is:
root at splunk:/ # uname -a
FreeBSD splunk 10.1-PRERELEASE FreeBSD 10.1-PRERELEASE #12: Tue Nov  4 11:22:48 CET 2014     root at splunk:/usr/obj/usr/src/sys/SPLUNK10  amd64



Example:

# sysctl vfs.zfs.min_auto_ashift=12

# zpool status       //// Just a common mirror with two hard disks
  pool: rpool
 state: ONLINE
  scan: scrub repaired 0 in 5h55m with 0 errors on Wed Oct 29 23:26:03 2014
config:

	NAME        STATE     READ WRITE CKSUM
	rpool       ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    ada0p3  ONLINE       0     0     0
	    ada2p3  ONLINE       0     0     0

errors: No known data errors


# zpool add rpool log ada1

# zpool status
  pool: rpool
 state: ONLINE
  scan: scrub repaired 0 in 5h55m with 0 errors on Wed Oct 29 23:26:03 2014
config:

	NAME        STATE     READ WRITE CKSUM
	rpool       ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    ada0p3  ONLINE       0     0     0
	    ada2p3  ONLINE       0     0     0
	logs
	  ada1      ONLINE       0     0     0

errors: No known data errors


///// There it is, but

# zdb | more
    version: 5000
    name: 'rpool'
    state: 0
    txg: 11738986
    pool_guid: 18110845055860026534
    hostid: 316898903
    hostname: 'splunk'
    vdev_children: 2
    vdev_tree:
        type: 'root'
        id: 0
        guid: 18110845055860026534
        children[0]:
            type: 'mirror'
            id: 0
            guid: 10858793804082837265
            metaslab_array: 30
            metaslab_shift: 32
            ashift: 12
            asize: 482922987520
            is_log: 0
            create_txg: 4
            children[0]:
                type: 'disk'
                id: 0
                guid: 10490056043151312448
                path: '/dev/ada0p3'
                phys_path: '/dev/ada0p3'
                whole_disk: 1
                DTL: 331
                create_txg: 4
            children[1]:
                type: 'disk'
                id: 1
                guid: 2441255496794840851
                path: '/dev/ada2p3'
                phys_path: '/dev/ada2p3'
                whole_disk: 1
                DTL: 252
                create_txg: 4
        children[1]:
            type: 'disk'
            id: 1
            guid: 3564614139316480036
            path: '/dev/ada1'
                id: 1
                guid: 2441255496794840851
                path: '/dev/ada2p3'
                phys_path: '/dev/ada2p3'
                whole_disk: 1
                DTL: 252
                create_txg: 4
        children[1]:
            type: 'disk'
            id: 1
            guid: 3564614139316480036
            path: '/dev/ada1'
            phys_path: '/dev/ada1'
            whole_disk: 1
            metaslab_array: 0
            metaslab_shift: 0
            ashift: 9                                      <======================= WRONG, SHOULDN'T IT BE 12??
            asize: 40015757312
            is_log: 1
            create_txg: 11738986
    features_for_read:
        com.delphix:hole_birth
        com.delphix:embedded_data



If, however, I do the gnop trick,

# gnop create -S 4K ada1
# zpool add rpool log ada1.nop
# zpool status

  pool: rpool
 state: ONLINE
  scan: scrub repaired 0 in 5h55m with 0 errors on Wed Oct 29 23:26:03 2014
config:

	NAME        STATE     READ WRITE CKSUM
	rpool       ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    ada0p3  ONLINE       0     0     0
	    ada2p3  ONLINE       0     0     0
	logs
	  ada1.nop  ONLINE       0     0     0

errors: No known data errors


this time our mirror has the ashift we wanted, 12. 

        children[1]:
            type: 'disk'
            id: 1
            guid: 6487094506120463221
            path: '/dev/ada1.nop'
            phys_path: '/dev/ada1.nop'
            whole_disk: 1
            metaslab_array: 0
            metaslab_shift: 0
            ashift: 12
            asize: 40015757312
            is_log: 1
            create_txg: 11739034



The disks I am playing with are:

# camcontrol devlist
<ST3500418AS CC38>                 at scbus0 target 0 lun 0 (ada0,pass0)
<INTEL SSDSA2CT040G3 4PC10362>     at scbus1 target 0 lun 0 (ada1,pass1)
<ST500DM002-1BC142 JC4B>           at scbus2 target 0 lun 0 (ada2,pass2)
<INTEL SSDSA2CT040G3 4PC10362>     at scbus3 target 0 lun 0 (ada3,pass3)


And yes, I know the two hard disks have different sector sizes but I created the pool with an ashift of 12.






Borja.





More information about the freebsd-fs mailing list