[DTrace-devel] [PATCH 05/16] cpc: Add mode tests
eugene.loh at oracle.com
eugene.loh at oracle.com
Fri Jan 27 02:23:18 UTC 2023
From: Eugene Loh <eugene.loh at oracle.com>
CPC probes can specify modes: all, user, and kernel. These tests check
"all" against "perf stat" results. They check "user" and "kernel" by
using workloads that are known to be user-space- or kernel-intensive.
An extra utility is added to support these tests:
* cpc_get_events.sh composes a list of events to test on
the current system
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
test/unittest/cpc/tst.mode_kernel.sh | 68 ++++++++++++++++++++++++++++
test/unittest/cpc/tst.mode_user.sh | 68 ++++++++++++++++++++++++++++
test/utils/cpc_get_events.sh | 18 ++++++++
3 files changed, 154 insertions(+)
create mode 100755 test/unittest/cpc/tst.mode_kernel.sh
create mode 100755 test/unittest/cpc/tst.mode_user.sh
create mode 100755 test/utils/cpc_get_events.sh
diff --git a/test/unittest/cpc/tst.mode_kernel.sh b/test/unittest/cpc/tst.mode_kernel.sh
new file mode 100755
index 00000000..f7a356cd
--- /dev/null
+++ b/test/unittest/cpc/tst.mode_kernel.sh
@@ -0,0 +1,68 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+# Licensed under the Universal Permissive License v 1.0 as shown at
+# http://oss.oracle.com/licenses/upl.
+
+# Test CPC provider with modes (all, user, kernel) with a
+# kernel-space-intensive workload.
+
+# @@reinvoke-failure: 2
+
+utils=`pwd`/test/utils
+
+dtrace=$1
+tmpfile=$tmpdir/tst.mode_kernel.$$
+mkdir $tmpfile
+cd $tmpfile
+
+target=workload_kernel
+
+# run tests
+declare -A actual
+status=0
+for eventname in `$utils/cpc_get_events.sh`; do
+
+ # the DTrace CPC provider needs '-' turned into '_'
+ Deventname=`echo $eventname | tr '-' '_'`
+
+ # determine number of iterations for target number of seconds
+ nsecs=1
+ niters=`$utils/workload_get_iterations.sh $target $nsecs`
+ if [ $niters -lt 0 ]; then
+ echo "workload_get_iterations.sh failed with $target"
+ exit 1
+ fi
+
+ # determine expected count
+ expect=`$utils/perf_count_event.sh $eventname $target $niters`
+
+ # sample events (with DTrace)
+ period=$(($expect / 20))
+ echo $niters iterations for $Deventname with period $period
+ for mode in all user kernel; do
+ $dtrace $dt_flags -qn $Deventname-$mode-$period'
+ /pid == $target/
+ {
+ @ = sum('$period');
+ }' -c "$utils/$target $niters" > tmp.txt
+ if [[ $? -ne 0 ]]; then
+ echo ERROR running DTrace for $Deventname-$mode-$period
+ cat tmp.txt
+ exit 1
+ fi
+ actual[$mode]=`cat tmp.txt`
+ if [ -z ${actual[$mode]} ]; then
+ actual[$mode]=0
+ fi
+ done
+
+ # report
+ margin=$(($expect / 4))
+ $utils/check_result.sh ${actual[all]} $expect $margin; status=$(($status + $?))
+ $utils/check_result.sh ${actual[user]} 0 $margin; status=$(($status + $?))
+ $utils/check_result.sh ${actual[kernel]} $expect $margin; status=$(($status + $?))
+done
+
+exit $status
diff --git a/test/unittest/cpc/tst.mode_user.sh b/test/unittest/cpc/tst.mode_user.sh
new file mode 100755
index 00000000..a445b734
--- /dev/null
+++ b/test/unittest/cpc/tst.mode_user.sh
@@ -0,0 +1,68 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+# Licensed under the Universal Permissive License v 1.0 as shown at
+# http://oss.oracle.com/licenses/upl.
+
+# Test CPC provider with modes (all, user, kernel) with a
+# user-space-intensive workload.
+
+# @@reinvoke-failure: 2
+
+utils=`pwd`/test/utils
+
+dtrace=$1
+tmpfile=$tmpdir/tst.mode_user.$$
+mkdir $tmpfile
+cd $tmpfile
+
+target=workload_user
+
+# run tests
+declare -A actual
+status=0
+for eventname in `$utils/cpc_get_events.sh`; do
+
+ # the DTrace CPC provider needs '-' turned into '_'
+ Deventname=`echo $eventname | tr '-' '_'`
+
+ # determine number of iterations for target number of seconds
+ nsecs=1
+ niters=`$utils/workload_get_iterations.sh $target $nsecs`
+ if [ $niters -lt 0 ]; then
+ echo "workload_get_iterations.sh failed with $target"
+ exit 1
+ fi
+
+ # determine expected count
+ expect=`$utils/perf_count_event.sh $eventname $target $niters`
+
+ # sample events (with DTrace)
+ period=$(($expect / 20))
+ echo $niters iterations for $Deventname with period $period
+ for mode in all user kernel; do
+ $dtrace $dt_flags -qn $Deventname-$mode-$period'
+ /pid == $target/
+ {
+ @ = sum('$period');
+ }' -c "$utils/$target $niters" > tmp.txt
+ if [[ $? -ne 0 ]]; then
+ echo ERROR running DTrace for $Deventname-$mode-$period
+ cat tmp.txt
+ exit 1
+ fi
+ actual[$mode]=`cat tmp.txt`
+ if [ -z ${actual[$mode]} ]; then
+ actual[$mode]=0
+ fi
+ done
+
+ # report
+ margin=$(($expect / 4))
+ $utils/check_result.sh ${actual[all]} $expect $margin; status=$(($status + $?))
+ $utils/check_result.sh ${actual[user]} $expect $margin; status=$(($status + $?))
+ $utils/check_result.sh ${actual[kernel]} 0 $margin; status=$(($status + $?))
+done
+
+exit $status
diff --git a/test/utils/cpc_get_events.sh b/test/utils/cpc_get_events.sh
new file mode 100755
index 00000000..4303c826
--- /dev/null
+++ b/test/utils/cpc_get_events.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+# Licensed under the Universal Permissive License v 1.0 as shown at
+# http://oss.oracle.com/licenses/upl.
+
+# Form a list of events to test on this system.
+# Use at least cpu-clock but also try "perf list" for some others.
+
+eventnamelist="cpu-clock"
+for eventname in branches instructions; do
+ if perf list hw | grep -qw $eventname; then
+ eventnamelist="$eventnamelist $eventname"
+ fi
+done
+
+echo $eventnamelist
--
2.18.4
More information about the DTrace-devel
mailing list