summaryrefslogtreecommitdiff
path: root/tools/mountstats
diff options
context:
space:
mode:
authorBohuslav Kabrda <bkabrda@redhat.com>2013-09-18 12:00:25 -0400
committerSteve Dickson <steved@redhat.com>2013-09-18 15:10:26 -0400
commitb703eabe4c4bc5c2d5fd9a07b6b995d67ea7e77a (patch)
tree29099b692f105c72a0280992fd567c6e078cdc5f /tools/mountstats
parentcbf22367d0b1c1e200a51ec1e33f5438d1edd14f (diff)
downloadnfs-utils-b703eabe4c4bc5c2d5fd9a07b6b995d67ea7e77a.tar.gz
mountstats: Make mountstats Python 3 compatible
This will make mountstat run on Python 2.6, 2.7 and >= 3.0 Signed-off-by: Bohuslav Kabrda <bkabrda@redhat.com> Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'tools/mountstats')
-rw-r--r--tools/mountstats/mountstats.py310
1 files changed, 155 insertions, 155 deletions
diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
index b95b71d..3f5fea5 100644
--- a/tools/mountstats/mountstats.py
+++ b/tools/mountstats/mountstats.py
@@ -53,7 +53,7 @@ class DeviceData:
if words[6].find('nfs') != -1:
self.__nfs_data['statvers'] = words[7]
elif words[0] == 'age:':
- self.__nfs_data['age'] = long(words[1])
+ self.__nfs_data['age'] = int(words[1])
elif words[0] == 'opts:':
self.__nfs_data['mountoptions'] = ''.join(words[1:]).split(',')
elif words[0] == 'caps:':
@@ -91,12 +91,12 @@ class DeviceData:
self.__nfs_data['shortwrites'] = int(words[22])
self.__nfs_data['delay'] = int(words[23])
elif words[0] == 'bytes:':
- self.__nfs_data['normalreadbytes'] = long(words[1])
- self.__nfs_data['normalwritebytes'] = long(words[2])
- self.__nfs_data['directreadbytes'] = long(words[3])
- self.__nfs_data['directwritebytes'] = long(words[4])
- self.__nfs_data['serverreadbytes'] = long(words[5])
- self.__nfs_data['serverwritebytes'] = long(words[6])
+ self.__nfs_data['normalreadbytes'] = int(words[1])
+ self.__nfs_data['normalwritebytes'] = int(words[2])
+ self.__nfs_data['directreadbytes'] = int(words[3])
+ self.__nfs_data['directwritebytes'] = int(words[4])
+ self.__nfs_data['serverreadbytes'] = int(words[5])
+ self.__nfs_data['serverwritebytes'] = int(words[6])
def __parse_rpc_line(self, words):
if words[0] == 'RPC':
@@ -110,8 +110,8 @@ class DeviceData:
self.__rpc_data['rpcsends'] = int(words[4])
self.__rpc_data['rpcreceives'] = int(words[5])
self.__rpc_data['badxids'] = int(words[6])
- self.__rpc_data['inflightsends'] = long(words[7])
- self.__rpc_data['backlogutil'] = long(words[8])
+ self.__rpc_data['inflightsends'] = int(words[7])
+ self.__rpc_data['backlogutil'] = int(words[8])
elif words[1] == 'tcp':
self.__rpc_data['port'] = words[2]
self.__rpc_data['bind_count'] = int(words[3])
@@ -121,7 +121,7 @@ class DeviceData:
self.__rpc_data['rpcsends'] = int(words[7])
self.__rpc_data['rpcreceives'] = int(words[8])
self.__rpc_data['badxids'] = int(words[9])
- self.__rpc_data['inflightsends'] = long(words[10])
+ self.__rpc_data['inflightsends'] = int(words[10])
self.__rpc_data['backlogutil'] = int(words[11])
elif words[1] == 'rdma':
self.__rpc_data['port'] = words[2]
@@ -148,7 +148,7 @@ class DeviceData:
else:
op = words[0][:-1]
self.__rpc_data['ops'] += [op]
- self.__rpc_data[op] = [long(word) for word in words[1:]]
+ self.__rpc_data[op] = [int(word) for word in words[1:]]
def parse_stats(self, lines):
"""Turn a list of lines from a mount stat file into a
@@ -179,81 +179,81 @@ class DeviceData:
def display_nfs_options(self):
"""Pretty-print the NFS options
"""
- print 'Stats for %s mounted on %s:' % \
- (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
-
- print ' NFS mount options: %s' % ','.join(self.__nfs_data['mountoptions'])
- print ' NFS server capabilities: %s' % ','.join(self.__nfs_data['servercapabilities'])
- if self.__nfs_data.has_key('nfsv4flags'):
- print ' NFSv4 capability flags: %s' % ','.join(self.__nfs_data['nfsv4flags'])
- if self.__nfs_data.has_key('pseudoflavor'):
- print ' NFS security flavor: %d pseudoflavor: %d' % \
- (self.__nfs_data['flavor'], self.__nfs_data['pseudoflavor'])
+ print('Stats for %s mounted on %s:' % \
+ (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
+
+ print(' NFS mount options: %s' % ','.join(self.__nfs_data['mountoptions']))
+ print(' NFS server capabilities: %s' % ','.join(self.__nfs_data['servercapabilities']))
+ if 'nfsv4flags' in self.__nfs_data:
+ print(' NFSv4 capability flags: %s' % ','.join(self.__nfs_data['nfsv4flags']))
+ if 'pseudoflavor' in self.__nfs_data:
+ print(' NFS security flavor: %d pseudoflavor: %d' % \
+ (self.__nfs_data['flavor'], self.__nfs_data['pseudoflavor']))
else:
- print ' NFS security flavor: %d' % self.__nfs_data['flavor']
+ print(' NFS security flavor: %d' % self.__nfs_data['flavor'])
def display_nfs_events(self):
"""Pretty-print the NFS event counters
"""
- print
- print 'Cache events:'
- print ' data cache invalidated %d times' % self.__nfs_data['datainvalidates']
- print ' attribute cache invalidated %d times' % self.__nfs_data['attrinvalidates']
- print ' inodes synced %d times' % self.__nfs_data['syncinodes']
- print
- print 'VFS calls:'
- print ' VFS requested %d inode revalidations' % self.__nfs_data['inoderevalidates']
- print ' VFS requested %d dentry revalidations' % self.__nfs_data['dentryrevalidates']
- print
- print ' VFS called nfs_readdir() %d times' % self.__nfs_data['vfsreaddir']
- print ' VFS called nfs_lookup() %d times' % self.__nfs_data['vfslookup']
- print ' VFS called nfs_permission() %d times' % self.__nfs_data['vfspermission']
- print ' VFS called nfs_file_open() %d times' % self.__nfs_data['vfsopen']
- print ' VFS called nfs_file_flush() %d times' % self.__nfs_data['vfsflush']
- print ' VFS called nfs_lock() %d times' % self.__nfs_data['vfslock']
- print ' VFS called nfs_fsync() %d times' % self.__nfs_data['vfsfsync']
- print ' VFS called nfs_file_release() %d times' % self.__nfs_data['vfsrelease']
- print
- print 'VM calls:'
- print ' VFS called nfs_readpage() %d times' % self.__nfs_data['vfsreadpage']
- print ' VFS called nfs_readpages() %d times' % self.__nfs_data['vfsreadpages']
- print ' VFS called nfs_writepage() %d times' % self.__nfs_data['vfswritepage']
- print ' VFS called nfs_writepages() %d times' % self.__nfs_data['vfswritepages']
- print
- print 'Generic NFS counters:'
- print ' File size changing operations:'
- print ' truncating SETATTRs: %d extending WRITEs: %d' % \
- (self.__nfs_data['setattrtrunc'], self.__nfs_data['extendwrite'])
- print ' %d silly renames' % self.__nfs_data['sillyrenames']
- print ' short reads: %d short writes: %d' % \
- (self.__nfs_data['shortreads'], self.__nfs_data['shortwrites'])
- print ' NFSERR_DELAYs from server: %d' % self.__nfs_data['delay']
+ print()
+ print('Cache events:')
+ print(' data cache invalidated %d times' % self.__nfs_data['datainvalidates'])
+ print(' attribute cache invalidated %d times' % self.__nfs_data['attrinvalidates'])
+ print(' inodes synced %d times' % self.__nfs_data['syncinodes'])
+ print()
+ print('VFS calls:')
+ print(' VFS requested %d inode revalidations' % self.__nfs_data['inoderevalidates'])
+ print(' VFS requested %d dentry revalidations' % self.__nfs_data['dentryrevalidates'])
+ print()
+ print(' VFS called nfs_readdir() %d times' % self.__nfs_data['vfsreaddir'])
+ print(' VFS called nfs_lookup() %d times' % self.__nfs_data['vfslookup'])
+ print(' VFS called nfs_permission() %d times' % self.__nfs_data['vfspermission'])
+ print(' VFS called nfs_file_open() %d times' % self.__nfs_data['vfsopen'])
+ print(' VFS called nfs_file_flush() %d times' % self.__nfs_data['vfsflush'])
+ print(' VFS called nfs_lock() %d times' % self.__nfs_data['vfslock'])
+ print(' VFS called nfs_fsync() %d times' % self.__nfs_data['vfsfsync'])
+ print(' VFS called nfs_file_release() %d times' % self.__nfs_data['vfsrelease'])
+ print()
+ print('VM calls:')
+ print(' VFS called nfs_readpage() %d times' % self.__nfs_data['vfsreadpage'])
+ print(' VFS called nfs_readpages() %d times' % self.__nfs_data['vfsreadpages'])
+ print(' VFS called nfs_writepage() %d times' % self.__nfs_data['vfswritepage'])
+ print(' VFS called nfs_writepages() %d times' % self.__nfs_data['vfswritepages'])
+ print()
+ print('Generic NFS counters:')
+ print(' File size changing operations:')
+ print(' truncating SETATTRs: %d extending WRITEs: %d' % \
+ (self.__nfs_data['setattrtrunc'], self.__nfs_data['extendwrite']))
+ print(' %d silly renames' % self.__nfs_data['sillyrenames'])
+ print(' short reads: %d short writes: %d' % \
+ (self.__nfs_data['shortreads'], self.__nfs_data['shortwrites']))
+ print(' NFSERR_DELAYs from server: %d' % self.__nfs_data['delay'])
def display_nfs_bytes(self):
"""Pretty-print the NFS event counters
"""
- print
- print 'NFS byte counts:'
- print ' applications read %d bytes via read(2)' % self.__nfs_data['normalreadbytes']
- print ' applications wrote %d bytes via write(2)' % self.__nfs_data['normalwritebytes']
- print ' applications read %d bytes via O_DIRECT read(2)' % self.__nfs_data['directreadbytes']
- print ' applications wrote %d bytes via O_DIRECT write(2)' % self.__nfs_data['directwritebytes']
- print ' client read %d bytes via NFS READ' % self.__nfs_data['serverreadbytes']
- print ' client wrote %d bytes via NFS WRITE' % self.__nfs_data['serverwritebytes']
+ print()
+ print('NFS byte counts:')
+ print(' applications read %d bytes via read(2)' % self.__nfs_data['normalreadbytes'])
+ print(' applications wrote %d bytes via write(2)' % self.__nfs_data['normalwritebytes'])
+ print(' applications read %d bytes via O_DIRECT read(2)' % self.__nfs_data['directreadbytes'])
+ print(' applications wrote %d bytes via O_DIRECT write(2)' % self.__nfs_data['directwritebytes'])
+ print(' client read %d bytes via NFS READ' % self.__nfs_data['serverreadbytes'])
+ print(' client wrote %d bytes via NFS WRITE' % self.__nfs_data['serverwritebytes'])
def display_rpc_generic_stats(self):
"""Pretty-print the generic RPC stats
"""
sends = self.__rpc_data['rpcsends']
- print
- print 'RPC statistics:'
+ print()
+ print('RPC statistics:')
- print ' %d RPC requests sent, %d RPC replies received (%d XIDs not found)' % \
- (sends, self.__rpc_data['rpcreceives'], self.__rpc_data['badxids'])
+ print(' %d RPC requests sent, %d RPC replies received (%d XIDs not found)' % \
+ (sends, self.__rpc_data['rpcreceives'], self.__rpc_data['badxids']))
if sends != 0:
- print ' average backlog queue length: %d' % \
- (float(self.__rpc_data['backlogutil']) / sends)
+ print(' average backlog queue length: %d' % \
+ (float(self.__rpc_data['backlogutil']) / sends))
def display_rpc_op_stats(self):
"""Pretty-print the per-op stats
@@ -261,23 +261,23 @@ class DeviceData:
sends = self.__rpc_data['rpcsends']
# XXX: these should be sorted by 'count'
- print
+ print()
for op in self.__rpc_data['ops']:
stats = self.__rpc_data[op]
count = stats[0]
retrans = stats[1] - count
if count != 0:
- print '%s:' % op
- print '\t%d ops (%d%%)' % \
- (count, ((count * 100) / sends)),
- print '\t%d retrans (%d%%)' % (retrans, ((retrans * 100) / count)),
- print '\t%d major timeouts' % stats[2]
- print '\tavg bytes sent per op: %d\tavg bytes received per op: %d' % \
- (stats[3] / count, stats[4] / count)
- print '\tbacklog wait: %f' % (float(stats[5]) / count),
- print '\tRTT: %f' % (float(stats[6]) / count),
- print '\ttotal execute time: %f (milliseconds)' % \
- (float(stats[7]) / count)
+ print('%s:' % op)
+ print('\t%d ops (%d%%)' % \
+ (count, ((count * 100) / sends)), end=' ')
+ print('\t%d retrans (%d%%)' % (retrans, ((retrans * 100) / count)), end=' ')
+ print('\t%d major timeouts' % stats[2])
+ print('\tavg bytes sent per op: %d\tavg bytes received per op: %d' % \
+ (stats[3] / count, stats[4] / count))
+ print('\tbacklog wait: %f' % (float(stats[5]) / count), end=' ')
+ print('\tRTT: %f' % (float(stats[6]) / count), end=' ')
+ print('\ttotal execute time: %f (milliseconds)' % \
+ (float(stats[7]) / count))
def compare_iostats(self, old_stats):
"""Return the difference between two sets of stats
@@ -285,9 +285,9 @@ class DeviceData:
result = DeviceData()
# copy self into result
- for key, value in self.__nfs_data.iteritems():
+ for key, value in self.__nfs_data.items():
result.__nfs_data[key] = value
- for key, value in self.__rpc_data.iteritems():
+ for key, value in self.__rpc_data.items():
result.__rpc_data[key] = value
# compute the difference of each item in the list
@@ -295,7 +295,7 @@ class DeviceData:
# the reference to them. so we build new lists here
# for the result object.
for op in result.__rpc_data['ops']:
- result.__rpc_data[op] = map(difference, self.__rpc_data[op], old_stats.__rpc_data[op])
+ result.__rpc_data[op] = list(map(difference, self.__rpc_data[op], old_stats.__rpc_data[op]))
# update the remaining keys we care about
result.__rpc_data['rpcsends'] -= old_stats.__rpc_data['rpcsends']
@@ -312,17 +312,17 @@ class DeviceData:
if sample_time == 0:
sample_time = float(self.__nfs_data['age'])
- print
- print '%s mounted on %s:' % \
- (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
+ print()
+ print('%s mounted on %s:' % \
+ (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
- print '\top/s\trpc bklog'
- print '\t%.2f' % (sends / sample_time),
+ print('\top/s\trpc bklog')
+ print('\t%.2f' % (sends / sample_time), end=' ')
if sends != 0:
- print '\t%.2f' % \
- ((float(self.__rpc_data['backlogutil']) / sends) / sample_time)
+ print('\t%.2f' % \
+ ((float(self.__rpc_data['backlogutil']) / sends) / sample_time))
else:
- print '\t0.00'
+ print('\t0.00')
# reads: ops/s, kB/s, avg rtt, and avg exe
# XXX: include avg xfer size and retransmits?
@@ -332,15 +332,15 @@ class DeviceData:
rtt = float(read_rpc_stats[6])
exe = float(read_rpc_stats[7])
- print '\treads:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)'
- print '\t\t%.2f' % (ops / sample_time),
- print '\t\t%.2f' % (kilobytes / sample_time),
+ print('\treads:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)')
+ print('\t\t%.2f' % (ops / sample_time), end=' ')
+ print('\t\t%.2f' % (kilobytes / sample_time), end=' ')
if ops != 0:
- print '\t\t%.2f' % (rtt / ops),
- print '\t\t%.2f' % (exe / ops)
+ print('\t\t%.2f' % (rtt / ops), end=' ')
+ print('\t\t%.2f' % (exe / ops))
else:
- print '\t\t0.00',
- print '\t\t0.00'
+ print('\t\t0.00', end=' ')
+ print('\t\t0.00')
# writes: ops/s, kB/s, avg rtt, and avg exe
# XXX: include avg xfer size and retransmits?
@@ -350,15 +350,15 @@ class DeviceData:
rtt = float(write_rpc_stats[6])
exe = float(write_rpc_stats[7])
- print '\twrites:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)'
- print '\t\t%.2f' % (ops / sample_time),
- print '\t\t%.2f' % (kilobytes / sample_time),
+ print('\twrites:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)')
+ print('\t\t%.2f' % (ops / sample_time), end=' ')
+ print('\t\t%.2f' % (kilobytes / sample_time), end=' ')
if ops != 0:
- print '\t\t%.2f' % (rtt / ops),
- print '\t\t%.2f' % (exe / ops)
+ print('\t\t%.2f' % (rtt / ops), end=' ')
+ print('\t\t%.2f' % (exe / ops))
else:
- print '\t\t0.00',
- print '\t\t0.00'
+ print('\t\t0.00', end=' ')
+ print('\t\t0.00')
def parse_stats_file(filename):
"""pop the contents of a mountstats file into a dictionary,
@@ -388,18 +388,18 @@ def parse_stats_file(filename):
return ms_dict
def print_mountstats_help(name):
- print 'usage: %s [ options ] <mount point>' % name
- print
- print ' Version %s' % Mountstats_version
- print
- print ' Display NFS client per-mount statistics.'
- print
- print ' --version display the version of this command'
- print ' --nfs display only the NFS statistics'
- print ' --rpc display only the RPC statistics'
- print ' --start sample and save statistics'
- print ' --end resample statistics and compare them with saved'
- print
+ print('usage: %s [ options ] <mount point>' % name)
+ print()
+ print(' Version %s' % Mountstats_version)
+ print()
+ print(' Display NFS client per-mount statistics.')
+ print()
+ print(' --version display the version of this command')
+ print(' --nfs display only the NFS statistics')
+ print(' --rpc display only the RPC statistics')
+ print(' --start sample and save statistics')
+ print(' --end resample statistics and compare them with saved')
+ print()
def mountstats_command():
"""Mountstats command
@@ -414,7 +414,7 @@ def mountstats_command():
return
if arg in ['-v', '--version', 'version']:
- print '%s version %s' % (sys.argv[0], Mountstats_version)
+ print('%s version %s' % (sys.argv[0], Mountstats_version))
sys.exit(0)
if arg in ['-n', '--nfs']:
@@ -426,10 +426,10 @@ def mountstats_command():
continue
if arg in ['-s', '--start']:
- raise Exception, 'Sampling is not yet implemented'
+ raise Exception('Sampling is not yet implemented')
if arg in ['-e', '--end']:
- raise Exception, 'Sampling is not yet implemented'
+ raise Exception('Sampling is not yet implemented')
if arg == sys.argv[0]:
continue
@@ -448,14 +448,14 @@ def mountstats_command():
for mp in mountpoints:
if mp not in mountstats:
- print 'Statistics for mount point %s not found' % mp
+ print('Statistics for mount point %s not found' % mp)
continue
stats = DeviceData()
stats.parse_stats(mountstats[mp])
if not stats.is_nfs_mountpoint():
- print 'Mount point %s exists but is not an NFS mount' % mp
+ print('Mount point %s exists but is not an NFS mount' % mp)
continue
if nfs_only:
@@ -472,37 +472,37 @@ def mountstats_command():
stats.display_rpc_op_stats()
def print_nfsstat_help(name):
- print 'usage: %s [ options ]' % name
- print
- print ' Version %s' % Mountstats_version
- print
- print ' nfsstat-like program that uses NFS client per-mount statistics.'
- print
+ print('usage: %s [ options ]' % name)
+ print()
+ print(' Version %s' % Mountstats_version)
+ print()
+ print(' nfsstat-like program that uses NFS client per-mount statistics.')
+ print()
def nfsstat_command():
print_nfsstat_help(prog)
def print_iostat_help(name):
- print 'usage: %s [ <interval> [ <count> ] ] [ <mount point> ] ' % name
- print
- print ' Version %s' % Mountstats_version
- print
- print ' iostat-like program to display NFS client per-mount statistics.'
- print
- print ' The <interval> parameter specifies the amount of time in seconds between'
- print ' each report. The first report contains statistics for the time since each'
- print ' file system was mounted. Each subsequent report contains statistics'
- print ' collected during the interval since the previous report.'
- print
- print ' If the <count> parameter is specified, the value of <count> determines the'
- print ' number of reports generated at <interval> seconds apart. If the interval'
- print ' parameter is specified without the <count> parameter, the command generates'
- print ' reports continuously.'
- print
- print ' If one or more <mount point> names are specified, statistics for only these'
- print ' mount points will be displayed. Otherwise, all NFS mount points on the'
- print ' client are listed.'
- print
+ print('usage: %s [ <interval> [ <count> ] ] [ <mount point> ] ' % name)
+ print()
+ print(' Version %s' % Mountstats_version)
+ print()
+ print(' iostat-like program to display NFS client per-mount statistics.')
+ print()
+ print(' The <interval> parameter specifies the amount of time in seconds between')
+ print(' each report. The first report contains statistics for the time since each')
+ print(' file system was mounted. Each subsequent report contains statistics')
+ print(' collected during the interval since the previous report.')
+ print()
+ print(' If the <count> parameter is specified, the value of <count> determines the')
+ print(' number of reports generated at <interval> seconds apart. If the interval')
+ print(' parameter is specified without the <count> parameter, the command generates')
+ print(' reports continuously.')
+ print()
+ print(' If one or more <mount point> names are specified, statistics for only these')
+ print(' mount points will be displayed. Otherwise, all NFS mount points on the')
+ print(' client are listed.')
+ print()
def print_iostat_summary(old, new, devices, time):
for device in devices:
@@ -530,7 +530,7 @@ def iostat_command():
return
if arg in ['-v', '--version', 'version']:
- print '%s version %s' % (sys.argv[0], Mountstats_version)
+ print('%s version %s' % (sys.argv[0], Mountstats_version))
return
if arg == sys.argv[0]:
@@ -543,14 +543,14 @@ def iostat_command():
if interval > 0:
interval_seen = True
else:
- print 'Illegal <interval> value'
+ print('Illegal <interval> value')
return
elif not count_seen:
count = int(arg)
if count > 0:
count_seen = True
else:
- print 'Illegal <count> value'
+ print('Illegal <count> value')
return
# make certain devices contains only NFS mount points
@@ -563,13 +563,13 @@ def iostat_command():
check += [device]
devices = check
else:
- for device, descr in mountstats.iteritems():
+ for device, descr in mountstats.items():
stats = DeviceData()
stats.parse_stats(descr)
if stats.is_nfs_mountpoint():
devices += [device]
if len(devices) == 0:
- print 'No NFS mount points were found'
+ print('No NFS mount points were found')
return
old_mountstats = None
@@ -608,7 +608,7 @@ try:
elif prog == 'ms-iostat':
iostat_command()
except KeyboardInterrupt:
- print 'Caught ^C... exiting'
+ print('Caught ^C... exiting')
sys.exit(1)
sys.exit(0)