[erlang-questions] 20k messages in 4s but want to go faster!
Sat Jul 11 02:25:13 CEST 2009
Michael Truog wrote:
> Matthew Sackman wrote:
>> On Sat, Jul 11, 2009 at 01:24:46AM +0200, Johnny Billquist wrote:
>>> Nagle is actually a good thing, which improves performance, not decrease it.
>>> There is one specific situation when you don't want nagle, and that
>>> is if you send very little data, and what it to be sent immediately.
>>> In that specific case, Nagle is an obstruction and should be shut
>> Yup. The immediate part shouldn't be underestimated. The improvement to
>> latency can be significant. If you're doing a lot of client-server
>> communication, then disabling Nagle can improve throughput substantially
>> as the latency comes down thus permitting higher round trips per second.
> As clarification, disabling Nagle is best for low latency networks and
> improves throughput. High latency networks can benefit from the
> algorithm, so it is generally used unless it is an internal cluster of
> See http://en.wikipedia.org/wiki/Nagle's_algorithm
> to see why real-time systems avoid Nagle.
Hmm, I can't see how Nagle would help if you have a high latency
network. Don't make no sense at all. That's not what Nagle is for.
That's what you have sliding window protocols for. And large packets,
large windows and large buffers.
But any high volume connection will benifit from Nagle. Try turning off
Nagle and do a file transfer, and you could become very disappointed
with the performance.
What Nagle really aims at, is when you have an application send lots of
small pieces of data. Without Nagle, each little bit will be send it
it's own TCP segment. With Nagle, all those small sends will be bundled
together in a larger TCP segment. Now, Nagle don't neccesarily delay
data, it only delays data if you have a segment smaller than MSS,
otherwise it will be send right away anyway, since there is no point in
delaying that packet to try and aggregate data.
And file transfers are usually not sending data in chunks adapted to the
MSS, but instead just sends whatever chunk size is convenient for the
tcp implementation. Nagle will make sure that the link is used as
efficiently as possible.
As I said from the start, the only time you should disable Nagle is if
you are sending *little* data, and want low latency. If you have high
volumes of data, Nagle will help you, by either not interfering at all
(if your applicion is sending chunks larger that the MSS), or
aggregating your data into as large IP packets as possible (thus
reducing the protocol overhead, and thereby improving throughput).
Real time systems should probably avoid Nagle, because they should be
very concerned with latency. More so than throughput. :-)
Johnny Billquist || "I'm on a bus
|| on a psychedelic trip
email: || Reading murder books
pdp is alive! || tryin' to stay hip" - B. Idol
More information about the erlang-questions