The attached patch adds a built-time setting SQUID_PIPELINE_MAX to
replace the magic numbers previously used for limiting the amount of
prefetch Squid does when pipeline_prefeth config directive is enabled.
The default remains at 2 unless altered by using -DSQUID_PIPELINE_MAX=n
in CXXFLAGS and this adds some documentation about why, and what can be
done to improve pipelining in future.
Amos
=== modified file 'src/client_side.cc'
--- src/client_side.cc 2013-05-08 03:02:01 +0000
+++ src/client_side.cc 2013-05-12 03:49:19 +0000
@@ -2935,14 +2935,22 @@
}
}
-static int
+static bool
connOkToAddRequest(ConnStateData * conn)
{
- int result = conn->getConcurrentRequestCount() <
(Config.onoff.pipeline_prefetch ? 2 : 1);
+ const int maxReq = (Config.onoff.pipeline_prefetch ? SQUID_PIPELINE_MAX :
1);
+ const bool result = (conn->getConcurrentRequestCount() < maxReq);
+
+ /* TODO: make this more dynamic?
+ * ... false / no pipeline for HTTP/1.0 clients?
+ * ... false if NTLM/Negotiate handshake is being done by the last parsed
request
+ * ie, pipeline prefetch non-auth requests, halt during connection-auth,
+ * and resume pipeline prefetching after authed.
+ */
if (!result) {
- debugs(33, 3, HERE << conn->clientConnection << " max concurrent
requests reached");
- debugs(33, 5, HERE << conn->clientConnection << " defering new request
until one is done");
+ debugs(33, 3, conn->clientConnection << " max concurrent requests
reached (" << maxReq << ")");
+ debugs(33, 5, conn->clientConnection << " defering new request until
one is done");
}
return result;
@@ -2970,7 +2978,7 @@
if (in.notYetUsed == 0)
break;
- /* Limit the number of concurrent requests to 2 */
+ /* Limit the number of concurrent requests to SQUID_PIPELINE_MAX */
if (!connOkToAddRequest(this)) {
break;
}
=== modified file 'src/client_side.h'
--- src/client_side.h 2013-04-04 06:15:00 +0000
+++ src/client_side.h 2013-05-12 03:33:35 +0000
@@ -175,10 +175,30 @@
class ServerBump;
}
#endif
+
+/** Maximum number of pipelined requests to pre-parse.
+ *
+ * Squid can pre-parse requests on a persistent connection and queue them for
+ * service while waiting for a leading transaction to complete. This value
+ * defines how many requests may be pre-parsed when pipeline_prefetch
+ * directive in squid.conf is set to ON and teh client is using a persistent
+ * connection.
+ *
+ * It is generally better to leave most pipelined requests in TCP buffers,
+ * which provides some push-back on the client sending rate.
+ *
+ * NP: currently limited to 2 in case there is any hidden code relying on that
+ * old hard-coded value still hanging around.
+ * May be set using -D in CXXFLAGS to test other values.
+ */
+#if !defined(SQUID_PIPELINE_MAX)
+#define SQUID_PIPELINE_MAX 2
+#endif
+
/**
* Manages a connection to a client.
*
- * Multiple requests (up to 2) can be pipelined. This object is responsible
for managing
+ * Multiple requests (up to SQUID_PIPELINE_MAX) can be pipelined. This object
is responsible for managing
* which one is currently being fulfilled and what happens to the queue if the
current one
* causes the client connection to be closed early.
*