Recently I discovered a bug in iPerf. iPerf is a very useful tool to test and measure bandwidth performance between an iPerf server and a client. In most cases, you run the bandwidth test only once between the two. The other option is to set up an iPerf server to run permanently on a host and then target that host to get iPerf measurements from several locations or hosts, which is more convenient because you don’t have to manage two hosts each time you want to run a test. But here is where the problems start…
This works as follows: On one machine, we run the command iperf -s -D
This starts the iPerf server (option -s
) and puts it in daemon mode (option -D
), which means the server will keep running even if we logout of the machine. Then, we run iperf -c [IP of iperf server]
from another machine.
The first time I tried this, it worked well initially, i.e., multiple iPerf tests could run by using the same iPerf server running as daemon. I noticed that after a day or two, the iPerf server wouldn’t respond and error messages (even a segmentation fault) appeared on the iPerf client side. By checking the processes on the iPerf server, it appeared that the process iperf -s -D
was running on the host, but it wouldn’t accept any traffic. If I killed and restarted the iPerf server process, it would run for a day or two until it crashed again.
To overcome this problem, I wrote this script to restart the process:
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin for i in {1..10}; do pid=$(ps ax | grep "iperf -s -D" | grep -v grep | awk '{print $1;}') if [ "$pid" == "" ]; then echo "$0: iperf process not found. Starting iperf" iperf -s -D exit 0 fi established=$(netstat -tunap | grep $pid/ipe | grep -q ESTABLISHED) if [ "$?" == "0" ]; then echo "$0: iperf pid $pid established. Not restarting iperf process" else echo "$0: killing iperf server with pid: $pid" kill -9 $pid echo "$0: Restarting iperf server and exiting" iperf -s -D break fi sleep 30 done exit 0
Save this script in the file /home/panos/restart_iperf.sh
and make it executable with chmod +x /home/panos/restart_iperf.sh
Finally run the test every hour on the 25th minute by saving the following file in /etc/cron.d/restart_iperf_cron
25 * * * * root /home/panos/restart_iperf.sh
When the iperf_restart.sh script runs, it first checks if the iPerf daemon is running. If not, it starts the daemon and exits. If it’s running, it kills the existing process and restarts a new one. In addition, it checks whether there is an established iPerf test connection, and makes sure that it doesn’t interrupt it.
This is a bug in iPerf version 2 that I’m sure others have come across and wondered why their tests were failing. I haven’t noticed the same problem with iPerf version 3. Although iPerf version 2 is older, it is much more widespread, and until everybody switches to version 3, this script might be helpful.