[DTrace-devel] [PATCH 05/16] cpc: Add mode tests
Kris Van Hees
kris.van.hees at oracle.com
Fri Feb 24 00:51:42 UTC 2023
Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>
On Thu, Jan 26, 2023 at 09:23:18PM -0500, eugene.loh--- via DTrace-devel wrote:
> 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
>
>
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel
More information about the DTrace-devel
mailing list