Skip to content

Commit b36b97a

Browse files
amotinixhamza
authored andcommitted
Remove hash_elements_max accounting from DBUF and ARC
Those values require global atomics to get current hash_elements values in few of the hottest code paths, while in all the years I never cared about it. If somebody wants, it should be easy to get it by periodic sampling, since neither ARC header nor DBUF counts change so fast that it would be difficult to catch. For now I've left hash_elements_max kstat for ARC, since it was used/reported by arc_summary and it would break older versions, but now it just reports the current value. Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Alexander Motin <[email protected]> Sponsored by: iXsystems, Inc. Closes openzfs#16759
1 parent 10f626c commit b36b97a

File tree

4 files changed

+16
-15
lines changed

4 files changed

+16
-15
lines changed

cmd/arc_summary

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -662,10 +662,7 @@ def section_arc(kstats_dict):
662662
print()
663663

664664
print('ARC hash breakdown:')
665-
prt_i1('Elements max:', f_hits(arc_stats['hash_elements_max']))
666-
prt_i2('Elements current:',
667-
f_perc(arc_stats['hash_elements'], arc_stats['hash_elements_max']),
668-
f_hits(arc_stats['hash_elements']))
665+
prt_i1('Elements:', f_hits(arc_stats['hash_elements']))
669666
prt_i1('Collisions:', f_hits(arc_stats['hash_collisions']))
670667

671668
prt_i1('Chain max:', f_hits(arc_stats['hash_chain_max']))

include/sys/arc_impl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,7 @@ typedef struct arc_sums {
942942
wmsum_t arcstat_evict_l2_eligible_mru;
943943
wmsum_t arcstat_evict_l2_ineligible;
944944
wmsum_t arcstat_evict_l2_skip;
945+
wmsum_t arcstat_hash_elements;
945946
wmsum_t arcstat_hash_collisions;
946947
wmsum_t arcstat_hash_chains;
947948
aggsum_t arcstat_size;

module/zfs/arc.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,12 +1074,9 @@ buf_hash_insert(arc_buf_hdr_t *hdr, kmutex_t **lockp)
10741074
ARCSTAT_BUMP(arcstat_hash_collisions);
10751075
if (i == 1)
10761076
ARCSTAT_BUMP(arcstat_hash_chains);
1077-
10781077
ARCSTAT_MAX(arcstat_hash_chain_max, i);
10791078
}
1080-
uint64_t he = atomic_inc_64_nv(
1081-
&arc_stats.arcstat_hash_elements.value.ui64);
1082-
ARCSTAT_MAX(arcstat_hash_elements_max, he);
1079+
ARCSTAT_BUMP(arcstat_hash_elements);
10831080

10841081
return (NULL);
10851082
}
@@ -1103,8 +1100,7 @@ buf_hash_remove(arc_buf_hdr_t *hdr)
11031100
arc_hdr_clear_flags(hdr, ARC_FLAG_IN_HASH_TABLE);
11041101

11051102
/* collect some hash table performance data */
1106-
atomic_dec_64(&arc_stats.arcstat_hash_elements.value.ui64);
1107-
1103+
ARCSTAT_BUMPDOWN(arcstat_hash_elements);
11081104
if (buf_hash_table.ht_table[idx] &&
11091105
buf_hash_table.ht_table[idx]->b_hash_next == NULL)
11101106
ARCSTAT_BUMPDOWN(arcstat_hash_chains);
@@ -7008,6 +7004,9 @@ arc_kstat_update(kstat_t *ksp, int rw)
70087004
wmsum_value(&arc_sums.arcstat_evict_l2_ineligible);
70097005
as->arcstat_evict_l2_skip.value.ui64 =
70107006
wmsum_value(&arc_sums.arcstat_evict_l2_skip);
7007+
as->arcstat_hash_elements.value.ui64 =
7008+
as->arcstat_hash_elements_max.value.ui64 =
7009+
wmsum_value(&arc_sums.arcstat_hash_elements);
70117010
as->arcstat_hash_collisions.value.ui64 =
70127011
wmsum_value(&arc_sums.arcstat_hash_collisions);
70137012
as->arcstat_hash_chains.value.ui64 =
@@ -7432,6 +7431,7 @@ arc_state_init(void)
74327431
wmsum_init(&arc_sums.arcstat_evict_l2_eligible_mru, 0);
74337432
wmsum_init(&arc_sums.arcstat_evict_l2_ineligible, 0);
74347433
wmsum_init(&arc_sums.arcstat_evict_l2_skip, 0);
7434+
wmsum_init(&arc_sums.arcstat_hash_elements, 0);
74357435
wmsum_init(&arc_sums.arcstat_hash_collisions, 0);
74367436
wmsum_init(&arc_sums.arcstat_hash_chains, 0);
74377437
aggsum_init(&arc_sums.arcstat_size, 0);
@@ -7590,6 +7590,7 @@ arc_state_fini(void)
75907590
wmsum_fini(&arc_sums.arcstat_evict_l2_eligible_mru);
75917591
wmsum_fini(&arc_sums.arcstat_evict_l2_ineligible);
75927592
wmsum_fini(&arc_sums.arcstat_evict_l2_skip);
7593+
wmsum_fini(&arc_sums.arcstat_hash_elements);
75937594
wmsum_fini(&arc_sums.arcstat_hash_collisions);
75947595
wmsum_fini(&arc_sums.arcstat_hash_chains);
75957596
aggsum_fini(&arc_sums.arcstat_size);

module/zfs/dbuf.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ typedef struct dbuf_stats {
8989
kstat_named_t hash_misses;
9090
kstat_named_t hash_collisions;
9191
kstat_named_t hash_elements;
92-
kstat_named_t hash_elements_max;
9392
/*
9493
* Number of sublists containing more than one dbuf in the dbuf
9594
* hash table. Keep track of the longest hash chain.
@@ -134,7 +133,6 @@ dbuf_stats_t dbuf_stats = {
134133
{ "hash_misses", KSTAT_DATA_UINT64 },
135134
{ "hash_collisions", KSTAT_DATA_UINT64 },
136135
{ "hash_elements", KSTAT_DATA_UINT64 },
137-
{ "hash_elements_max", KSTAT_DATA_UINT64 },
138136
{ "hash_chains", KSTAT_DATA_UINT64 },
139137
{ "hash_chain_max", KSTAT_DATA_UINT64 },
140138
{ "hash_insert_race", KSTAT_DATA_UINT64 },
@@ -154,6 +152,7 @@ struct {
154152
wmsum_t hash_hits;
155153
wmsum_t hash_misses;
156154
wmsum_t hash_collisions;
155+
wmsum_t hash_elements;
157156
wmsum_t hash_chains;
158157
wmsum_t hash_insert_race;
159158
wmsum_t metadata_cache_count;
@@ -432,8 +431,7 @@ dbuf_hash_insert(dmu_buf_impl_t *db)
432431
db->db_hash_next = h->hash_table[idx];
433432
h->hash_table[idx] = db;
434433
mutex_exit(DBUF_HASH_MUTEX(h, idx));
435-
uint64_t he = atomic_inc_64_nv(&dbuf_stats.hash_elements.value.ui64);
436-
DBUF_STAT_MAX(hash_elements_max, he);
434+
DBUF_STAT_BUMP(hash_elements);
437435

438436
return (NULL);
439437
}
@@ -506,7 +504,7 @@ dbuf_hash_remove(dmu_buf_impl_t *db)
506504
h->hash_table[idx]->db_hash_next == NULL)
507505
DBUF_STAT_BUMPDOWN(hash_chains);
508506
mutex_exit(DBUF_HASH_MUTEX(h, idx));
509-
atomic_dec_64(&dbuf_stats.hash_elements.value.ui64);
507+
DBUF_STAT_BUMPDOWN(hash_elements);
510508
}
511509

512510
typedef enum {
@@ -903,6 +901,8 @@ dbuf_kstat_update(kstat_t *ksp, int rw)
903901
wmsum_value(&dbuf_sums.hash_misses);
904902
ds->hash_collisions.value.ui64 =
905903
wmsum_value(&dbuf_sums.hash_collisions);
904+
ds->hash_elements.value.ui64 =
905+
wmsum_value(&dbuf_sums.hash_elements);
906906
ds->hash_chains.value.ui64 =
907907
wmsum_value(&dbuf_sums.hash_chains);
908908
ds->hash_insert_race.value.ui64 =
@@ -1004,6 +1004,7 @@ dbuf_init(void)
10041004
wmsum_init(&dbuf_sums.hash_hits, 0);
10051005
wmsum_init(&dbuf_sums.hash_misses, 0);
10061006
wmsum_init(&dbuf_sums.hash_collisions, 0);
1007+
wmsum_init(&dbuf_sums.hash_elements, 0);
10071008
wmsum_init(&dbuf_sums.hash_chains, 0);
10081009
wmsum_init(&dbuf_sums.hash_insert_race, 0);
10091010
wmsum_init(&dbuf_sums.metadata_cache_count, 0);
@@ -1077,6 +1078,7 @@ dbuf_fini(void)
10771078
wmsum_fini(&dbuf_sums.hash_hits);
10781079
wmsum_fini(&dbuf_sums.hash_misses);
10791080
wmsum_fini(&dbuf_sums.hash_collisions);
1081+
wmsum_fini(&dbuf_sums.hash_elements);
10801082
wmsum_fini(&dbuf_sums.hash_chains);
10811083
wmsum_fini(&dbuf_sums.hash_insert_race);
10821084
wmsum_fini(&dbuf_sums.metadata_cache_count);

0 commit comments

Comments
 (0)