[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