| #!/bin/bash |
| # |
| # Distributed perftest. |
| # Runs perftest clients on multiple hosts using ssh. |
| # |
| |
| set -e |
| usage() { |
| cat <<EOF |
| usage: $0 <perftest-args> -- <client-hosts ...> |
| |
| 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 <brokerhost> 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 ;; |
| --) COLLECT=HOSTS; shift ;; |
| *) collect $1; shift ;; |
| esac |
| done |
| if [ -z "$HOSTS" ]; then usage "No hosts listed after --"; fi |
| PATH="`dirname $0`:$PATH" |
| PERFTEST="`which perftest` $ARGS" || usage "Can't find perftest executable" |
| |
| HOSTS=($HOSTS) |
| start() { ssh ${HOSTS[i % ${#HOSTS[*]}]} $PERFTEST $*& } |
| |
| $PERFTEST --setup |
| for (( i=0 ; i < $NPUBS ; ++i)); do start --publish; done |
| for (( ; i < $NPUBS+$NSUBS ; ++i)); do start --subscribe; done |
| $PERFTEST --control |