From 16a62781e4e19ef0e3a3efa2c5dc44a673cf4fa2 Mon Sep 17 00:00:00 2001 From: Nicolargo Date: Tue, 22 Dec 2015 15:51:35 +0100 Subject: [PATCH] Add IOps in the DiskIO plugin (issue #763) --- glances/main.py | 2 + glances/outputs/glances_curses.py | 4 +- glances/plugins/glances_diskio.py | 68 +++++++++++++++++++------- glances/plugins/glances_help.py | 4 +- glances/plugins/glances_processlist.py | 4 +- 5 files changed, 59 insertions(+), 23 deletions(-) diff --git a/glances/main.py b/glances/main.py index 16359123..d06d83d6 100644 --- a/glances/main.py +++ b/glances/main.py @@ -206,6 +206,8 @@ Start the client browser (browser mode):\n\ dest='byte', help='display network rate in byte per second') parser.add_argument('--diskio-show-ramfs', action='store_true', default=False, dest='diskio_show_ramfs', help='show RAM Fs in the DiskIO plugin') + parser.add_argument('--diskio-iops', action='store_true', default=False, + dest='diskio_iops', help='show IO per second in the DiskIO plugin') parser.add_argument('--fahrenheit', action='store_true', default=False, dest='fahrenheit', help='display temperature in Fahrenheit (default is Celsius)') parser.add_argument('-1', '--percpu', action='store_true', default=False, diff --git a/glances/outputs/glances_curses.py b/glances/outputs/glances_curses.py index f5c8b249..ecc44e11 100644 --- a/glances/outputs/glances_curses.py +++ b/glances/outputs/glances_curses.py @@ -314,8 +314,10 @@ class _GlancesCurses(object): glances_processes.sort_key = 'cpu_percent' elif self.pressedkey == ord('b'): # 'b' > Switch between bit/s and Byte/s for network IO - # self.net_byteps_tag = not self.net_byteps_tag self.args.byte = not self.args.byte + elif self.pressedkey == ord('B'): + # 'B' > Switch between bit/s and IO/s for Disk IO + self.args.diskio_iops = not self.args.diskio_iops elif self.pressedkey == ord('c'): # 'c' > Sort processes by CPU usage glances_processes.auto_sort = False diff --git a/glances/plugins/glances_diskio.py b/glances/plugins/glances_diskio.py index 127a3a33..6bd6317b 100644 --- a/glances/plugins/glances_diskio.py +++ b/glances/plugins/glances_diskio.py @@ -102,8 +102,12 @@ class Plugin(GlancesPlugin): if self.is_hide(disk): continue - # Compute bitrate + # Compute count and bit rate try: + read_count = (diskio_new[disk].read_count - + self.diskio_old[disk].read_count) + write_count = (diskio_new[disk].write_count - + self.diskio_old[disk].write_count) read_bytes = (diskio_new[disk].read_bytes - self.diskio_old[disk].read_bytes) write_bytes = (diskio_new[disk].write_bytes - @@ -111,6 +115,8 @@ class Plugin(GlancesPlugin): diskstat = { 'time_since_update': time_since_update, 'disk_name': disk, + 'read_count': read_count, + 'write_count': write_count, 'read_bytes': read_bytes, 'write_bytes': write_bytes} except KeyError: @@ -161,10 +167,16 @@ class Plugin(GlancesPlugin): # Header msg = '{0:9}'.format('DISK I/O') ret.append(self.curse_add_line(msg, "TITLE")) - msg = '{0:>7}'.format('R/s') - ret.append(self.curse_add_line(msg)) - msg = '{0:>7}'.format('W/s') - ret.append(self.curse_add_line(msg)) + if args.diskio_iops: + msg = '{0:>7}'.format('IOR/s') + ret.append(self.curse_add_line(msg)) + msg = '{0:>7}'.format('IOW/s') + ret.append(self.curse_add_line(msg)) + else: + msg = '{0:>7}'.format('R/s') + ret.append(self.curse_add_line(msg)) + msg = '{0:>7}'.format('W/s') + ret.append(self.curse_add_line(msg)) # Disk list (sorted by name) for i in sorted(self.stats, key=operator.itemgetter(self.get_key())): # Is there an alias for the disk name ? @@ -179,19 +191,37 @@ class Plugin(GlancesPlugin): disk_name = '_' + disk_name[-8:] msg = '{0:9}'.format(disk_name) ret.append(self.curse_add_line(msg)) - txps = self.auto_unit( - int(i['read_bytes'] // i['time_since_update'])) - rxps = self.auto_unit( - int(i['write_bytes'] // i['time_since_update'])) - msg = '{0:>7}'.format(txps) - ret.append(self.curse_add_line(msg, - self.get_views(item=i[self.get_key()], - key='read_bytes', - option='decoration'))) - msg = '{0:>7}'.format(rxps) - ret.append(self.curse_add_line(msg, - self.get_views(item=i[self.get_key()], - key='write_bytes', - option='decoration'))) + if args.diskio_iops: + # count + txps = self.auto_unit( + int(i['read_count'] // i['time_since_update'])) + rxps = self.auto_unit( + int(i['write_count'] // i['time_since_update'])) + msg = '{0:>7}'.format(txps) + ret.append(self.curse_add_line(msg, + self.get_views(item=i[self.get_key()], + key='read_count', + option='decoration'))) + msg = '{0:>7}'.format(rxps) + ret.append(self.curse_add_line(msg, + self.get_views(item=i[self.get_key()], + key='write_count', + option='decoration'))) + else: + # Bitrate + txps = self.auto_unit( + int(i['read_bytes'] // i['time_since_update'])) + rxps = self.auto_unit( + int(i['write_bytes'] // i['time_since_update'])) + msg = '{0:>7}'.format(txps) + ret.append(self.curse_add_line(msg, + self.get_views(item=i[self.get_key()], + key='read_bytes', + option='decoration'))) + msg = '{0:>7}'.format(rxps) + ret.append(self.curse_add_line(msg, + self.get_views(item=i[self.get_key()], + key='write_bytes', + option='decoration'))) return ret diff --git a/glances/plugins/glances_help.py b/glances/plugins/glances_help.py index eccd8cc2..3bc0d195 100644 --- a/glances/plugins/glances_help.py +++ b/glances/plugins/glances_help.py @@ -91,6 +91,7 @@ class Plugin(GlancesPlugin): self.view_data['enable_disable_docker'] = msg_col2.format('D', 'Enable/disable Docker stats') self.view_data['enable_disable_quick_look'] = msg_col.format('3', 'Enable/disable quick look plugin') self.view_data['show_hide_ip'] = msg_col2.format('I', 'Show/hide IP module') + self.view_data['diskio_iops'] = msg_col2.format('B', 'Count/rate for Disk I/O') self.view_data['edit_pattern_filter'] = 'ENTER: Edit the process filter pattern' def get_view_data(self, args=None): @@ -156,13 +157,14 @@ class Plugin(GlancesPlugin): ret.append(self.curse_add_line(self.view_data['show_hide_help'])) ret.append(self.curse_new_line()) ret.append(self.curse_add_line(self.view_data['enable_disable_quick_look'])) - ret.append(self.curse_add_line(self.view_data['quit'])) + ret.append(self.curse_add_line(self.view_data['diskio_iops'])) ret.append(self.curse_new_line()) ret.append(self.curse_add_line(self.view_data['enable_disable_top_extends_stats'])) ret.append(self.curse_new_line()) ret.append(self.curse_add_line(self.view_data['enable_disable_short_processname'])) ret.append(self.curse_new_line()) ret.append(self.curse_add_line(self.view_data['enable_disable_irix'])) + ret.append(self.curse_add_line(self.view_data['quit'])) ret.append(self.curse_new_line()) ret.append(self.curse_new_line()) diff --git a/glances/plugins/glances_processlist.py b/glances/plugins/glances_processlist.py index 92516e02..84e8571b 100644 --- a/glances/plugins/glances_processlist.py +++ b/glances/plugins/glances_processlist.py @@ -456,9 +456,9 @@ class Plugin(GlancesPlugin): ret.append(self.curse_add_line(msg)) msg = '{0:>10}'.format('TIME+') ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'cpu_times' else 'DEFAULT', optional=True)) - msg = '{0:>6}'.format('IOR/s') + msg = '{0:>6}'.format('R/s') ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'io_counters' else 'DEFAULT', optional=True, additional=True)) - msg = '{0:>6}'.format('IOW/s') + msg = '{0:>6}'.format('W/s') ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'io_counters' else 'DEFAULT', optional=True, additional=True)) msg = ' {0:8}'.format('Command') ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'name' else 'DEFAULT'))