Skip to content

Commit

Permalink
arcstat: add structural, types, states breakdown
Browse files Browse the repository at this point in the history
add ARC structural breakdown, ARC types breakdown, ARC states breakdown similar to arc_summary

Signed-off-by: Theera K. <[email protected]>
  • Loading branch information
tkittich authored Sep 7, 2024
1 parent cbf3db7 commit 22be917
Showing 1 changed file with 86 additions and 21 deletions.
107 changes: 86 additions & 21 deletions cmd/arcstat.in
Original file line number Diff line number Diff line change
Expand Up @@ -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%",
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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"]
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 22be917

Please sign in to comment.