after lots of experimenting this finally is the easiest setup I found to reproduce the issue within seconds:
hardware setup:
- desktop A (Gbit) connected to BPI-R3 (lan0) via Gbit switch A (in 192.168.140.0/24)
- desktop B (Gbit) connected to BPI-R3 (lan2) via Gbit switch B (in 192.168.150.0/24)
- RaspberryPi (100Mbit) connected to BPI-R3 (lan2) via Gbit switch B (in 192.168.150.0/24)
some illustrating ASCII art:
------------------------
desktop A (debian 11.11)
------------------------
|
-------------
Gbit switch A
-------------
|
-------------------------
lan0 (192.168.140.0/24)
BPI-R3 (debian 12.7)
lan2 (192.168.150.0/24)
-------------------------
|
-------------
Gbit switch B
-------------
| \
| \
-------------------------- \
Raspberry Pi (debian 11.9) \
-------------------------- \
\
-----------------------
desktop B (debian 12.5)
-----------------------
software setup:
basically only 2 concurrent ‘rsyncs’ are needed copying some files around. All commands are started from desktop A
desktopA# ssh raspberrypi rm -frv /tmp/YYYYY; rsync --delete -vaX --numeric-ids source_dir raspberrypi:/tmp/YYYYY
desktopA# ssh desktopB rm -frv /tmp/YYYYY; rsync --delete -vaX --numeric-ids source_dir desktopB:/tmp/YYYYY
(started in different shells concurrently)
error symptoms:
in case of error the ‘rsync’ running between ‘desktop A’ and ‘desktop B’ breaks with:
client_loop: send disconnect: Broken pipe
rsync: [sender] write error: Broken pipe (32)
rsync error: unexplained error (code 255) at io.c(823) [sender=3.2.3]
the other ‘rsync’ running between ‘desktop A’ and ‘raspberrypi’ is mostly not affected
successful workaround:
ethtool -K eth0 tx off
thanks to @meehien for providing this
caveats:
setting ‘tx’ to ‘off’ impacts network performance.
with ‘tx on’ (the default) ‘iftop’ utility shows stunning ‘117MB’ when running a simple ‘netcat’ between ‘desktop A’ and ‘desktop B’. Excellent for a truly routing/firewalling device.
alas with ‘tx off’ (workaround) ‘iftop’ utility shows no more than about ‘94MB’ for the same
desktopA# netcat desktopB 9000 < /dev/zero
desktopB# netcat -l 9000 > /dev/zero
without workaround:
desktopA# iftop -B
238MB 477MB 715MB 954MB 1.16GB
└─────────────┴──────────────┴─────────────┴──────────────┴──────────────
desktopA <=> desktopB 117MB 117MB 116MB
with workaround:
desktopA# iftop -B
238MB 477MB 715MB 954MB 1.16GB
└─────────────┴──────────────┴─────────────┴──────────────┴──────────────
desktopA <=> desktopB 94.6MB 94.2MB 93.0MB