arcstat: Add -a and -p options from FreeNAS

Added -a option to automatically print all valid statistics.
Added -p option to suppress scaling of printed data.

Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Authored by: Nick Principe <32284693+powernap@users.noreply.github.com>
Ported-by: Ryan Moeller <ryan@iXsystems.com>
Signed-off-by: Ryan Moeller <ryan@iXsystems.com>
Closes #11090
This commit is contained in:
Ryan Moeller 2020-10-21 17:09:14 -04:00 committed by Brian Behlendorf
parent 4df31aa98c
commit 3b79394bc9
2 changed files with 52 additions and 8 deletions

View File

@ -118,12 +118,13 @@ opfile = None
sep = " " # Default separator is 2 spaces sep = " " # Default separator is 2 spaces
version = "0.4" version = "0.4"
l2exist = False l2exist = False
cmd = ("Usage: arcstat [-hvx] [-f fields] [-o file] [-s string] [interval " cmd = ("Usage: arcstat [-havxp] [-f fields] [-o file] [-s string] [interval "
"[count]]\n") "[count]]\n")
cur = {} cur = {}
d = {} d = {}
out = None out = None
kstat = None kstat = None
pretty_print = True
if sys.platform.startswith('freebsd'): if sys.platform.startswith('freebsd'):
@ -181,6 +182,7 @@ def detailed_usage():
def usage(): def usage():
sys.stderr.write("%s\n" % cmd) sys.stderr.write("%s\n" % cmd)
sys.stderr.write("\t -h : Print this help message\n") sys.stderr.write("\t -h : Print this help message\n")
sys.stderr.write("\t -a : Print all possible stats\n")
sys.stderr.write("\t -v : List all possible field headers and definitions" sys.stderr.write("\t -v : List all possible field headers and definitions"
"\n") "\n")
sys.stderr.write("\t -x : Print extended stats\n") sys.stderr.write("\t -x : Print extended stats\n")
@ -188,6 +190,7 @@ def usage():
sys.stderr.write("\t -o : Redirect output to the specified file\n") sys.stderr.write("\t -o : Redirect output to the specified file\n")
sys.stderr.write("\t -s : Override default field separator with custom " sys.stderr.write("\t -s : Override default field separator with custom "
"character or string\n") "character or string\n")
sys.stderr.write("\t -p : Disable auto-scaling of numerical fields\n")
sys.stderr.write("\nExamples:\n") sys.stderr.write("\nExamples:\n")
sys.stderr.write("\tarcstat -o /tmp/a.log 2 10\n") sys.stderr.write("\tarcstat -o /tmp/a.log 2 10\n")
sys.stderr.write("\tarcstat -s \",\" -o /tmp/a.log 2 10\n") sys.stderr.write("\tarcstat -s \",\" -o /tmp/a.log 2 10\n")
@ -246,10 +249,14 @@ def print_values():
global hdr global hdr
global sep global sep
global v global v
global pretty_print
sys.stdout.write(sep.join( if pretty_print:
prettynum(cols[col][0], cols[col][1], v[col]) for col in hdr)) fmt = lambda col: prettynum(cols[col][0], cols[col][1], v[col])
else:
fmt = lambda col: v[col]
sys.stdout.write(sep.join(fmt(col) for col in hdr))
sys.stdout.write("\n") sys.stdout.write("\n")
sys.stdout.flush() sys.stdout.flush()
@ -257,9 +264,14 @@ def print_values():
def print_header(): def print_header():
global hdr global hdr
global sep global sep
global pretty_print
sys.stdout.write(sep.join("%*s" % (cols[col][0], col) for col in hdr)) if pretty_print:
fmt = lambda col: "%*s" % (cols[col][0], col)
else:
fmt = lambda col: col
sys.stdout.write(sep.join(fmt(col) for col in hdr))
sys.stdout.write("\n") sys.stdout.write("\n")
@ -296,8 +308,10 @@ def init():
global sep global sep
global out global out
global l2exist global l2exist
global pretty_print
desired_cols = None desired_cols = None
aflag = False
xflag = False xflag = False
hflag = False hflag = False
vflag = False vflag = False
@ -306,14 +320,16 @@ def init():
try: try:
opts, args = getopt.getopt( opts, args = getopt.getopt(
sys.argv[1:], sys.argv[1:],
"xo:hvs:f:", "axo:hvs:f:p",
[ [
"all",
"extended", "extended",
"outfile", "outfile",
"help", "help",
"verbose", "verbose",
"separator", "separator",
"columns" "columns",
"parsable"
] ]
) )
except getopt.error as msg: except getopt.error as msg:
@ -322,6 +338,8 @@ def init():
opts = None opts = None
for opt, arg in opts: for opt, arg in opts:
if opt in ('-a', '--all'):
aflag = True
if opt in ('-x', '--extended'): if opt in ('-x', '--extended'):
xflag = True xflag = True
if opt in ('-o', '--outfile'): if opt in ('-o', '--outfile'):
@ -337,6 +355,8 @@ def init():
if opt in ('-f', '--columns'): if opt in ('-f', '--columns'):
desired_cols = arg desired_cols = arg
i += 1 i += 1
if opt in ('-p', '--parsable'):
pretty_print = False
i += 1 i += 1
argv = sys.argv[i:] argv = sys.argv[i:]
@ -381,6 +401,12 @@ def init():
incompat) incompat)
usage() usage()
if aflag:
if l2exist:
hdr = cols.keys()
else:
hdr = [col for col in cols.keys() if not col.startswith("l2")]
if opfile: if opfile:
try: try:
out = open(opfile, "w") out = open(opfile, "w")

View File

@ -13,13 +13,13 @@
.\" Copyright (c) 2015 by Delphix. All rights reserved. .\" Copyright (c) 2015 by Delphix. All rights reserved.
.\" Copyright (c) 2020 by AJ Jordan. All rights reserved. .\" Copyright (c) 2020 by AJ Jordan. All rights reserved.
.\" .\"
.TH ARCSTAT 1 "Aug 24, 2020" OpenZFS .TH ARCSTAT 1 "Oct 20, 2020" OpenZFS
.SH NAME .SH NAME
arcstat \- report ZFS ARC and L2ARC statistics arcstat \- report ZFS ARC and L2ARC statistics
.SH SYNOPSIS .SH SYNOPSIS
.LP .LP
.nf .nf
\fBarcstat\fR [\fB-hvx\fR] [\fB-f field[,field]...\fR] [\fB-o file\fR] [\fB-s string\fR] [\fBinterval\fR [\fBcount\fR]] \fBarcstat\fR [\fB-havxp\fR] [\fB-f field[,field]...\fR] [\fB-o file\fR] [\fB-s string\fR] [\fBinterval\fR [\fBcount\fR]]
.fi .fi
.SH DESCRIPTION .SH DESCRIPTION
@ -420,6 +420,15 @@ May temporarily be negative, in which case the ARC will reduce the target size \
.LP .LP
The following options are supported: The following options are supported:
.sp
.ne 2
.na
\fB\fB-a\fR\fR
.ad
.RS 12n
Print all possible stats.
.RE
.sp .sp
.ne 2 .ne 2
.na .na
@ -447,6 +456,15 @@ Display help message.
Report statistics to a file instead of the standard output. Report statistics to a file instead of the standard output.
.RE .RE
.sp
.ne 2
.na
\fB\fB-p\fR\fR
.ad
.RS 12n
Disable auto-scaling of numerical fields (for raw, machine-parsable values).
.RE
.sp .sp
.ne 2 .ne 2
.na .na