Mnesia and Oracle

Matthias Lang <>
Fri Aug 11 08:33:26 CEST 2006


Valentin Micic writes:

 > well these guys, for whatever reason, like to change the 
 > settings for the port -- thus,  auto_negotiate flag that was set to false, 
 > end up being true, what used to be full duplex ends up being half... and as 
 > the traffic volume picks up, so do the error/collisions etc. 

The problem you're describing is so pernicious that I can't resist
expanding on what's going on, even though it's only tenuously related
to Erlang.

Consider what happens on one cable in a switched ethernet. Assume the
cable goes from a server to a switch:

  Switch set to     Server set to     Result
  ----------------------------------------------------------------------
  Autonegotiate     Autonegotiate     Both ends full duplex, 
                                      no collisions, perfect.
  
  No autoneg.       Autonegotiate     Both ends half duplex,
  half duplex                         Normal collisions. Good.

  No autoneg.       Autonegotiate     Switch uses full duplex.
  full duplex                         Server uses half duplex.
                                      Hilarity ensues.

A collision, in spite of the name, is a normal thing that happens on
half-duplex ethernets. On a normal switched network, the effect on
performance is small and well-behaved.

But the third case above is special. It has one end of the wire using
"half duplex" rules and the other end using "full duplex" rules. The
"full duplex" end neither detects nor attempts to avoid collisions. At
the same time, the "half duplex" end *does* detect
collisions. Consider what happens during a collision:

  1. Switch transmits packet A to server. 

  2. (overlaps with 1). Server transmits packet B to switch.

  3. In the switch's world, there is no collision. No further action taken.

  4. In the server's world, there was a collision. 
     Server aborts packet B by sending a 'jam' sequence. 
     Server discards packet A.

  5. Server retransmits packet B.

Note that packet A was discarded and never retransmitted. So suddenly
you have a LAN that loses packets. And the more traffic there is, the
more packets it loses. Lost packets wreak absolute havoc on TCP
throughput.

Matthias



More information about the erlang-questions mailing list