]> git.proxmox.com Git - mirror_zfs.git/commit - module/zfs/dmu_objset.c
OpenZFS 9337 - zfs get all is slow due to uncached metadata
authorMatthew Ahrens <mahrens@delphix.com>
Tue, 10 Jul 2018 17:49:50 +0000 (13:49 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 12 Jul 2018 17:49:27 +0000 (10:49 -0700)
commit2e5dc449c1a65e0b0bf730fd69c9b5804bd57ee8
tree8bbb44d8e88afa71ae1071c7a29369721711b0dd
parente4e94ca3154a9e58ac20e5409c003895ec859964
OpenZFS 9337 - zfs get all is slow due to uncached metadata

This project's goal is to make read-heavy channel programs and zfs(1m)
administrative commands faster by caching all the metadata that they will
need in the dbuf layer. This will prevent the data from being evicted, so
that any future call to i.e. zfs get all won't have to go to disk (very
much). There are two parts:

The dbuf_metadata_cache. We identify what to put into the cache based on
the object type of each dbuf.  Caching objset properties os
{version,normalization,utf8only,casesensitivity} in the objset_t. The reason
these needed to be cached is that although they are queried frequently,
they aren't stored in a dbuf type which we can easily recognize and cache in
the dbuf layer; instead, we have to explicitly store them. There's already
existing infrastructure for maintaining cached properties in the objset
setup code, so I simply used that.

Performance Testing:

 - Disabled kmem_flags
 - Tuned dbuf_cache_max_bytes very low (128K)
 - Tuned zfs_arc_max very low (64M)

Created test pool with 400 filesystems, and 100 snapshots per filesystem.
Later on in testing, added 600 more filesystems (with no snapshots) to make
sure scaling didn't look different between snapshots and filesystems.

Results:

    | Test                   | Time (trunk / diff) | I/Os (trunk / diff) |
    +------------------------+---------------------+---------------------+
    | zpool import           |     0:05 / 0:06     |    12.9k / 12.9k    |
    | zfs get all (uncached) |     1:36 / 0:53     |    16.7k / 5.7k     |
    | zfs get all (cached)   |     1:36 / 0:51     |    16.0k / 6.0k     |

Authored by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Thomas Caputi <tcaputi@datto.com>
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Approved by: Richard Lowe <richlowe@richlowe.net>
Ported-by: Alek Pinchuk <apinchuk@datto.com>
Signed-off-by: Alek Pinchuk <apinchuk@datto.com>
OpenZFS-issue: https://illumos.org/issues/9337
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/7dec52f
Closes #7668
17 files changed:
include/sys/dbuf.h
include/sys/dmu.h
include/sys/dmu_objset.h
include/sys/dnode.h
include/sys/zfs_ioctl.h
include/zfs_comutil.h
man/man5/zfs-module-parameters.5
module/zcommon/zfs_comutil.c
module/zfs/dbuf.c
module/zfs/dmu.c
module/zfs/dmu_objset.c
module/zfs/dnode.c
module/zfs/dnode_sync.c
module/zfs/zcp_iter.c
module/zfs/zfs_ioctl.c
module/zfs/zfs_vfsops.c
tests/zfs-tests/tests/functional/arc/dbufstats_001_pos.ksh