diff options
author | 2016-06-06 14:32:36 +0300 | |
---|---|---|
committer | 2016-06-06 14:32:36 +0300 | |
commit | 1eed7e59f23d3ab9b957d9822eefe72877e291da (patch) | |
tree | c716cf29c2f4e9e17df2c664da5e5a679e076121 /scripts/automation/trex_control_plane/stl/trex_stl_lib | |
parent | 5216c6a22a2324bf555b590b34594a63d8aeeb7d (diff) |
MBUF utilization: add size of RAM (MB) the MBUFs take
Diffstat (limited to 'scripts/automation/trex_control_plane/stl/trex_stl_lib')
-rw-r--r-- | scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_stats.py | 124 |
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__": |