Skip to content

Commit 792a6ee

Browse files
authored
Update arc_summary and arcstat outputs
Recent ARC commits added new statistic counters, such as iohits, uncached state, etc. Represent those. Also some of previously reported numbers were confusing or even made no sense. Cleanup and restructure existing reports. Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Issue #14115 Issue #14123 Issue #14243 Closes #14320
1 parent bacf366 commit 792a6ee

File tree

3 files changed

+294
-80
lines changed

3 files changed

+294
-80
lines changed

cmd/arc_summary

Lines changed: 115 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -558,8 +558,12 @@ def section_arc(kstats_dict):
558558
arc_target_size = arc_stats['c']
559559
arc_max = arc_stats['c_max']
560560
arc_min = arc_stats['c_min']
561+
anon_size = arc_stats['anon_size']
561562
mfu_size = arc_stats['mfu_size']
562563
mru_size = arc_stats['mru_size']
564+
mfug_size = arc_stats['mfu_ghost_size']
565+
mrug_size = arc_stats['mru_ghost_size']
566+
unc_size = arc_stats['uncached_size']
563567
meta_limit = arc_stats['arc_meta_limit']
564568
meta_size = arc_stats['arc_meta_used']
565569
dnode_limit = arc_stats['arc_dnode_limit']
@@ -574,11 +578,17 @@ def section_arc(kstats_dict):
574578
f_perc(arc_min, arc_max), f_bytes(arc_min))
575579
prt_i2('Max size (high water):',
576580
target_size_ratio, f_bytes(arc_max))
577-
caches_size = int(mfu_size)+int(mru_size)
581+
caches_size = int(anon_size)+int(mfu_size)+int(mru_size)+int(unc_size)
582+
prt_i2('Anonymouns data size:',
583+
f_perc(anon_size, caches_size), f_bytes(anon_size))
578584
prt_i2('Most Frequently Used (MFU) cache size:',
579585
f_perc(mfu_size, caches_size), f_bytes(mfu_size))
580586
prt_i2('Most Recently Used (MRU) cache size:',
581587
f_perc(mru_size, caches_size), f_bytes(mru_size))
588+
prt_i1('Most Frequently Used (MFU) ghost size:', f_bytes(mfug_size))
589+
prt_i1('Most Recently Used (MRU) ghost size:', f_bytes(mrug_size))
590+
prt_i2('Uncached data size:',
591+
f_perc(unc_size, caches_size), f_bytes(unc_size))
582592
prt_i2('Metadata cache size (hard limit):',
583593
f_perc(meta_limit, arc_max), f_bytes(meta_limit))
584594
prt_i2('Metadata cache size (current):',
@@ -626,78 +636,119 @@ def section_archits(kstats_dict):
626636
"""
627637

628638
arc_stats = isolate_section('arcstats', kstats_dict)
629-
all_accesses = int(arc_stats['hits'])+int(arc_stats['misses'])
630-
actual_hits = int(arc_stats['mfu_hits'])+int(arc_stats['mru_hits'])
631-
632-
prt_1('ARC total accesses (hits + misses):', f_hits(all_accesses))
633-
ta_todo = (('Cache hit ratio:', arc_stats['hits']),
634-
('Cache miss ratio:', arc_stats['misses']),
635-
('Actual hit ratio (MFU + MRU hits):', actual_hits))
639+
all_accesses = int(arc_stats['hits'])+int(arc_stats['iohits'])+\
640+
int(arc_stats['misses'])
636641

642+
prt_1('ARC total accesses:', f_hits(all_accesses))
643+
ta_todo = (('Total hits:', arc_stats['hits']),
644+
('Total I/O hits:', arc_stats['iohits']),
645+
('Total misses:', arc_stats['misses']))
637646
for title, value in ta_todo:
638647
prt_i2(title, f_perc(value, all_accesses), f_hits(value))
648+
print()
639649

640650
dd_total = int(arc_stats['demand_data_hits']) +\
651+
int(arc_stats['demand_data_iohits']) +\
641652
int(arc_stats['demand_data_misses'])
642-
prt_i2('Data demand efficiency:',
643-
f_perc(arc_stats['demand_data_hits'], dd_total),
644-
f_hits(dd_total))
653+
prt_2('ARC demand data accesses:', f_perc(dd_total, all_accesses),
654+
f_hits(dd_total))
655+
dd_todo = (('Demand data hits:', arc_stats['demand_data_hits']),
656+
('Demand data I/O hits:', arc_stats['demand_data_iohits']),
657+
('Demand data misses:', arc_stats['demand_data_misses']))
658+
for title, value in dd_todo:
659+
prt_i2(title, f_perc(value, dd_total), f_hits(value))
660+
print()
661+
662+
dm_total = int(arc_stats['demand_metadata_hits']) +\
663+
int(arc_stats['demand_metadata_iohits']) +\
664+
int(arc_stats['demand_metadata_misses'])
665+
prt_2('ARC demand metadata accesses:', f_perc(dm_total, all_accesses),
666+
f_hits(dm_total))
667+
dm_todo = (('Demand metadata hits:', arc_stats['demand_metadata_hits']),
668+
('Demand metadata I/O hits:',
669+
arc_stats['demand_metadata_iohits']),
670+
('Demand metadata misses:', arc_stats['demand_metadata_misses']))
671+
for title, value in dm_todo:
672+
prt_i2(title, f_perc(value, dm_total), f_hits(value))
673+
print()
645674

646-
dp_total = int(arc_stats['prefetch_data_hits']) +\
675+
pd_total = int(arc_stats['prefetch_data_hits']) +\
676+
int(arc_stats['prefetch_data_iohits']) +\
647677
int(arc_stats['prefetch_data_misses'])
648-
prt_i2('Data prefetch efficiency:',
649-
f_perc(arc_stats['prefetch_data_hits'], dp_total),
650-
f_hits(dp_total))
678+
prt_2('ARC prefetch metadata accesses:', f_perc(pd_total, all_accesses),
679+
f_hits(pd_total))
680+
pd_todo = (('Prefetch data hits:', arc_stats['prefetch_data_hits']),
681+
('Prefetch data I/O hits:', arc_stats['prefetch_data_iohits']),
682+
('Prefetch data misses:', arc_stats['prefetch_data_misses']))
683+
for title, value in pd_todo:
684+
prt_i2(title, f_perc(value, pd_total), f_hits(value))
685+
print()
651686

652-
known_hits = int(arc_stats['mfu_hits']) +\
653-
int(arc_stats['mru_hits']) +\
654-
int(arc_stats['mfu_ghost_hits']) +\
655-
int(arc_stats['mru_ghost_hits'])
687+
pm_total = int(arc_stats['prefetch_metadata_hits']) +\
688+
int(arc_stats['prefetch_metadata_iohits']) +\
689+
int(arc_stats['prefetch_metadata_misses'])
690+
prt_2('ARC prefetch metadata accesses:', f_perc(pm_total, all_accesses),
691+
f_hits(pm_total))
692+
pm_todo = (('Prefetch metadata hits:',
693+
arc_stats['prefetch_metadata_hits']),
694+
('Prefetch metadata I/O hits:',
695+
arc_stats['prefetch_metadata_iohits']),
696+
('Prefetch metadata misses:',
697+
arc_stats['prefetch_metadata_misses']))
698+
for title, value in pm_todo:
699+
prt_i2(title, f_perc(value, pm_total), f_hits(value))
700+
print()
656701

657-
anon_hits = int(arc_stats['hits'])-known_hits
702+
all_prefetches = int(arc_stats['predictive_prefetch'])+\
703+
int(arc_stats['prescient_prefetch'])
704+
prt_2('ARC predictive prefetches:',
705+
f_perc(arc_stats['predictive_prefetch'], all_prefetches),
706+
f_hits(arc_stats['predictive_prefetch']))
707+
prt_i2('Demand hits after predictive:',
708+
f_perc(arc_stats['demand_hit_predictive_prefetch'],
709+
arc_stats['predictive_prefetch']),
710+
f_hits(arc_stats['demand_hit_predictive_prefetch']))
711+
prt_i2('Demand I/O hits after predictive:',
712+
f_perc(arc_stats['demand_iohit_predictive_prefetch'],
713+
arc_stats['predictive_prefetch']),
714+
f_hits(arc_stats['demand_iohit_predictive_prefetch']))
715+
never = int(arc_stats['predictive_prefetch']) -\
716+
int(arc_stats['demand_hit_predictive_prefetch']) -\
717+
int(arc_stats['demand_iohit_predictive_prefetch'])
718+
prt_i2('Never demanded after predictive:',
719+
f_perc(never, arc_stats['predictive_prefetch']),
720+
f_hits(never))
721+
print()
658722

723+
prt_2('ARC prescient prefetches:',
724+
f_perc(arc_stats['prescient_prefetch'], all_prefetches),
725+
f_hits(arc_stats['prescient_prefetch']))
726+
prt_i2('Demand hits after prescient:',
727+
f_perc(arc_stats['demand_hit_prescient_prefetch'],
728+
arc_stats['prescient_prefetch']),
729+
f_hits(arc_stats['demand_hit_prescient_prefetch']))
730+
prt_i2('Demand I/O hits after prescient:',
731+
f_perc(arc_stats['demand_iohit_prescient_prefetch'],
732+
arc_stats['prescient_prefetch']),
733+
f_hits(arc_stats['demand_iohit_prescient_prefetch']))
734+
never = int(arc_stats['prescient_prefetch'])-\
735+
int(arc_stats['demand_hit_prescient_prefetch'])-\
736+
int(arc_stats['demand_iohit_prescient_prefetch'])
737+
prt_i2('Never demanded after prescient:',
738+
f_perc(never, arc_stats['prescient_prefetch']),
739+
f_hits(never))
659740
print()
660-
print('Cache hits by cache type:')
741+
742+
print('ARC states hits of all accesses:')
661743
cl_todo = (('Most frequently used (MFU):', arc_stats['mfu_hits']),
662744
('Most recently used (MRU):', arc_stats['mru_hits']),
663745
('Most frequently used (MFU) ghost:',
664746
arc_stats['mfu_ghost_hits']),
665747
('Most recently used (MRU) ghost:',
666-
arc_stats['mru_ghost_hits']))
667-
748+
arc_stats['mru_ghost_hits']),
749+
('Uncached:', arc_stats['uncached_hits']))
668750
for title, value in cl_todo:
669-
prt_i2(title, f_perc(value, arc_stats['hits']), f_hits(value))
670-
671-
# For some reason, anon_hits can turn negative, which is weird. Until we
672-
# have figured out why this happens, we just hide the problem, following
673-
# the behavior of the original arc_summary.
674-
if anon_hits >= 0:
675-
prt_i2('Anonymously used:',
676-
f_perc(anon_hits, arc_stats['hits']), f_hits(anon_hits))
677-
678-
print()
679-
print('Cache hits by data type:')
680-
dt_todo = (('Demand data:', arc_stats['demand_data_hits']),
681-
('Prefetch data:', arc_stats['prefetch_data_hits']),
682-
('Demand metadata:', arc_stats['demand_metadata_hits']),
683-
('Prefetch metadata:',
684-
arc_stats['prefetch_metadata_hits']))
685-
686-
for title, value in dt_todo:
687-
prt_i2(title, f_perc(value, arc_stats['hits']), f_hits(value))
688-
689-
print()
690-
print('Cache misses by data type:')
691-
dm_todo = (('Demand data:', arc_stats['demand_data_misses']),
692-
('Prefetch data:',
693-
arc_stats['prefetch_data_misses']),
694-
('Demand metadata:', arc_stats['demand_metadata_misses']),
695-
('Prefetch metadata:',
696-
arc_stats['prefetch_metadata_misses']))
697-
698-
for title, value in dm_todo:
699-
prt_i2(title, f_perc(value, arc_stats['misses']), f_hits(value))
700-
751+
prt_i2(title, f_perc(value, all_accesses), f_hits(value))
701752
print()
702753

703754

@@ -708,11 +759,17 @@ def section_dmu(kstats_dict):
708759

709760
zfetch_access_total = int(zfetch_stats['hits'])+int(zfetch_stats['misses'])
710761

711-
prt_1('DMU prefetch efficiency:', f_hits(zfetch_access_total))
712-
prt_i2('Hit ratio:', f_perc(zfetch_stats['hits'], zfetch_access_total),
762+
prt_1('DMU predictive prefetcher calls:', f_hits(zfetch_access_total))
763+
prt_i2('Stream hits:',
764+
f_perc(zfetch_stats['hits'], zfetch_access_total),
713765
f_hits(zfetch_stats['hits']))
714-
prt_i2('Miss ratio:', f_perc(zfetch_stats['misses'], zfetch_access_total),
766+
prt_i2('Stream misses:',
767+
f_perc(zfetch_stats['misses'], zfetch_access_total),
715768
f_hits(zfetch_stats['misses']))
769+
prt_i2('Streams limit reached:',
770+
f_perc(zfetch_stats['max_streams'], zfetch_stats['misses']),
771+
f_hits(zfetch_stats['max_streams']))
772+
prt_i1('Prefetches issued', f_hits(zfetch_stats['io_issued']))
716773
print()
717774

718775

0 commit comments

Comments
 (0)