[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