Skip to content

Commit

Permalink
Add FreeBSD code to arc_summary and arcstat
Browse files Browse the repository at this point in the history
Adding the FreeBSD code allows arc_summary and arcstat
to be used on FreeBSD.

Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Ryan Moeller <[email protected]>
Closes #9641
  • Loading branch information
Ryan Moeller authored and behlendorf committed Nov 30, 2019
1 parent c54687c commit 101f9b1
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 6 deletions.
15 changes: 14 additions & 1 deletion cmd/arc_summary/arc_summary2
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,20 @@ from subprocess import Popen, PIPE
from decimal import Decimal as D


if sys.platform.startswith('linux'):
if sys.platform.startswith('freebsd'):
# Requires py27-sysctl on FreeBSD
import sysctl

def load_kstats(namespace):
"""Collect information on a specific subsystem of the ARC"""

base = 'kstat.zfs.misc.%s.' % namespace
return [(kstat.name, D(kstat.value)) for kstat in sysctl.filter(base)]

def load_tunables():
return dict((ctl.name, ctl.value) for ctl in sysctl.filter('vfs.zfs'))

elif sys.platform.startswith('linux'):

def load_kstats(namespace):
"""Collect information on a specific subsystem of the ARC"""
Expand Down
44 changes: 40 additions & 4 deletions cmd/arc_summary/arc_summary3
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,42 @@ parser.add_argument('-s', '--section', dest='section', help=SECTION_HELP)
ARGS = parser.parse_args()


if sys.platform.startswith('linux'):
KSTAT_PATH = '/proc/spl/kstat/zfs/'
SPL_PATH = '/sys/module/spl/parameters/'
TUNABLES_PATH = '/sys/module/zfs/parameters/'
if sys.platform.startswith('freebsd'):
# Requires py36-sysctl on FreeBSD
import sysctl

VDEV_CACHE_SIZE = 'vdev.cache_size'

def load_kstats(section):
base = 'kstat.zfs.misc.{section}.'.format(section=section)
# base is removed from the name
fmt = lambda kstat: '{name} : {value}'.format(name=kstat.name[len(base):],
value=kstat.value)
return [fmt(kstat) for kstat in sysctl.filter(base)]

def get_params(base):
cut = 8 # = len('vfs.zfs.')
return {ctl.name[cut:]: str(ctl.value) for ctl in sysctl.filter(base)}

def get_tunable_params():
return get_params('vfs.zfs')

def get_vdev_params():
return get_params('vfs.zfs.vdev')

def get_version_impl(request):
# FreeBSD reports versions for zpl and spa instead of zfs and spl.
name = {'zfs': 'zpl',
'spl': 'spa'}[request]
mib = 'vfs.zfs.version.{}'.format(name)
version = sysctl.filter(mib)[0].value
return '{} version {}'.format(name, version)

elif sys.platform.startswith('linux'):
KSTAT_PATH = '/proc/spl/kstat/zfs'
SPL_PATH = '/sys/module/spl/parameters'
TUNABLES_PATH = '/sys/module/zfs/parameters'

VDEV_CACHE_SIZE = 'zfs_vdev_cache_size'

def load_kstats(section):
Expand Down Expand Up @@ -720,6 +752,10 @@ def section_spl(*_):
and/or descriptions. This does not use kstats.
"""

if sys.platform.startswith('freebsd'):
# No SPL support in FreeBSD
return

spls = get_spl_params()
keylist = sorted(spls.keys())
print('Solaris Porting Layer (SPL):')
Expand Down
24 changes: 23 additions & 1 deletion cmd/arcstat/arcstat
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,29 @@ out = None
kstat = None


if sys.platform.startswith('linux'):
if sys.platform.startswith('freebsd'):
# Requires py27-sysctl on FreeBSD
import sysctl

def kstat_update():
global kstat

k = sysctl.filter('kstat.zfs.misc.arcstats')

if not k:
sys.exit(1)

kstat = {}

for s in k:
if not s:
continue

name, value = s.name, s.value
# Trims 'kstat.zfs.misc.arcstats' from the name
kstat[name[24:]] = Decimal(value)

elif sys.platform.startswith('linux'):
def kstat_update():
global kstat

Expand Down

0 comments on commit 101f9b1

Please sign in to comment.