Skip to content

Lower throughput with MPTCP vs TCP #592

@roman-shuhov

Description

@roman-shuhov

Pre-requisites

  • A similar issue has not been reported before.
  • mptcp.dev website does not cover my case.
  • An up-to-date kernel is being used.
  • This case is not fixed with the latest stable (or LTS) version listed on kernel.org

What did you do?

TL;DR Performance test of MPTCP on machine with 2 physical NICs (100Gb/s) shows noticeably worse throughput than single TCP connection (10.2 Gb/s vs. 43.2 Gb/s).

Servers setup

Both client and server machines are equal and connected to each other through Rack switch.

Kernel: v6.13.2
NICs: 2 Mellanox devices eth0 and eth1 with 100Gb/s speed

# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 <server-eth0-prefix>::1  prefixlen 64  scopeid 0x0<global>
...
        RX errors 0  dropped 0  overruns 0  frame 0
...
        TX errors 0  dropped 4 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 <server-eth1-prefix>::1  prefixlen 64  scopeid 0x0<global>
...

MPTCP setup

Server side

# ip mptcp endpoint
<server-eth1-prefix>::1 id 1 signal dev eth1
# ip mptcp limit
add_addr_accepted 2 subflows 2

Client side

ip mptcp endpoint
<client-eth1-prefix>::1 id 1 subflow dev eth1
# ip mptcp limit
add_addr_accepted 2 subflows 2

Test setup

Using iperf3 compiled with mptcp support (esnet/iperf#1661).

MPTCP Test

[server] # iperf3 -m -s &
[server] # ip mptcp monitor
[LISTENER_CREATED] saddr6=:: sport=5201
[         CREATED] token=52bca52b remid=0 locid=0 saddr6=<server-eth0-prefix>::1 daddr6=<client-eth0-prefix>::1 sport=5201 dport=48573
[     ESTABLISHED] token=52bca52b remid=0 locid=0 saddr6=<server-eth0-prefix>::1 daddr6=<client-eth0-prefix>::1 sport=5201 dport=48573
[  SF_ESTABLISHED] token=52bca52b remid=1 locid=0 saddr6=<server-eth0-prefix>::1 daddr6=<client-eth1-prefix>::1 sport=5201 dport=58893 backup=0
[  SF_ESTABLISHED] token=52bca52b remid=2 locid=1 saddr6=<server-eth1-prefix>::1 daddr6=<client-eth1-prefix>::1 sport=5201 dport=63299 backup=0
[          CLOSED] token=52bca52b

# snapshot of NIC % util during test with `sar` tool

11:54:57 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
...
11:54:58 AM	 eth0 780104.95  15143.56 1143814.04   1598.74      0.00      0.00      0.99      9.37
11:54:58 AM	 eth1 344995.05    118.81 505897.96    160.35	   0.00      0.00      0.99	 4.14

[client] # iperf3 -c <server-eth0-prefix>::1 -t 30 -B <client-eth0-prefix>::1 -m
...
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-30.00  sec  36.2 GBytes  10.4 Gbits/sec  1162            sender
[  5]   0.00-30.00  sec  36.2 GBytes  10.4 Gbits/sec                  receiver

TCP Test

[server]# iperf3 -s &

# sar tool snapshot during test run
11:54:27 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
...
11:54:28 AM	 eth0 3767797.00  29652.00 5569314.57   2644.75      0.00      0.00      0.00     45.62
11:54:28 AM	 eth1    120.00    120.00    146.75    161.95	   0.00      0.00      1.00	 0.00

[client]# iperf3 -c <server-eth0-prefix>::1 -t 30 -B <client-eth0-prefix>::1
...
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-30.00  sec   152 GBytes  43.6 Gbits/sec  3431            sender
[  5]   0.00-30.00  sec   152 GBytes  43.6 Gbits/sec                  receiver

Notes

There is another issue reported in #562 for MPTCP overhead, but might make sense to keep them separate.

What happened?

MPTCP Throughput is 10.4 Gb/s with 2 subflows and 2 NICs vs. 43.6 Gb/s TCP connection on single NIC

What did you expect to have?

Smaller overhead of MPTCP on throughput

System info: Client/Server

Stripped some info, let me know if it's necessary to add
v6.13.2
...
NAME="CentOS Stream"
VERSION="9"
...
net.mptcp.add_addr_timeout = 120
net.mptcp.allow_join_initial_addr_port = 1
net.mptcp.available_schedulers = default
net.mptcp.blackhole_timeout = 3600
net.mptcp.checksum_enabled = 0
net.mptcp.close_timeout = 60
net.mptcp.enabled = 1
net.mptcp.pm_type = 0
net.mptcp.scheduler = default
net.mptcp.stale_loss_cnt = 4

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions