#!/bin/bash # # Distributed perftest. # Runs perftest clients on multiple hosts using ssh. # set -e usage() { cat < -- Run perftest with clients running on the listed hosts. Clients are assigned to hosts publishers first, then subscribers the host list is used round-robin if there are more clients than hosts. perftest-args should include a --host flag. Do not pass preftest action flags: --setup, --control, --publish, --subscribe. The script will pass them to the appropriate client processes. Note all perftest args must come before --. Error: $* EOF exit 1 } collect() { eval $COLLECT=\""\$$COLLECT $*"\"; } NPUBS=1 NSUBS=1 COLLECT=ARGS while test $# -gt 0; do case $1 in --publish|--subscribe|--setup|--control) usage "Don't pass perftest action flags: $1" ;; --npubs) collect $1 $2; NPUBS=$2; shift 2 ;; --nsubs) collect $1 $2; NSUBS=$2; shift 2 ;; -s|--summary) collect $1; QUIET=yes; shift 1 ;; --) COLLECT=HOSTS; shift ;; *) collect $1; shift ;; esac done if [ -z "$HOSTS" ]; then usage "No hosts listed after --"; fi ADDPATH="$PWD" PATH=$ADDPATH:$PATH which perftest>/dev/null || exit 1 PERFTEST="perftest $ARGS" HOSTS=($HOSTS) start() { HOST=${HOSTS[i % ${#HOSTS[*]}]} test -z "$QUIET" && echo "Client $i on $HOST $*" ssh -fT $HOST "PATH=$ADDPATH:\$PATH" $PERFTEST "$@" } $PERFTEST --setup for (( i=0 ; i < $NPUBS ; ++i)); do start --publish; done for (( ; i < $NPUBS+$NSUBS ; ++i)); do start --subscribe; done $PERFTEST --control