ARC statistics reset

Fixes https://github.com/openzfs/zfs/issues/16437

This patch introduces a means to reset some ARC statistics without
rebooting the machine or reimporting the zfs module. Please note
that it currently only resets l2_cksum_bad and l2_io_error

Signed-off-by: Gionatan Danti <g.danti@assyoma.it>
This commit is contained in:
Gionatan Danti 2024-08-13 17:29:03 +02:00
parent d4b5517ef9
commit fca50874ec
2 changed files with 17 additions and 0 deletions

View File

@ -843,6 +843,10 @@ The target number of bytes the ARC should leave as free memory on the system.
If zero, equivalent to the bigger of If zero, equivalent to the bigger of
.Sy 512 KiB No and Sy all_system_memory/64 . .Sy 512 KiB No and Sy all_system_memory/64 .
. .
.It Sy zfs_arc_stats_reset Ns = Ns Sy 0 Ns | Ns 1 Pq int
Reset ARC statistics.
Note: it currently resets L2ARC bad checksum and error stats only.
.
.It Sy zfs_autoimport_disable Ns = Ns Sy 1 Ns | Ns 0 Pq int .It Sy zfs_autoimport_disable Ns = Ns Sy 1 Ns | Ns 0 Pq int
Disable pool import at module load by ignoring the cache file Disable pool import at module load by ignoring the cache file
.Pq Sy spa_config_path . .Pq Sy spa_config_path .

View File

@ -944,6 +944,9 @@ static uint64_t l2arc_trim_ahead = 0;
static int l2arc_rebuild_enabled = B_TRUE; static int l2arc_rebuild_enabled = B_TRUE;
static uint64_t l2arc_rebuild_blocks_min_l2size = 1024 * 1024 * 1024; static uint64_t l2arc_rebuild_blocks_min_l2size = 1024 * 1024 * 1024;
/* zfs_arc_stats_reset : reset ARC statistics */
static int zfs_arc_stats_reset = 0;
/* L2ARC persistence rebuild control routines. */ /* L2ARC persistence rebuild control routines. */
void l2arc_rebuild_vdev(vdev_t *vd, boolean_t reopen); void l2arc_rebuild_vdev(vdev_t *vd, boolean_t reopen);
static __attribute__((noreturn)) void l2arc_dev_rebuild_thread(void *arg); static __attribute__((noreturn)) void l2arc_dev_rebuild_thread(void *arg);
@ -6919,6 +6922,13 @@ arc_kstat_update(kstat_t *ksp, int rw)
if (rw == KSTAT_WRITE) if (rw == KSTAT_WRITE)
return (SET_ERROR(EACCES)); return (SET_ERROR(EACCES));
/* reset ARC statistics */
if (zfs_arc_stats_reset) {
ARCSTAT_INCR(arcstat_l2_cksum_bad, -(as->arcstat_l2_cksum_bad.value.ui64));
ARCSTAT_INCR(arcstat_l2_io_error, -(as->arcstat_l2_io_error.value.ui64));
zfs_arc_stats_reset = 0;
}
as->arcstat_hits.value.ui64 = as->arcstat_hits.value.ui64 =
wmsum_value(&arc_sums.arcstat_hits); wmsum_value(&arc_sums.arcstat_hits);
as->arcstat_iohits.value.ui64 = as->arcstat_iohits.value.ui64 =
@ -10817,3 +10827,6 @@ ZFS_MODULE_PARAM(zfs_arc, zfs_arc_, evict_batch_limit, UINT, ZMOD_RW,
ZFS_MODULE_PARAM(zfs_arc, zfs_arc_, prune_task_threads, INT, ZMOD_RW, ZFS_MODULE_PARAM(zfs_arc, zfs_arc_, prune_task_threads, INT, ZMOD_RW,
"Number of arc_prune threads"); "Number of arc_prune threads");
ZFS_MODULE_PARAM(zfs_arc, zfs_arc_, stats_reset, INT, ZMOD_RW,
"Reset ARC statistics");