#!/bin/sh -e # shellcheck disable=SC1091 . ../../lib/sh-test-lib OUTPUT="$(pwd)/output" RESULT_FILE="${OUTPUT}/result.txt" LOGFILE="${OUTPUT}/iperf.txt" # Test locahost by defualt, which tests the effificency of TCP/IP stack. # To test physical network bandwidth, specify remote test server with '-c'. # Execute 'iperf3 -s' on remote host to run iperf3 test server. SERVER="127.0.0.1" # Time in seconds to transmit for TIME="10" # Number of parallel client streams to run THREADS="1" # Specify iperf3 version for CentOS. VERSION="3.1.4" usage() { echo "Usage: $0 [-c server] [-t time] [-p number] [-v version] [-s true|false]" 1>&2 exit 1 } while getopts "c:t:p:v:s:h" o; do case "$o" in c) SERVER="${OPTARG}" ;; t) TIME="${OPTARG}" ;; p) THREADS="${OPTARG}" ;; v) VERSION="${OPTARG}" ;; s) SKIP_INSTALL="${OPTARG}" ;; h|*) usage ;; esac done [ -d "${OUTPUT}" ] && mv "${OUTPUT}" "${OUTPUT}_$(date +%Y%m%d%H%M%S)" mkdir -p "${OUTPUT}" cd "${OUTPUT}" if [ "${SKIP_INSTALL}" = "true" ] || [ "${SKIP_INSTALL}" = "True" ]; then info_msg "iperf installation skipped" else ! check_root && error_msg "You need to be root for installation!" dist_name # shellcheck disable=SC2154 case "${dist}" in Debian|Ubuntu|Fedora) install_deps "iperf3" ;; CentOS) install_deps "wget gcc make" wget https://github.com/esnet/iperf/archive/"${VERSION}".tar.gz tar xf "${VERSION}".tar.gz cd iperf-"${VERSION}" ./configure make make install ;; esac fi # Run local iperf3 server as a daemon when testing localhost. [ "${SERVER}" = "127.0.0.1" ] && iperf3 -s -D # Run iperf test with unbuffered output mode. stdbuf -o0 iperf3 -c "${SERVER}" -t "${TIME}" -P "${THREADS}" 2>&1 \ | tee "${LOGFILE}" # Parse logfile. if [ "${THREADS}" -eq 1 ]; then egrep "(sender|receiver)" "${LOGFILE}" \ | awk '{printf("iperf-%s pass %s %s\n", $NF,$7,$8)}' \ | tee -a "${RESULT_FILE}" elif [ "${THREADS}" -gt 1 ]; then egrep "[SUM].*(sender|receiver)" "${LOGFILE}" \ | awk '{printf("iperf-%s pass %s %s\n", $NF,$6,$7)}' \ | tee -a "${RESULT_FILE}" fi # Kill iperf test daemon if any. pkill iperf3 || true