|
This page should apply to all Ubuntu versions |
Introduction
Ethernet flow control, or 802.3x, is a way for a network device to tell its immediate neighbour that it is overloaded with data, such as when a device is receiving data faster than it can process it. Unfortunately, if flow control is enabled on a gigabit switch with a gigabit server and 100Mbps clients, it may bring down the whole network bandwidth to 100Mbps. So flow control should be disabled for mixed-speed LTSP networks.
Disabling flow control on the switch
If your switch is managed, you could disable flow control from its configuration interface. Check your switch manual for instructions.
Disabling flow control with a script
If your switch doesn't allow disabling flow control (or even if it does but you don't want to bother with its configuration interface), you can download this script and put it to /etc/network/if-up.d/sch-scripts. Then make it executable by running:
sudo chmod +x /etc/network/if-up.d/sch-scripts # And also install ethtool: sudo apt-get --yes install ethtool
That script is part of some Greek software called "sch-scripts" and it automatically tries either ethtool or mii-tool to disable flow control for your NIC, because usually NICs only support one of those tools. You can then check if it worked by running:
grep sch-scripts /var/log/syslog
Essentially, the commands that the script internally runs are:
# $neg is either "on" or "off" depending on the NIC: ethtool --pause eth0 autoneg "$neg" rx off # For NICs that don't support ethtool, mii-tool is used: mii-tool -A "1000baseT-HD 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD" eth0
Disabling flow control with module parameters
Some might argue that the ideal way to disable flow control would be to instruct the NIC module to do so, via /etc/modprobe.d/options.conf, for example:
Driver |
/etc/modprobe.d/options.conf line |
e1000 |
options e1000 FlowControl=2 |
3c59x |
options 3c59x flow_ctrl=0 |
Unfortunately only a few modules support that method. You can discover them with this code:
find /lib/modules/*/kernel/drivers/net -name '*.ko' -exec basename {} \; | while read mod; do mod=${mod%.ko} res=$(modinfo "$mod" | grep -i flow) if [ -n "$res" ]; then echo "=== $mod ===" echo "$res" fi done
Benchmarks
A real-life benchmark showed that with flow control on, a 100/1000 mixed speed network operated at 90Mbps, and with flow control off the bandwidth increased to 900Mbps.
One easy way to benchmark your LAN is with the Epoptes computer lab management tool: http://www.epoptes.org/documentation/lan-benchmark
See Also
UbuntuLTSP - Community Ubuntu LTSP Documentation.
External Links
Beware Ethernet flow control - A detailed explanation of the problem.
Ethernet flow control - An article about Ethernet flow control from WikiPedia.
Discussion - A discussion about the problem in the ltsp-discuss mailing list.