diff options
Diffstat (limited to 'tools/benchmark/generate-statistics.py')
-rw-r--r-- | tools/benchmark/generate-statistics.py | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/tools/benchmark/generate-statistics.py b/tools/benchmark/generate-statistics.py index 740c3be08..e8327f3ac 100644 --- a/tools/benchmark/generate-statistics.py +++ b/tools/benchmark/generate-statistics.py @@ -21,6 +21,7 @@ import oslo_policy from oslo_utils import timeutils from ironic.api.controllers.v1 import node as node_api +from ironic.api.controllers.v1 import port as port_api from ironic.api.controllers.v1 import utils as api_utils from ironic.common import context from ironic.common import service @@ -28,6 +29,7 @@ from ironic.conf import CONF # noqa To Load Configuration from ironic.db import api as db_api from ironic.objects import conductor from ironic.objects import node +from ironic.objects import port def _calculate_delta(start, finish): @@ -56,6 +58,24 @@ def _assess_db_performance(): return node_count +def _assess_db_performance_ports(): + start = time.time() + dbapi = db_api.get_instance() + print('Phase - Assess DB performance - Ports') + _add_a_line() + got_connection = time.time() + ports = dbapi.get_port_list() + port_count = len(ports) + query_complete = time.time() + delta = _calculate_delta(start, got_connection) + print('Obtained DB client in %s seconds.' % delta) + delta = _calculate_delta(got_connection, query_complete) + print('Returned %s ports in python %s seconds from the DB.\n' % + (port_count, delta)) + # return node count for future use. + return port_count + + def _assess_db_and_object_performance(): print('Phase - Assess DB & Object conversion Performance') _add_a_line() @@ -88,6 +108,33 @@ def _assess_db_and_object_performance(): observed_vendors.append(vendor) +def _assess_db_and_object_performance_ports(): + print('Phase - Assess DB & Object conversion Performance - Ports') + _add_a_line() + start = time.time() + port_list = port.Port().list(context.get_admin_context()) + got_list = time.time() + delta = _calculate_delta(start, got_list) + print('Obtained list of port objects in %s seconds.' % delta) + count = 0 + tbl_size = 0 + # In a sense, this helps provide a relative understanding if the + # database is the bottleneck, or the objects post conversion. + # converting completely to json and then measuring the size helps + # ensure that everything is "assessed" while not revealing too + # much detail. + for port_obj in port_list: + # Just looping through the entire set to count should be + # enough to ensure that the entry is loaded from the db + # and then converted to an object. + tbl_size = tbl_size + sys.getsizeof(port_obj.as_dict()) + count = count + 1 + delta = _calculate_delta(got_list, time.time()) + print('Took %s seconds to iterate through %s port objects.' % + (delta, count)) + print('Ports table is roughly %s bytes of JSON.\n' % tbl_size) + + @mock.patch('ironic.api.request') # noqa patch needed for the object model @mock.patch.object(metrics_utils, 'get_metrics_logger', lambda *_: mock.Mock) @mock.patch.object(api_utils, 'check_list_policy', lambda *_: None) @@ -155,6 +202,68 @@ def _assess_db_object_and_api_performance(mock_log, mock_request): 'nodes API call pattern.\n' % (delta, total_nodes)) + +@mock.patch('ironic.api.request') # noqa patch needed for the object model +@mock.patch.object(metrics_utils, 'get_metrics_logger', lambda *_: mock.Mock) +@mock.patch.object(api_utils, 'check_list_policy', lambda *_: None) +@mock.patch.object(api_utils, 'check_allow_specify_fields', lambda *_: None) +@mock.patch.object(api_utils, 'check_allowed_fields', lambda *_: None) +@mock.patch.object(oslo_policy.policy, 'LOG', autospec=True) +def _assess_db_object_and_api_performance_ports(mock_log, mock_request): + print('Phase - Assess DB & Object conversion Performance - Ports') + _add_a_line() + # Just mock it to silence it since getting the logger to update + # config seems like not a thing once started. :\ + mock_log.debug = mock.Mock() + # Internal logic requires major/minor versions and a context to + # proceed. This is just to make the NodesController respond properly. + mock_request.context = context.get_admin_context() + mock_request.version.major = 1 + mock_request.version.minor = 71 + + start = time.time() + port_api_controller = port_api.PortsController() + port_api_controller.context = context.get_admin_context() + fields = ("uuid,node_uuid,address,extra,local_link_connection," + "pxe_enabled,internal_info,physical_network," + "is_smartnic") + + total_ports = 0 + + res = port_api_controller._get_ports_collection( + resource_url='ports', + node_ident=None, + address=None, + portgroup_ident=None, + marker=None, + limit=None, + sort_key="id", + sort_dir="asc", + fields=fields.split(',')) + total_ports = len(res['ports']) + while len(res['ports']) != 1: + print(" ** Getting ports ** %s Elapsed: %s seconds." % + (total_ports, _calculate_delta(start, time.time()))) + res = port_api_controller._get_ports_collection( + resource_url='ports', + node_ident=None, + address=None, + portgroup_ident=None, + marker=res['ports'][-1]['uuid'], + limit=None, + sort_key="id", + sort_dir="asc", + fields=fields.split(',')) + new_ports = len(res['ports']) + if new_ports == 0: + break + total_ports = total_ports + new_ports + + delta = _calculate_delta(start, time.time()) + print('Took %s seconds to return all %s ports via ' + 'ports API call pattern.\n' % (delta, total_ports)) + + def _report_conductors(): print('Phase - identifying conductors/drivers') _add_a_line() @@ -190,6 +299,9 @@ def main(): _assess_db_performance() _assess_db_and_object_performance() _assess_db_object_and_api_performance() + _assess_db_performance_ports() + _assess_db_and_object_performance_ports() + _assess_db_object_and_api_performance_ports() _report_conductors() |