From 9641e8f6ee293c478a0c2283d1cc8d5b75bfc1d3 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 23 Mar 2007 23:02:09 +0100 Subject: [PATCH] [MINOR] read optimizations based on the MSS Generally, if a recv() returns less bytes than the MSS, it means that there is nothing left in the system's buffers, and that it's not worth trying to read again because we are very likely to get nothing. A default read low limit has been set to 1460 bytes below which we stop reading. This has brought a little speed boost on small objects while maintaining the same speed on large objects. --- include/common/defaults.h | 7 +++++++ src/stream_sock.c | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/include/common/defaults.h b/include/common/defaults.h index 89ee1041c..e6552de80 100644 --- a/include/common/defaults.h +++ b/include/common/defaults.h @@ -64,6 +64,13 @@ #define MAX_READ_POLL_LOOPS 4 #endif +// the number of bytes returned by a read below which we will not try to +// poll the socket again. Generally, return values below the MSS are worthless +// to try again. +#ifndef MIN_RET_FOR_READ_LOOP +#define MIN_RET_FOR_READ_LOOP 1460 +#endif + // cookie delimitor in "prefix" mode. This character is inserted between the // persistence cookie and the original value. The '~' is allowed by RFC2965, // and should not be too common in server names. diff --git a/src/stream_sock.c b/src/stream_sock.c index 4e0811725..f9e56272e 100644 --- a/src/stream_sock.c +++ b/src/stream_sock.c @@ -95,6 +95,15 @@ int stream_sock_read(int fd) { } b->total += ret; + + /* generally if we read something smaller than the 1 or 2 MSS, + * it means that it's not worth trying to read again. + */ + if (ret < MIN_RET_FOR_READ_LOOP) + break; + if (!read_poll) + break; + /* we hope to read more data or to get a close on next round */ continue; }