Network tools · Network tools

iperf3 Throughput Testing Without Misreading the Result

iperf3 measures data transfer between two endpoints you control. Its result includes those endpoints and the selected network path. A low result does not automatically identify a slow switch, and a high parallel-stream result does not prove that one application connection will be equally fast.

Scope: ESnet iperf3, not iperf2. This is an active load test: it consumes capacity and can affect production traffic.

Agree a test window and acceptable load before testing a shared link. Use one variable at a time and preserve both endpoint versions. The server address below is a placeholder. Do not expose a permanent test listener to untrusted networks.

Establish a repeatable baseline #

On the destination:

Establish a repeatable baseline
Network tools · Local shell; platform and privileges as described below

Active test
iperf3 -s -1

Press Ctrl+C to stop early. The one-off server exits after one session; client duration is bounded.

On the source:

Establish a repeatable baseline
Network tools · Local shell; platform and privileges as described below

Active test

Replace these example values: 192.0.2.20.

iperf3 -c 192.0.2.20 -t 20 -O 3

Press Ctrl+C to stop early. The one-off server exits after one session; client duration is bounded.

The one-off server exits after the client session; start it again for each following test. The omit interval excludes the initial three seconds from the reported measurements. Keep duration, path and endpoint placement consistent when comparing results.

Change one property #

Change one property
Network tools · Local shell; platform and privileges as described below

Active test

Replace these example values: 192.0.2.20.

iperf3 -c 192.0.2.20 -t 20 -O 3 -R

Press Ctrl+C to stop early. The one-off server exits after one session; client duration is bounded.

Active test

Replace these example values: 192.0.2.20.

iperf3 -c 192.0.2.20 -t 20 -O 3 -P 4

Press Ctrl+C to stop early. The one-off server exits after one session; client duration is bounded.

Active test

Replace these example values: 192.0.2.20.

iperf3 -c 192.0.2.20 -u -b 20M -t 20

Press Ctrl+C to stop early. The one-off server exits after one session; client duration is bounded.

Active test

Replace these example values: 192.0.2.20.

iperf3 -c 192.0.2.20 -t 20 -O 3 -J

Press Ctrl+C to stop early. The one-off server exits after one session; client duration is bounded.

Reverse mode sends test data from server to client. Parallel streams test aggregate behavior across several TCP connections. The UDP example requests 20 Mbit/s rather than attempting unlimited load. JSON output makes runs easier to compare and archive. Permit the control connection and the chosen test transport through the relevant firewall.

Interpret the evidence #

ObservationInvestigation direction
Reverse direction is much slowerCompare sender and receiver resources and the opposite path
Four streams greatly exceed oneInvestigate per-flow limits, latency/loss and endpoint behavior
UDP loss rises as offered load risesCheck the actual bottleneck, policing and receiver capacity
Results vary during busy periodsRepeat with background utilization recorded

Neither UDP loss nor TCP retransmissions alone identifies where packets were lost. Compare interface counters and endpoint load during the same interval. CPU, virtual-machine scheduling, socket behavior and host networking can limit a test before the link does. iperf3 versions differ in threading behavior, so avoid old universal claims that every version is single-threaded.

Report the protocol, direction, stream count, duration, versions and sender/receiver summaries. Keep the single-stream result even when parallel tests look better. It is often the more relevant result for a single transfer, while the aggregate result answers a separate capacity question.

Sources

Documentation reviewed: 8 October 2026