summaryrefslogtreecommitdiffstats
path: root/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_stats.py
diff options
context:
space:
mode:
authorYaroslav Brustinov <ybrustin@cisco.com>2016-06-06 14:32:36 +0300
committerYaroslav Brustinov <ybrustin@cisco.com>2016-06-06 14:32:36 +0300
commit1eed7e59f23d3ab9b957d9822eefe72877e291da (patch)
treec716cf29c2f4e9e17df2c664da5e5a679e076121 /scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_stats.py
parent5216c6a22a2324bf555b590b34594a63d8aeeb7d (diff)
MBUF utilization: add size of RAM (MB) the MBUFs take
Diffstat (limited to 'scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_stats.py')
-rw-r--r--scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_stats.py124
1 files changed, 71 insertions, 53 deletions
diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_stats.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_stats.py
index d23dd33f..990a40da 100644
--- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_stats.py
+++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_stats.py
@@ -106,12 +106,12 @@ def calculate_diff_raw (samples):
return total
-# used to sort '64b', '9kb' etc.
-def key_cmp_bytes(val):
- multiplier = 1
- if 'kb' in val:
- multiplier = 1000
- return multiplier * int(val.replace('k', '').replace('b', ''))
+get_number_of_bytes_cache = {}
+# get number of bytes: '64b'->64, '9kb'->9000 etc.
+def get_number_of_bytes(val):
+ if val not in get_number_of_bytes_cache:
+ get_number_of_bytes_cache[val] = int(val[:-1].replace('k', '000'))
+ return get_number_of_bytes_cache[val]
# a simple object to keep a watch over a field
class WatchedField(object):
@@ -422,55 +422,69 @@ class CTRexInfoGenerator(object):
def _generate_cpu_util_stats(self):
util_stats = self._util_stats_ref.get_stats(use_1sec_cache = True)
- if not util_stats or 'cpu' not in util_stats:
- raise Exception("Excepting 'cpu' section in stats %s" % util_stats)
- cpu_stats = util_stats['cpu']
- hist_len = len(cpu_stats[0])
- avg_len = min(5, hist_len)
- show_len = min(15, hist_len)
stats_table = text_tables.TRexTextTable()
- stats_table.header(['Thread', 'Avg', 'Latest'] + list(range(-1, 0 - show_len, -1)))
- stats_table.set_cols_align(['l'] + ['r'] * (show_len + 1))
- stats_table.set_cols_width([8, 3, 6] + [3] * (show_len - 1))
- stats_table.set_cols_dtype(['t'] * (show_len + 2))
- for i in range(min(14, len(cpu_stats))):
- avg = int(round(sum(cpu_stats[i][:avg_len]) / avg_len))
- stats_table.add_row([i, avg] + cpu_stats[i][:show_len])
+ if util_stats:
+ if 'cpu' not in util_stats:
+ raise Exception("Excepting 'cpu' section in stats %s" % util_stats)
+ cpu_stats = util_stats['cpu']
+ hist_len = len(cpu_stats[0])
+ avg_len = min(5, hist_len)
+ show_len = min(15, hist_len)
+ stats_table.header(['Thread', 'Avg', 'Latest'] + list(range(-1, 0 - show_len, -1)))
+ stats_table.set_cols_align(['l'] + ['r'] * (show_len + 1))
+ stats_table.set_cols_width([8, 3, 6] + [3] * (show_len - 1))
+ stats_table.set_cols_dtype(['t'] * (show_len + 2))
+ for i in range(min(14, len(cpu_stats))):
+ avg = int(round(sum(cpu_stats[i][:avg_len]) / avg_len))
+ stats_table.add_row([i, avg] + cpu_stats[i][:show_len])
+ else:
+ stats_table.add_row(['No Data.'])
return {'cpu_util(%)': ExportableStats(None, stats_table)}
def _generate_mbuf_util_stats(self):
util_stats = self._util_stats_ref.get_stats(use_1sec_cache = True)
- if not util_stats or 'mbuf_stats' not in util_stats:
- raise Exception("Excepting 'mbuf_stats' section in stats %s" % util_stats)
- mbuf_stats = util_stats['mbuf_stats']
- for mbufs_per_socket in mbuf_stats.values():
- first_socket_mbufs = mbufs_per_socket
- break
- if not self._util_stats_ref.mbuf_types_list:
- mbuf_keys = list(first_socket_mbufs.keys())
- mbuf_keys.sort(key = key_cmp_bytes)
- self._util_stats_ref.mbuf_types_list = mbuf_keys
- types_len = len(self._util_stats_ref.mbuf_types_list)
stats_table = text_tables.TRexTextTable()
- stats_table.set_cols_align(['l'] + ['r'] * types_len)
- stats_table.set_cols_width([10] + [7] * types_len)
- stats_table.set_cols_dtype(['t'] * (types_len + 1))
- stats_table.header([''] + self._util_stats_ref.mbuf_types_list)
- total_list = []
- for mbuf_type in self._util_stats_ref.mbuf_types_list:
- total_list.append(first_socket_mbufs[mbuf_type][1])
- stats_table.add_row(['Total:'] + total_list)
- stats_table.add_row(['Used:'] + [''] * types_len)
- for socket_name, mbufs in mbuf_stats.items():
- socket_show_name = socket_name.replace('cpu-', '').replace('-', ' ').capitalize() + ':'
- used_list = []
- percentage_list = []
+ if util_stats:
+ if 'mbuf_stats' not in util_stats:
+ raise Exception("Excepting 'mbuf_stats' section in stats %s" % util_stats)
+ mbuf_stats = util_stats['mbuf_stats']
+ for mbufs_per_socket in mbuf_stats.values():
+ first_socket_mbufs = mbufs_per_socket
+ break
+ if not self._util_stats_ref.mbuf_types_list:
+ mbuf_keys = list(first_socket_mbufs.keys())
+ mbuf_keys.sort(key = get_number_of_bytes)
+ self._util_stats_ref.mbuf_types_list = mbuf_keys
+ types_len = len(self._util_stats_ref.mbuf_types_list)
+ stats_table.set_cols_align(['l'] + ['r'] * (types_len + 1))
+ stats_table.set_cols_width([10] + [7] * (types_len + 1))
+ stats_table.set_cols_dtype(['t'] * (types_len + 2))
+ stats_table.header([''] + self._util_stats_ref.mbuf_types_list + ['RAM(MB)'])
+ total_list = []
+ sum_totals = 0
for mbuf_type in self._util_stats_ref.mbuf_types_list:
- used = mbufs[mbuf_type][1] - mbufs[mbuf_type][0]
- used_list.append(used)
- percentage_list.append('%s%%' % int(100 * used / mbufs[mbuf_type][1]))
- stats_table.add_row([socket_show_name] + used_list)
- stats_table.add_row(['Percent:'] + percentage_list)
+ sum_totals += first_socket_mbufs[mbuf_type][1] * get_number_of_bytes(mbuf_type) + 64
+ total_list.append(first_socket_mbufs[mbuf_type][1])
+ sum_totals *= len(list(mbuf_stats.values()))
+ total_list.append(int(sum_totals/1e6))
+ stats_table.add_row(['Total:'] + total_list)
+ stats_table.add_row(['Used:'] + [''] * (types_len + 1))
+ for socket_name in sorted(list(mbuf_stats.keys())):
+ mbufs = mbuf_stats[socket_name]
+ socket_show_name = socket_name.replace('cpu-', '').replace('-', ' ').capitalize() + ':'
+ sum_used = 0
+ used_list = []
+ percentage_list = []
+ for mbuf_type in self._util_stats_ref.mbuf_types_list:
+ used = mbufs[mbuf_type][1] - mbufs[mbuf_type][0]
+ sum_used += used * get_number_of_bytes(mbuf_type) + 64
+ used_list.append(used)
+ percentage_list.append('%s%%' % int(100 * used / mbufs[mbuf_type][1]))
+ used_list.append(int(sum_used/1e6))
+ stats_table.add_row([socket_show_name] + used_list)
+ stats_table.add_row(['Percent:'] + percentage_list + [''])
+ else:
+ stats_table.add_row(['No Data.'])
return {'mbuf_util': ExportableStats(None, stats_table)}
@staticmethod
@@ -1357,15 +1371,19 @@ class CUtilStats(CTRexStats):
self.client = client
self.history = deque(maxlen = 1)
self.mbuf_types_list = None
+ self.last_update_ts = 0
def get_stats(self, use_1sec_cache = False):
time_now = time.time()
if self.last_update_ts + 1 < time_now or not self.history or not use_1sec_cache:
- rc = self.client._transmit('get_utilization')
- if not rc:
- raise Exception(rc)
- self.last_update_ts = time_now
- self.history.append(rc.data())
+ if self.client.is_connected():
+ rc = self.client._transmit('get_utilization')
+ if not rc:
+ raise Exception(rc)
+ self.last_update_ts = time_now
+ self.history.append(rc.data())
+ else:
+ self.history.append({})
return self.history[-1]
if __name__ == "__main__":