Skip to content

Benchmarks · iperf3

Saphira Linux hits 713 Gbit/s aggregate TCP throughput

A measured ten-second iperf3 run transferred 830 GB at 713 Gbit/s. The number is unusual; the console output and the limits of the test are published with it.

Saphira speed daemon, the network dragon

The result

These are measurements taken from the Saphira system used to build and test the platform, not a synthetic marketing chart. A parallel TCP run reached 713 Gbit/s over ten seconds, transferring 830 GB. That is 0.713 Tbit/s — not 0.75 Tbit/s — so 713 Gbit/s is the headline we publish.

We said the exact number because it is the true number. We do not do marketing bullshit: if we cannot prove a figure with its command, route and terminal output, we do not tell it. It's so simple it hurts.

It's so fast the wires may get warm. Or they may not — claiming that they do would be marketing. What the evidence does show is that this has turned the heat up on an otherwise untuned network stack.

The useful finding is the shape of the scaling curve. Three streams reached 404 Gbit/s; four reached 524 Gbit/s; five reached 573 Gbit/s; and the observed eight-stream peak reached 713 Gbit/s. A second eight-stream run still delivered 691 Gbit/s with zero retransmissions. Higher concurrency did not improve the completed-run total: the nineteen-stream run recorded 312 Gbit/s with 33 retransmissions, suggesting CPU scheduling, queue contention and processing overhead had become the limiting work.

Parallel streamsTransferReceiver throughputSender retransmissions
-P3470 GB404 Gbit/s0
-P4610 GB524 Gbit/s0
-P5668 GB573 Gbit/s0
-P8 (peak)830 GB713 Gbit/sNot recorded by server
-P8 (repeat)804 GB691 Gbit/s0
-P12569 GB488 Gbit/s40
-P16293 GB251 Gbit/s78
-P18296 GB254 Gbit/s93
-P19364 GB312 Gbit/s33
-P24276 GB237 Gbit/s103

Real network paths

The following runs use Egg's routable address, 2a02:8012:bc57:c0ff::babe, rather than loopback. They are therefore reported separately from the local TCP results above.

From Minimer, the path crosses its gateway and gateway.akadata.ltd before entering Egg. The stated topology has two 1 Gbit/s sections before the 2.5 Gbit/s segment and KVM port. Both the single-stream and four-stream results settle at about 950 Mbit/s: exactly what the narrowest 1 Gbit/s path can deliver. Four streams divide the bandwidth almost perfectly at about 238 Mbit/s each; they fill the link, rather than bypass it. A later Minimer run repeats the result at 957 Mbit/s with one stream and 949 Mbit/s with two: the same three-hop path, the same 1 Gbit/s ceiling, and a second data point.

Route provides the next step up: its traceroute reaches Egg through gateway.akadata.ltd in two hops, over the stated 2.5 Gbit/s route into Homer, KVM and VirtIO. One TCP stream delivers 2.47 Gbit/s for ten seconds, transferring 2.87 GB with no retransmissions. Four streams also total 2.47 Gbit/s and transfer 2.88 GB, again with zero retransmissions. This is a real network-path result that reaches the expected 2.5 Gbit/s ceiling rather than a localhost or host-only measurement.

Spaghetti, a KVM guest at www.az2.co.uk, provides a separate three-hop route to Egg: VirtIO → Route → 2.5 Gbit/s → Homer → KVM. Its single-stream run transfers 2.86 GB at 2.46 Gbit/s; four streams transfer 2.87 GB at 2.47 Gbit/s. Both client results record zero retransmissions. This is a second routed, virtual-machine-to-virtual-machine validation of the 2.5 Gbit/s path.

The separate one-hop peer capture from c0ff::1reaches 226 Gbit/s with four streams, and the supplied eight-stream network summary records 177 Gbit/s. Those totals cannot have crossed a physical 2.5 Gbit/s port, so this page does not describe them as a 2.5 Gbit/s-wire result. The server output establishes the endpoints and totals; its virtual topology will be published when that route is captured.

Client / captureStreamsTransferReceiver throughputScope
Minimer initial · 2a02:8012:bc57:253::2-P11.10 GB946 Mbit/sThree-hop path; 1 Gbit/s limited
Minimer initial · 2a02:8012:bc57:253::2-P41.11 GB951 Mbit/sThree-hop path; 1 Gbit/s limited
Minimer repeat · 2a02:8012:bc57:253::2-P11.11 GB957 Mbit/sThree-hop path; 1 Gbit/s limited
Minimer repeat · 2a02:8012:bc57:253::2-P21.11 GB949 Mbit/sThree-hop path; 1 Gbit/s limited
Route · 2a02:8012:bc57:db00:cafe:c0ff:ee:db-P12.87 GB2.47 Gbit/sTwo-hop route; 2.5 Gbit/s path into KVM/VirtIO
Route · 2a02:8012:bc57:db00:cafe:c0ff:ee:db-P42.88 GB2.47 Gbit/sTwo-hop route; 0 retransmissions
Spaghetti VM · 2a02:8012:bc57:fead::bbbb-P12.86 GB2.46 Gbit/sThree-hop VirtIO → Route → 2.5 Gbit/s → Homer → KVM
Spaghetti VM · 2a02:8012:bc57:fead::bbbb-P42.87 GB2.47 Gbit/sThree-hop VirtIO → Route → 2.5 Gbit/s → Homer → KVM; 0 retransmissions
One-hop peer · 2a02:8012:bc57:c0ff::1-P4263 GB226 Gbit/sServer capture; virtual path details pending
Network P8 capture-P8206 GB177 Gbit/sServer summary supplied without peer line

Minimer → gateway → gateway.akadata.ltd → Egg

[root@minimer network]# traceroute 2a02:8012:bc57:c0ff::babe
traceroute to 2a02:8012:bc57:c0ff::babe (2a02:8012:bc57:c0ff::babe), 30 hops max, 80 byte packets
 1  _gateway (2a02:8012:bc57:253::1)  0.175 ms  0.102 ms  0.140 ms
 2  gateway.akadata.ltd (2a02:8012:bc57:1::2)  0.240 ms  0.215 ms  0.187 ms
 3  egg.saphira.vm2.uk (2a02:8012:bc57:c0ff::babe)  1.244 ms  1.254 ms  1.073 ms

Minimer repeat results

[smalley@minimer ~]$ traceroute egg.saphira.vm2.uk
traceroute to egg.saphira.vm2.uk (2a02:8012:bc57:c0ff::babe), 30 hops max, 80 byte packets
 1  _gateway (2a02:8012:bc57:253::1)  0.124 ms  0.082 ms  0.108 ms
 2  gateway.akadata.ltd (2a02:8012:bc57:1::2)  0.276 ms  0.264 ms  0.284 ms
 3  egg.saphira.vm2.uk (2a02:8012:bc57:c0ff::babe)  0.732 ms *  0.714 ms
Server listening on 5201 (test #14)
Accepted connection from 2a02:8012:bc57:253::2, port 32778
[  5]   0.00-10.00  sec  1.11 GBytes   957 Mbits/sec                  receiver

Server listening on 5201 (test #15)
Accepted connection from 2a02:8012:bc57:253::2, port 53874
[  5]   0.00-10.00  sec   566 MBytes   474 Mbits/sec                  receiver
[  8]   0.00-10.00  sec   566 MBytes   474 Mbits/sec                  receiver
[SUM]   0.00-10.00  sec  1.11 GBytes   949 Mbits/sec                  receiver

Route → gateway.akadata.ltd → Egg (2.5 Gbit/s path)

route:~$ traceroute -6 egg.saphira.vm2.uk
traceroute to egg.saphira.vm2.uk (2a02:8012:bc57:c0ff::babe), 30 hops max, 80 byte packets
 1  gateway.akadata.ltd (2a02:8012:bc57:1::2)  0.163 ms  0.170 ms  0.151 ms
 2  egg.saphira.vm2.uk (2a02:8012:bc57:c0ff::babe)  1.487 ms  1.410 ms *

Route client results

route:~$ iperf3 -c egg.saphira.vm2.uk
Connecting to host egg.saphira.vm2.uk, port 5201
[  5] local 2a02:8012:bc57:db00:cafe:c0ff:ee:db port 43272 connected to 2a02:8012:bc57:c0ff::babe port 5201
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  2.88 GBytes  2.47 Gbits/sec    0             sender
[  5]   0.00-10.00  sec  2.87 GBytes  2.47 Gbits/sec                  receiver

route:~$ iperf3 -c egg.saphira.vm2.uk -P4
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   737 MBytes   618 Mbits/sec    0             sender
[  7]   0.00-10.00  sec   737 MBytes   618 Mbits/sec    0             sender
[  9]   0.00-10.00  sec   982 MBytes   824 Mbits/sec    0             sender
[ 11]   0.00-10.00  sec   492 MBytes   413 Mbits/sec    0             sender
[SUM]   0.00-10.00  sec  2.88 GBytes  2.47 Gbits/sec    0             sender
[SUM]   0.00-10.00  sec  2.88 GBytes  2.47 Gbits/sec                  receiver

Spaghetti → gateway → gateway.akadata.ltd → Egg

[smalley@spaghetti ~]$ traceroute egg.saphira.vm2.uk
traceroute to egg.saphira.vm2.uk (2a02:8012:bc57:c0ff::babe), 30 hops max, 80 byte packets
 1  _gateway (2a02:8012:bc57:fead::1)  0.184 ms  0.150 ms  0.131 ms
 2  gateway.akadata.ltd (2a02:8012:bc57:1::2)  0.369 ms  0.344 ms  0.327 ms
 3  egg.saphira.vm2.uk (2a02:8012:bc57:c0ff::babe)  1.664 ms  1.481 ms  1.617 ms
[smalley@spaghetti ~]$ iperf3 -c egg.saphira.vm2.uk
[  5] local 2a02:8012:bc57:fead::bbbb port 48874 connected to 2a02:8012:bc57:c0ff::babe port 5201
[  5]   0.00-10.00  sec  2.87 GBytes  2.46 Gbits/sec    0             sender
[  5]   0.00-10.00  sec  2.86 GBytes  2.46 Gbits/sec                  receiver

[smalley@spaghetti ~]$ iperf3 -c egg.saphira.vm2.uk -P4
[SUM]   0.00-10.00  sec  2.88 GBytes  2.48 Gbits/sec    0             sender
[SUM]   0.00-10.00  sec  2.87 GBytes  2.47 Gbits/sec                  receiver

Network server summaries

Server listening on 5201 (test #1)
Accepted connection from 2a02:8012:bc57:253::2, port 53926
[  5] local 2a02:8012:bc57:c0ff::babe port 5201 connected to 2a02:8012:bc57:253::2 port 53940
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec  1.10 GBytes   946 Mbits/sec                  receiver

Server listening on 5201 (test #2)
Accepted connection from 2a02:8012:bc57:253::2, port 43426
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec   283 MBytes   238 Mbits/sec                  receiver
[  8]   0.00-10.00  sec   283 MBytes   238 Mbits/sec                  receiver
[ 10]   0.00-10.00  sec   283 MBytes   238 Mbits/sec                  receiver
[ 12]   0.00-10.00  sec   283 MBytes   238 Mbits/sec                  receiver
[SUM]   0.00-10.00  sec  1.11 GBytes   951 Mbits/sec                  receiver

Server listening on 5201 (test #3)
Accepted connection from 2a02:8012:bc57:c0ff::1, port 44914
[SUM]   0.00-10.00  sec   263 GBytes   226 Gbits/sec                  receiver

Server listening on 5201 (test #6)
[SUM]   0.00-10.00  sec   206 GBytes   177 Gbits/sec                  receiver

Virtual switching and external baseline

These results use the existing system configuration. No benchmark-specific sysctl tuning was applied. Internal network segments use an MTU of 9000, and Open vSwitch is used extensively on Minimer, Homer and the current Route host to join guests, gateways and service networks.

The Route host currently runs Alpine Linux. It is intended to be replaced with Saphira-S after the pppd and rp-pppoe stacks have been proven. The planned external path isrp-pppoe → Route (10 GbE) → Route (2.5 GbE) → Homer (2.5 GbE) → KVM.

Homer's external connection establishes that the available Internet service is not the 1 Gbit/s ceiling seen on Minimer. A multi-connection speed test measured 2,216.19 Mbit/s download, 2,232.67 Mbit/s upload and 4 ms ping; download latency was 74 ms and upload latency 7 ms.

Open vSwitch topology summary

Minimer
Bridge dnsnet0
    Port vnet4
    Port dnsgw0 (internal)
Bridge mailnetwork0
    Port vnet3
    Port mailgw0 (internal)

[smalley@homer ~]$ sudo ovs-vsctl show
Bridge aka0
    Port vnet62
    Port vnet61
    Port vnet59
    Port agw0 (internal)

[smalley@route ~]$ sudo ovs-vsctl show
Bridge servernet0
    Port vnet32
    Port vnet31
    Port vnet25
    Port vnet33
    Port vnet23
    Port servergw0 (internal)
Additional Route bridges: datanet0, ns1network0, internet0, ns0net0

2,216.19

Mbit/s download

2,232.67

Mbit/s upload

4 ms

Ping

Test run on Homer via Speedtest result 19612689410.

Test system and scope

Egg is a 24-vCPU Intel Core i9-13900K virtual machine running under libvirt/KVM. Its VirtIO network device is configured with 24 queues. iperf3 was run as a TCP client and server on Egg for ten seconds per completed run.

The captured commands target ::1. This is therefore an IPv6 loopback benchmark: it exercises the Linux TCP/IP stack and host CPU, but does not traverse Egg's VirtIO NIC, Open vSwitch or a physical link. The queue count is useful system context, not the path measured by these results.

DNS may be active elsewhere in the test environment, but the recorded iperf3 commands use a literal IPv6 address. Name resolution is therefore not part of this measured TCP flow, and these results are not presented as a DNS benchmark.

No 800G network card or cable carried the loopback traffic. The guest-to-guest and externally routed cases above are separately labelled with their client address, route and available VirtIO/Open vSwitch context.

System
Egg
CPU allocation
24 vCPU, Intel Core i9-13900K
Virtualisation
libvirt/KVM
VirtIO queues
24
Protocol
TCP over IPv6 loopback
Endpoint
::1:5201
Duration
10 seconds per completed run

The console behind the peak

The eight-stream client command is reconstructed from the server transcript, which records eight accepted connections. The supplied client capture starts after that command, but records its final receiver total below. We keep that distinction visible rather than invent a complete transcript.

smalley@egg:~$ iperf3 -c ::1 -P8
...
[SUM]   6.00-7.00   sec  81.1 GBytes   696 Gbits/sec
[SUM]   7.00-8.00   sec  81.6 GBytes   701 Gbits/sec
[SUM]   8.00-9.00   sec  85.0 GBytes   730 Gbits/sec
[SUM]   9.00-10.00  sec  74.7 GBytes   642 Gbits/sec
...
[SUM]   0.00-10.00  sec   830 GBytes   713 Gbits/sec                  receiver

More real client results

The zero-retransmission three-, four- and five-stream runs show that the aggregate result did not depend on a single stream. Full client and server transcripts are kept with the project as tests/iperf3.client.txt and tests/iperf3.server.txt.

smalley@egg:~$ iperf3 -c ::1 -P5
...
[SUM]   0.00-10.00  sec   668 GBytes   573 Gbits/sec    0             sender
[SUM]   0.00-10.00  sec   668 GBytes   573 Gbits/sec                  receiver

smalley@egg:~$ iperf3 -c ::1 -P4
...
[SUM]   0.00-10.00  sec   610 GBytes   524 Gbits/sec    0             sender
[SUM]   0.00-10.00  sec   610 GBytes   524 Gbits/sec                  receiver

smalley@egg:~$ iperf3 -c ::1 -P3
...
[SUM]   0.00-10.00  sec   470 GBytes   404 Gbits/sec    0             sender
[SUM]   0.00-10.00  sec   470 GBytes   404 Gbits/sec                  receiver

Local -P8 repeat and -P19 comparison

[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  90.6 GBytes  77.8 Gbits/sec    0            sender
[  7]   0.00-10.00  sec  92.9 GBytes  79.8 Gbits/sec    0            sender
[  9]   0.00-10.00  sec   122 GBytes   105 Gbits/sec    0            sender
[ 11]   0.00-10.00  sec  99.5 GBytes  85.5 Gbits/sec    0            sender
[ 13]   0.00-10.00  sec  89.8 GBytes  77.1 Gbits/sec    0            sender
[ 15]   0.00-10.00  sec   117 GBytes   100 Gbits/sec    0            sender
[ 17]   0.00-10.00  sec  87.0 GBytes  74.7 Gbits/sec    0            sender
[ 19]   0.00-10.00  sec   105 GBytes  90.5 Gbits/sec    0            sender
[SUM]   0.00-10.00  sec   804 GBytes   691 Gbits/sec    0             sender
[SUM]   0.00-10.00  sec   804 GBytes   691 Gbits/sec                  receiver

[ ID] Interval           Transfer     Bitrate         Retr
[SUM]   0.00-10.00  sec   364 GBytes   312 Gbits/sec   33             sender
[SUM]   0.00-10.01  sec   364 GBytes   312 Gbits/sec                  receiver

iperf Done.

What comes next

Raw TCP is only the first layer. Saphira networking includes Linux, VirtIO, Open vSwitch, nftables, IPVS/LVS and the userspace needed to build real infrastructure. The next results will move up that stack: guest network topology and queue-count comparisons, Open vSwitch flow distribution, LVS/IPVS connection scaling, HAProxy HTTP/TLS workloads, IPv4-versus-IPv6 paths, and storage-backed service traffic.

The intention is to measure the whole path, not merely the easiest number to publish. Every benchmark here will retain its role, CPU allocation, queue count, protocol, command, duration and terminal output. Extraordinary numbers are easy to type. We prefer to show the console.

That is not a slogan. It is the rule: no proof, no claim. The truth can occasionally hurt, but it is more useful than marketing bullshit.

713 Gbit/s was not the target. It was simply what happened when Saphira had work to do. The interesting benchmarks are still to come.