Thread (15 messages) 15 messages, 6 authors, 2011-03-23

Re: [PATCH] tcp: avoid cwnd moderation in undo

From: Carsten Wolff <hidden>
Date: 2011-03-16 16:19:15

Hi again,

On Wednesday 16 March 2011, Yuchung Cheng wrote:
On Tue, Mar 15, 2011 at 3:07 AM, Carsten Wolff [off-list ref] 
wrote:
quoted
Hi,

On Monday 14 March 2011, Yuchung Cheng wrote:
quoted
On Mon, Mar 14, 2011 at 3:06 AM, Carsten Wolff
[off-list ref]
wrote:
quoted
In the presence of reordering, cwnd is already moderated in Disorder
state before
 entering the (false) recovery.
Sure, cwnd moderation to in_flight + 1 segment is applied in disorder
state,
it's in_flight + 3 usually. the moderation first happens
tcp_try_to_open() instead of tcp_cwnd_down()
In disorder state, tcp_try_to_open() calls tcp_cwnd_down() which clamps cwnd 
to in_flight + 1 for dupacks (where tcp_packets_in_flight() is not to be 
confused with the IN_FLIGHT variable in IETF documents, which is called 
packets_out in Linux ...). Otherwise, Linux would be violating RFC3042, which 
allows to send one SMSS of data on each dupack before recovery (actually, just 
the first two, but since the DupThresh can be larger than 3 in linux, it 
extends Limited Transmit to more than just the first two dupacks). This is 
mostly equivalent to the aggressive variant of extended limited transmit in 
RFC4653.
quoted
because this is implementing a form of extended limited transmit.
Nevertheless, after a reordering event that caused a spurious fast
retransmit, there can be an undo of congestion state changes (either
after recovery or interrupting recovery, depending on the options
enabled in the connection). I just wanted to point out, that the
moderation step happening upon an undo may allow a larger burst, if a
previous reordering event was detected and caused tp->reordering to be
increased.
Your point is that cwnd should be moderated on reordering (in undo or
other events). Point taken.
 My point is that cwnd does not need to be moderated on false
recoveries. Do you agree?
To implement your design, tcp_update_reordering should do
tcp_cwnd_moderation().
To implement my point, the moderations should be avoided in undo
operations.

The two aren't in conflict. But there are cases that have both undo
and reordering.
Are we on the same page?
Unfortunately, no. ;-) My point is, that cwnd should be moderated when the 
congestion state changes are undone after a spurious recovery has been 
detected. Reordering is only one possible reason for a false recovery. And I 
stick to that point because of the thoughts I pointed out in my mail to john, 
i.e. undo typically leading to exceptionally large segment bursts.

As for cwnd moderation upon the detection of a reordering event (that's a 
different thing at a differnt point in time than detection of a false 
recovery!): This wouldn't make sense to me. The detection of the reordering 
event together with a metric that measures the extent of the reordering can be 
used to try and prevent false recoverys in future reordering events, by 
delaying the congestion reaction (i.e. fast retransmit) then.

Reordering can be a cause of spurious recovery. But undo mechanisms and 
mechanisms to prevent false recovery(s) are orthogonal.

Your patch touches all undos, while reordering is just an example for a cause 
of false recovery.
quoted
quoted
quoted
More importantly, the prior ssthresh is restored and not affected by
moderation. This means, if moderation reduces cwnd to a small value,
then cwnd < ssthresh and TCP will quickly slow-start back to the
previous state, without sending a big burst of segments.
This is actually the more important point, because it means that the
moderation does not negate the effects of the undo operation, as
suggested by your patch-description.
It's a double-edge sword. Why slow-start if there is no real loss?
Its a timing thing. I mean, it is an undo operation: the harm has been done, 
some opportunity to send new data has been lost. Trying to send all that data 
at once now without an ACK-clock will cause more harm when buffers are under 
pressure. The undo operation should not try to make up for lost opportunity, 
only try to reduce further loss of opportunity to send new data. For this, the 
segment bursts have to be moderated.
It
hurts short
request-response type traffic performance badly b/c each undo makes cwnd =
3.
quoted
False fast retransmits are mostly caused by reordering, spurious RTOs can
also be caused by delay variations that do not exhibit reordering. Your
patch touches all cases of spurious events. Anyway, I just mentioned
reordering, because it is the event in which Linux already allows larger
bursts of size tp->reordering in the moderation function (i.e.
tp->reordering might be increased). It's also not important to me if the
undo is happening duringor after recovery, the important question is, if
burst protection in general is an important goal, or not (and I think
it's there for a reason).
I am hoping my previous explanation make sense to you (these two points are
not in conflict).
I hope the same for my explanations. :-)

Cheers
Carsten
-- 
           /\-´-/\
          (  @ @  )
________o0O___^___O0o________

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help