Framework: Perf stat capturing 16/28116/17
authorPeter Mikus <pmikus@cisco.com>
Thu, 5 Mar 2020 11:12:18 +0000 (11:12 +0000)
committerPeter Mikus <pmikus@cisco.com>
Fri, 31 Jul 2020 11:53:19 +0000 (11:53 +0000)
Change-Id: I3bbe1fe0073ddeead5219993675f24955e8c3dfd
Signed-off-by: Peter Mikus <pmikus@cisco.com>
resources/libraries/python/Constants.py
resources/libraries/python/PerfUtil.py [new file with mode: 0644]
resources/libraries/robot/performance/performance_utils.robot
resources/libraries/robot/shared/test_teardown.robot
tests/vpp/device/__init__.robot
tests/vpp/perf/__init__.robot

index a743593..d1cd45c 100644 (file)
@@ -210,6 +210,9 @@ class Constants:
     # Core dump directory
     CORE_DUMP_DIR = u"/tmp"
 
+    # Perf stat events (comma separated).
+    PERF_STAT_EVENTS = u"machine_clears.smc"
+
     # Equivalent to ~0 used in vpp code
     BITWISE_NON_ZERO = 0xffffffff
 
@@ -226,8 +229,10 @@ class Constants:
     PERF_TRIAL_LATENCY_DURATION = get_float_from_env(
         u"PERF_TRIAL_LATENCY_DURATION", 5.0)
 
-    # VPP packet trace
-    PKT_TRACE = get_pessimistic_bool_from_env(u"PKT_TRACE")
+    # Extended debug (incl. vpp packet trace, linux perf stat, ...).
+    # Full list is available as suite variable (__init__.robot) or is
+    # override by test.
+    EXTENDED_DEBUG = get_pessimistic_bool_from_env(u"EXTENDED_DEBUG")
 
     # UUID string of DUT1 /tmp volume created outside of the
     # DUT1 docker in case of vpp-device test. ${EMPTY} value means that
diff --git a/resources/libraries/python/PerfUtil.py b/resources/libraries/python/PerfUtil.py
new file mode 100644 (file)
index 0000000..51832de
--- /dev/null
@@ -0,0 +1,60 @@
+# Copyright (c) 2020 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Linux perf utility."""
+
+from resources.libraries.python.Constants import Constants
+from resources.libraries.python.ssh import exec_cmd
+from resources.libraries.python.topology import NodeType
+
+__all__ = [u"PerfUtil"]
+
+
+class PerfUtil:
+    """Class contains methods for perf utility."""
+
+    @staticmethod
+    def perf_stat(node, cpu_list=None, duration=1):
+        """Get perf stat read for duration.
+
+        :param node: Node in the topology.
+        :param cpu_list: CPU List.
+        :param duration: Measure time in seconds.
+        :type node: dict
+        :type cpu_list: str
+        :type duration: int
+        """
+        cpu = cpu_list if cpu_list else u"0-$(($(nproc) - 1))"
+        command = (
+            u"perf stat"
+            f" --cpu {cpu} --no-aggr"
+            f" --event '{{{Constants.PERF_STAT_EVENTS}}}'"
+            f" --interval-print 1000 "
+            f" -- sleep {int(duration)}"
+        )
+        exec_cmd(node, command, sudo=True)
+
+    @staticmethod
+    def perf_stat_on_all_duts(nodes, cpu_list=None, duration=1):
+        """Get perf stat read for duration on all DUTs.
+
+        :param nodes: Nodes in the topology.
+        :param cpu_list: CPU List.
+        :param duration: Measure time in seconds.
+        :type nodes: dict
+        :type cpu_list: str
+        :type duration: int
+        """
+        for node in nodes.values():
+            if node[u"type"] == NodeType.DUT:
+                PerfUtil.perf_stat(node, cpu_list=cpu_list, duration=duration)
index 53334ed..4c8146e 100644 (file)
@@ -15,6 +15,7 @@
 | Library | Collections
 | Library | resources.libraries.python.topology.Topology
 | Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.PerfUtil
 | Library | resources.libraries.python.InterfaceUtil
 | Library | resources.libraries.python.TrafficGenerator
 | Library | resources.libraries.python.TrafficGenerator.OptimizedSearch
@@ -28,7 +29,7 @@
 *** Variables ***
 | ${trial_duration}= | ${PERF_TRIAL_DURATION}
 | ${trial_multiplicity}= | ${PERF_TRIAL_MULTIPLICITY}
-| ${pkt_trace}= | ${PKT_TRACE}
+| ${extended_debug}= | ${EXTENDED_DEBUG}
 
 *** Keywords ***
 | Find NDR and PDR intervals using optimized search
 | | ... | Type: integer
 | | ... | - rx_port - RX port of TG, default 1.
 | | ... | Type: integer
-| | ... | - pkt_trace - True to enable packet trace.
+| | ... | - extended_debug- True to enable extended debug.
 | | ... | Type: boolean
 | |
 | | ... | *Example:*
 | | [Arguments] | ${trial_duration} | ${rate} | ${frame_size}
 | | ... | ${traffic_profile} | ${trial_multiplicity}=${trial_multiplicity}
 | | ... | ${traffic_directions}=${2} | ${tx_port}=${0} | ${rx_port}=${1}
-| | ... | ${pkt_trace}=${pkt_trace}
+| | ... | ${extended_debug}=${extended_debug}
 | |
+| | Set Test Variable | ${extended_debug}
 | | Clear and show runtime counters with running traffic | ${trial_duration}
 | | ... | ${rate} | ${frame_size} | ${traffic_profile}
 | | ... | ${traffic_directions} | ${tx_port} | ${rx_port}
-| | Set Test Variable | ${pkt_trace}
 | | FOR | ${action} | IN | @{pre_stats}
 | | | Run Keyword | Additional Statistics Action For ${action}
 | | END
 | | [Documentation]
 | | ... | Additional Statistics Action for enable VPP packet trace.
 | |
-| | Run Keyword If | ${pkt_trace}==${True}
+| | Run Keyword If | ${extended_debug}==${True}
 | | ... | VPP Enable Traces On All DUTs | ${nodes} | fail_on_error=${False}
 
 | Additional Statistics Action For vpp-show-packettrace
 | | [Documentation]
 | | ... | Additional Statistics Action for show VPP packet trace.
 | |
-| | Run Keyword If | ${pkt_trace}==${True}
+| | Run Keyword If | ${extended_debug}==${True}
 | | ... | Show Packet Trace On All Duts | ${nodes} | maximum=${100}
 
 | Additional Statistics Action For vpp-enable-elog
 | | ... | Additional Statistics Action for show VPP elog trace.
 | |
 | | Show Event Logger On All DUTs | ${nodes}
+
+| Additional Statistics Action For bash-perf-stat
+| | [Documentation]
+| | ... | Additional Statistics Action for bash command "perf stat".
+| |
+| | Run Keyword If | ${extended_debug}==${True}
+| | ... | Perf Stat On All DUTs | ${nodes}
\ No newline at end of file
index 1174fde..e6ddc58 100644 (file)
@@ -51,8 +51,9 @@
 | | ... | Additional teardown for tests which uses performance measurement.
 | |
 | | Run Keyword If Test Failed
-| | ... | Send traffic at specified rate | ${PERF_TRIAL_DURATION} | 10000pps
-| | ... | ${frame_size} | ${traffic_profile} | pkt_trace=${True}
+| | ... | Send traffic at specified rate | ${1.0} | 10000pps
+| | ... | ${frame_size} | ${traffic_profile} | trial_multiplicity=${1}
+| | ... | extended_debug=${True}
 
 | Additional Test Tear Down Action For packet_trace
 | | [Documentation]
index 9be4c66..3819716 100644 (file)
@@ -48,7 +48,7 @@
 | | ${pre_run_stats}= | Create List
 | | ... | vpp-clear-runtime
 | | ${post_run_stats}= | Create List
-| | ... | vpp-show-runtime
+| | ... | vpp-show-runtime | bash-perf-stat
 | | Set Global Variable | ${pre_stats}
 | | Set Global Variable | ${post_stats}
 | | Set Global Variable | ${pre_run_stats}
index 534e0f3..1ccd94b 100644 (file)
@@ -51,7 +51,7 @@
 | | ${pre_run_stats}= | Create List
 | | ... | vpp-clear-runtime
 | | ${post_run_stats}= | Create List
-| | ... | vpp-show-runtime
+| | ... | vpp-show-runtime | bash-perf-stat
 | | Set Global Variable | ${pre_stats}
 | | Set Global Variable | ${post_stats}
 | | Set Global Variable | ${pre_run_stats}

©2016 FD.io a Linux Foundation Collaborative Project. All Rights Reserved.
Linux Foundation is a registered trademark of The Linux Foundation. Linux is a registered trademark of Linus Torvalds.
Please see our privacy policy and terms of use.