[DTrace-devel] [PATCH] Add a multi-CPU aggregation test
Kris Van Hees
kris.van.hees at oracle.com
Tue Dec 8 23:55:56 PST 2020
On Wed, Dec 09, 2020 at 01:23:17AM -0500, eugene.loh at oracle.com wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
>
> A key characteristic of DTrace aggregations is that they are
> gathered per CPU and then aggregated across CPUs. Nevertheless,
> the test suite uses only BEGIN and tick-n probes for aggregation
> tests. So, aggregation across CPUs is never really tested.
>
> Add a test for the simplest aggregations with a probe that fires
> across all CPUs.
>
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> test/unittest/aggs/tst.multicpus.sh | 117 ++++++++++++++++++++++++++++
> 1 file changed, 117 insertions(+)
> create mode 100755 test/unittest/aggs/tst.multicpus.sh
>
> diff --git a/test/unittest/aggs/tst.multicpus.sh b/test/unittest/aggs/tst.multicpus.sh
> new file mode 100755
> index 00000000..23b5c08d
> --- /dev/null
> +++ b/test/unittest/aggs/tst.multicpus.sh
> @@ -0,0 +1,117 @@
> +#!/bin/bash
> +#
> +# Oracle Linux DTrace.
> +# Copyright (c) 2020, 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.
> +#
> +
> +dtrace=$1
> +
> +DIRNAME="$tmpdir/aggs_multicpus.$$.$RANDOM"
> +mkdir -p $DIRNAME
> +cd $DIRNAME
> +
> +#
> +# Run a D script that fires on every CPU,
> +# forcing DTrace to aggregate results over all CPUs.
> +#
> +
> +$dtrace -qn '
> + profile-600ms
> + {
> + printf("cpu %d\n", cpu);
> + @xcnt = count();
> + @xavg = avg(10 * cpu + 3);
> + @xstd = stddev(20 * cpu + 8);
> + @xmin = min(30 * cpu - 10);
> + @xmax = max(40 * cpu - 15);
> + @xsum = sum(50 * cpu);
> + }
> + tick-900ms
> + {
> + exit(0)
> + }
> +' > dtrace.out
> +if [ $? -ne 0 ]; then
> + echo DTrace failed
> + cat dtrace.out
> + exit 1
> +fi
> +
> +#
> +# Examine the results.
> +#
> +
> +awk '
> + BEGIN {
> + xcnt = xavg = xstm = xstd = xsum = 0;
> + xmin = +1000000000;
> + xmax = -1000000000;
> + }
> +
> + # the first "cpu" lines provide the inputs to the aggregations
> + /^cpu [0-9]*$/ {
> +
> + xcnt += 1;
> +
> + x = 10 * $2 + 3;
> + xavg += x;
> +
> + x = 20 * $2 + 8;
> + xstm += x;
> + xstd += x * x;
> +
> + x = 30 * $2 - 10;
> + if (xmin > x) { xmin = x };
> +
> + x = 40 * $2 - 15;
> + if (xmax < x) { xmax = x };
> +
> + x = 50 * $2;
> + xsum += x;
> +
> + next;
> + }
> +
> + # the remaining lines are the aggregation results
> + {
> + # first we finish computing our estimates for avg and stddev
> + # (the other results require no further action)
> +
> + xavg /= xcnt;
> +
> + xstm /= xcnt;
> + xstd /= xcnt;
> + xstd -= xstm * xstm;
> + xstd = int(sqrt(xstd));
> +
> + # now read the results and compare
> +
> + getline; if ($1 != xcnt) { printf("ERROR: cnt, expect %d got %d\n", xcnt, $1) };
> + getline; if ($1 != xavg) { printf("ERROR: avg, expect %d got %d\n", xavg, $1) };
> + getline; if ($1 != xstd) { printf("ERROR: std, expect %d got %d\n", xstd, $1) };
> + getline; if ($1 != xmin) { printf("ERROR: min, expect %d got %d\n", xmin, $1) };
> + getline; if ($1 != xmax) { printf("ERROR: max, expect %d got %d\n", xmax, $1) };
> + getline; if ($1 != xsum) { printf("ERROR: sum, expect %d got %d\n", xsum, $1) };
> + printf("done\n");
> + }
> +' dtrace.out > awk.out
> +if [ $? -ne 0 ]; then
> + echo awk failed
> + cat dtrace.out
> + exit 1
> +fi
> +
> +if grep -q ERROR awk.out ; then
> + echo ERROR found
> + echo "=================================================="
> + cat dtrace.out
> + echo "=================================================="
> + cat awk.out
> + echo "=================================================="
> + exit 1
> +fi
> +
> +echo success
> +exit 0
> --
> 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