mirror_zfs/module/os/linux/zfs
Matthew Ahrens 85ec5cbae2
Include scatter_chunk_waste in arc_size
The ARC caches data in scatter ABD's, which are collections of pages,
which are typically 4K.  Therefore, the space used to cache each block
is rounded up to a multiple of 4K.  The ABD subsystem tracks this wasted
memory in the `scatter_chunk_waste` kstat.  However, the ARC's `size` is
not aware of the memory used by this round-up, it only accounts for the
size that it requested from the ABD subsystem.

Therefore, the ARC is effectively using more memory than it is aware of,
due to the `scatter_chunk_waste`.  This impacts observability, e.g.
`arcstat` will show that the ARC is using less memory than it
effectively is.  It also impacts how the ARC responds to memory
pressure.  As the amount of `scatter_chunk_waste` changes, it appears to
the ARC as memory pressure, so it needs to resize `arc_c`.

If the sector size (`1<<ashift`) is the same as the page size (or
larger), there won't be any waste.  If the (compressed) block size is
relatively large compared to the page size, the amount of
`scatter_chunk_waste` will be small, so the problematic effects are
minimal.

However, if using 512B sectors (`ashift=9`), and the (compressed) block
size is small (e.g. `compression=on` with the default `volblocksize=8k`
or a decreased `recordsize`), the amount of `scatter_chunk_waste` can be
very large.  On a production system, with `arc_size` at a constant 50%
of memory, `scatter_chunk_waste` has been been observed to be 10-30% of
memory.

This commit adds `scatter_chunk_waste` to `arc_size`, and adds a new
`waste` field to `arcstat`.  As a result, the ARC's memory usage is more
observable, and `arc_c` does not need to be adjusted as frequently.

Reviewed-by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: George Wilson <gwilson@delphix.com>
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
Closes #10701
2020-08-17 20:04:04 -07:00
..
abd_os.c Include scatter_chunk_waste in arc_size 2020-08-17 20:04:04 -07:00
arc_os.c Revise ARC shrinker algorithm 2020-07-31 21:10:52 -07:00
Makefile.in Cleanup linux module kbuild files 2020-06-10 09:24:15 -07:00
mmp_os.c Add zfs_multihost_interval tunable handler for FreeBSD 2020-06-23 13:32:42 -07:00
policy.c Linux 4.10 compat: has_capability() 2020-07-19 09:56:21 -07:00
qat_compress.c Fix QAT allocation failure return value 2020-01-06 11:17:53 -08:00
qat_crypt.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
qat.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
spa_misc_os.c Make spa_history_zone platform-dependent in kernel 2020-03-02 09:43:30 -08:00
spa_stats.c Mark functions as static 2020-06-18 12:20:38 -07:00
trace.c Enable use of DTRACE_PROBE* macros in "spl" module 2019-11-01 13:13:43 -07:00
vdev_disk.c Make struct vdev_disk_t be platform private 2020-06-16 11:43:33 -07:00
vdev_file.c Mark Linux fallocate extensions as specific to Linux 2019-11-30 15:40:22 -08:00
zfs_acl.c Mark functions as static 2020-06-18 12:20:38 -07:00
zfs_ctldir.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zfs_debug.c Linux 5.6 compat: time_t 2020-02-27 09:31:02 -08:00
zfs_dir.c Make use of ZFS_DEBUG consistent within kmod sources 2020-07-25 20:07:44 -07:00
zfs_file_os.c Re-share zfsdev_getminor and zfs_onexit_fd_hold 2020-02-28 14:50:32 -08:00
zfs_ioctl_os.c Release onexit/events with any missed zfsdev_state 2020-08-13 15:03:23 -07:00
zfs_sysfs.c Persistent L2ARC 2020-04-10 10:33:35 -07:00
zfs_vfsops.c Mark functions as static 2020-06-18 12:20:38 -07:00
zfs_vnops.c Make use of ZFS_DEBUG consistent within kmod sources 2020-07-25 20:07:44 -07:00
zfs_znode.c Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
zio_crypt.c Linux 4.14, 4.19, 5.0+ compat: SIMD save/restore 2019-10-24 10:17:33 -07:00
zpl_ctldir.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zpl_export.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zpl_file.c Mark functions as static 2020-06-18 12:20:38 -07:00
zpl_inode.c Mark functions as static 2020-06-18 12:20:38 -07:00
zpl_super.c linux: add basic fallocate(mode=0/2) compatibility 2020-06-18 11:22:11 -07:00
zpl_xattr.c Mark functions as static 2020-06-18 12:20:38 -07:00
zvol_os.c Linux 5.9 compat: make_request_fn replaced with submit_bio interface 2020-08-11 13:37:33 -07:00