From 22be917a2ff5b0c066a3fe3908bf23a05ff381b3 Mon Sep 17 00:00:00 2001 From: "Theera K." Date: Sat, 7 Sep 2024 09:05:47 +0700 Subject: [PATCH] arcstat: add structural, types, states breakdown add ARC structural breakdown, ARC types breakdown, ARC states breakdown similar to arc_summary Signed-off-by: Theera K. --- cmd/arcstat.in | 107 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 86 insertions(+), 21 deletions(-) diff --git a/cmd/arcstat.in b/cmd/arcstat.in index 168a1c8973b5..8ffd9e1f0689 100755 --- a/cmd/arcstat.in +++ b/cmd/arcstat.in @@ -169,23 +169,74 @@ cols = { "zissued": [7, 1000, "zfetch prefetches issued per second"], "zactive": [7, 1000, "zfetch prefetches active per second"], } -fields = { - "ano": ["anon", "Anonymous"], - "mfu": ["mfu", "MFU"], - "mru": ["mru", "MRU"], - "unc": ["uncached", "Uncached"], + +# ARC structural breakdown from arc_summary +structfields = { + "cp": ["compressed", "Compressed"], + "oh": ["overhead", "Overhead"], + "bn": ["bonus", "Bonus"], + "dn": ["dnode", "Dnode"], + "db": ["dbuf", "Dbuf"], + "hdr": ["hdr", "Header"], + "l2h": ["l2_hdr", "L2 header"], + "adb": ["abd_chunk_waste", "ABD chunk waste"], +} +structstats = { # size stats + "percent": "size", # show percentage of this value + "sz": ["_size", "size"], +} + +# ARC types breakdown from arc_summary +typefields = { + "data": ["data", "ARC data"], + "meta": ["metadata", "ARC metadata"], +} +typestats = { # size stats + "percent": "cachessz", # show percentage of this value + "sz": ["_size", "size"], +} + +# ARC states breakdown from arc_summary +statefields = { + "ano": ["anon", "Anonymous"], + "mfu": ["mfu", "MFU"], + "mru": ["mru", "MRU"], + "unc": ["uncached", "Uncached"], +} +statestats = { # size stats + "percent": "cachessz", # show percentage of this value + "sz": ["_size", "size"], + "data": ["_data", "data size"], + "meta": ["_metadata", "metadata size"], + "edata": ["_evictable_data", "evictable data size"], + "emeta": ["_evictable_metadata", "evictable metadata size"], } -stats = { - "sz": ["_size", "size"], - "data": ["_data", "data size"], - "meta": ["_metadata", "metadata size"], - "edata": ["_evictable_data", "evictable data size"], - "emeta": ["_evictable_metadata", "evictable metadata size"], +gstatestats = { # ghost stats + "fields": ["mfu", "mru"], # only applicable to these fields + "gsz": ["_ghost_size", "ghost size"], + "gdata": ["_ghost_data", "ghost data size"], + "gmeta": ["_ghost_metadata", "ghost metadata size"], } -for stat, statval in stats.items(): + +# fields and stats +fieldstats = [ + [structfields, structstats], + [typefields, typestats], + [statefields, statestats, gstatestats], +] +for fs in fieldstats: + (fields, stats) = fs[0], fs[1:] for field, fieldval in fields.items(): - colname = field + stat - cols[colname] = [len(colname), 1024, fieldval[1] + " " + statval[1]] + for group in stats: + for stat, statval in group.items(): + if stat in ["fields", "percent"] or \ + ("fields" in group and field not in group["fields"]): + continue + colname = field + stat + coldesc = fieldval[1] + " " + statval[1] + cols[colname] = [len(colname), 1024, coldesc] + if "percent" in group: + cols[colname + "%"] = [len(colname) + 1, 100, coldesc + " percentage"] v = {} hdr = ["time", "read", "ddread", "ddh%", "dmread", "dmh%", "pread", "ph%", @@ -524,9 +575,8 @@ def calculate(): global d global v global l2exist - global fields - global stats - + global fieldstats + v = dict() v["time"] = time.strftime("%H:%M:%S", time.localtime()) v["hits"] = d["hits"] // sint @@ -605,10 +655,6 @@ def calculate(): v["mi%"] = 100 * v["mioh"] // v["mread"] if v["mread"] > 0 else 0 v["mm%"] = 100 - v["mh%"] - v["mi%"] if v["mread"] > 0 else 0 - for stat, statval in stats.items(): - for field, fieldval in fields.items(): - v[field + stat] = cur[fieldval[0] + statval[0]] - v["arcsz"] = cur["size"] v["size"] = cur["size"] v["c"] = cur["c"] @@ -637,6 +683,25 @@ def calculate(): v["zissued"] = d["zfetch_io_issued"] // sint v["zactive"] = d["zfetch_io_active"] // sint + # caches_size from arc_summary + v["cachessz"] = cur["anon_data"]+cur["anon_metadata"]+\ + cur["mfu_data"]+cur["mfu_metadata"]+cur["mru_data"]+cur["mru_metadata"]+\ + cur["uncached_data"]+cur["uncached_metadata"] + + # ARC structural breakdown, ARC types breakdown, ARC states breakdown + for fs in fieldstats: + (fields, stats) = fs[0], fs[1:] + for field, fieldval in fields.items(): + for group in stats: + for stat, statval in group.items(): + if stat in ["fields", "percent"] or \ + ("fields" in group and field not in group["fields"]): + continue + colname = field + stat + v[colname] = cur[fieldval[0] + statval[0]] + if "percent" in group: + v[colname + "%"] = 100 * v[colname] // v[group["percent"]] if v[group["percent"]] > 0 else 0 + if l2exist: v["l2hits"] = d["l2_hits"] // sint v["l2miss"] = d["l2_misses"] // sint