]> granicus.if.org Git - apache/commitdiff
With the current implementation, it is likely to connect/close a socket with the...
authorChristophe Jaillet <jailletc36@apache.org>
Sat, 15 Aug 2015 22:05:08 +0000 (22:05 +0000)
committerChristophe Jaillet <jailletc36@apache.org>
Sat, 15 Aug 2015 22:05:08 +0000 (22:05 +0000)
The root cause is a too small idle timeout (600 microseconds).

Add a new directive, 'MemcacheConnTTL',  to control this idle connection timeout with the memcache server(s).
Change the default value from 600 usec (!) to 15 sec as per Yann suggestion.

I've limited accepted values from 1 to 1800 seconds (half an hour) because internaly, the value passed to 'apr_memcache_server_create' is still in mirco-seconds.

PR 58091
~~~~~~~~~~~~~~~~~~~_
Homemade measurement (on a slighly modified version of httpd) shows a +30% in number of processed requests using memcache to cache /index.html.
Comparison made between the 600 usec and 15 sec TTL.

Memcache config:
    default
httpd Config:
    CacheEnable socache /
    CacheSocache memcache:127.0.0.1
    LoadModule mpm_event_module modules/mod_mpm_event.so
httpd compiled with:
    ./configure --enable-mpms-shared=all --with-included-apr --with-mysql --with-libxml2 --enable-modules=reallyall --enable-ssl-ct=no --enable-maintainer-mode --prefix=$HOME/httpd-2.5
httpd and memcache running on the same VM running under Ubuntu 15.04
Load tested using:
    ab -n 20000 http://127.0.0.1/index.html

Creation/closing of connections beetween httpd and memcache confirmed using the telnet connection to memcache and the stats command

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1696105 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
docs/manual/mod/mod_socache_memcache.xml
modules/cache/mod_socache_memcache.c

diff --git a/CHANGES b/CHANGES
index b422730966185e93ddc547fb7a3667e25abe6413..0420ab900cd234d85bf87082601261ebc86cd86e 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,11 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.0
 
+  *) mod_socache_memcache: Add the 'MemcacheConnTTL' directive to control how 
+     long to keep idle connections with the memcache server(s).
+     Change default value from 600 usec (!) to 15 sec. PR 58091
+     [Christophe Jaillet]
+
   *) mod_dir: Prevent the internal identifier "httpd/unix-directory" from
      appearing as a Content-Type response header when requests for a directory
      are rewritten by mod_rewrite. [Eric Covener]
index c6c0163a412e6166d523b8630cc8a196ae928782..c0f3422f27873c5c4ab02c82eae1b3959b4a7850 100644 (file)
 
 </summary>
 
+<directivesynopsis>
+<name>MemcacheConnTTL</name>
+<description>Keepalive time for idle connections</description>
+<syntax>MemcacheConnTTL <em>seconds</em></syntax>
+<default>MemcacheConnTTL 15</default>
+<contextlist>
+<context>server config</context>
+<context>virtual host</context>
+</contextlist>
+
+<usage>
+
+    <p>Set the time, in seconds, to keep idle connections with the memcache
+    server(s) alive (threaded platforms only).</p>
+    
+    <p>Valid values for <directive>MemcacheConnTTL</directive> are integers
+    from 1 to 1800. That is to say, up to half an hour.</p>
+
+</usage>
+</directivesynopsis>
+
 </modulesynopsis>
index b05b6ed36f8225b177f79e7af98bda66d2b36ba1..795e23b5798e50a630e510084f1a9f78d8900fe1 100644 (file)
 #endif
 
 #ifndef MC_DEFAULT_SERVER_TTL
-#define MC_DEFAULT_SERVER_TTL 600
+#define MC_DEFAULT_SERVER_TTL (15*1000*1000)        /* 15 seconds */
 #endif
 
+module AP_MODULE_DECLARE_DATA socache_memcache_module;
+
+typedef struct {
+    unsigned int ttl;
+} socache_mc_svr_cfg;
+
 struct ap_socache_instance_t {
     const char *servers;
     apr_memcache_t *mc;
@@ -90,6 +96,9 @@ static apr_status_t socache_mc_init(ap_socache_instance_t *ctx,
     char *split;
     char *tok;
 
+    socache_mc_svr_cfg *sconf = ap_get_module_config(s->module_config,
+                                                     &socache_memcache_module);
+
     ap_mpm_query(AP_MPMQ_HARD_LIMIT_THREADS, &thread_limit);
 
     /* Find all the servers in the first run to get a total count */
@@ -140,7 +149,7 @@ static apr_status_t socache_mc_init(ap_socache_instance_t *ctx,
                                         MC_DEFAULT_SERVER_MIN,
                                         MC_DEFAULT_SERVER_SMAX,
                                         thread_limit,
-                                        MC_DEFAULT_SERVER_TTL,
+                                        sconf->ttl,
                                         &st);
         if (rv != APR_SUCCESS) {
             ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s, APLOGNO(00788)
@@ -310,6 +319,35 @@ static const ap_socache_provider_t socache_mc = {
 
 #endif /* HAVE_APU_MEMCACHE */
 
+static void *create_server_config(apr_pool_t *p, server_rec *s)
+{
+    socache_mc_svr_cfg *sconf = apr_pcalloc(p, sizeof(socache_mc_svr_cfg));
+    
+    sconf->ttl = MC_DEFAULT_SERVER_TTL;
+
+    return sconf;
+}
+
+static const char *socache_mc_set_ttl(cmd_parms *cmd, void *dummy,
+                                      const char *arg)
+{
+    socache_mc_svr_cfg *sconf = ap_get_module_config(cmd->server->module_config,
+                                                     &socache_memcache_module);
+    int i;
+
+    i = atoi(arg);
+
+    if ((i < 1) || (i > 1800)) {
+        return apr_pstrcat(cmd->pool, cmd->cmd->name,
+                           " must be a number between 1 and 1800.", NULL);
+    }
+
+    /* apr_memcache_server_create needs a ttl in usec. */
+    sconf->ttl = i * 1000 * 1000;
+
+    return NULL;
+}
+
 static void register_hooks(apr_pool_t *p)
 {
 #ifdef HAVE_APU_MEMCACHE
@@ -319,8 +357,18 @@ static void register_hooks(apr_pool_t *p)
 #endif
 }
 
+static const command_rec socache_memcache_cmds[] = {
+    AP_INIT_TAKE1("MemcacheConnTTL", socache_mc_set_ttl, NULL, RSRC_CONF,
+                  "TTL used for the connection with the memcache server(s), in seconds"),
+    { NULL }
+};
+
 AP_DECLARE_MODULE(socache_memcache) = {
     STANDARD20_MODULE_STUFF,
-    NULL, NULL, NULL, NULL, NULL,
-    register_hooks
+    NULL,                     /* create per-dir    config structures */
+    NULL,                     /* merge  per-dir    config structures */
+    create_server_config,     /* create per-server config structures */
+    NULL,                     /* merge  per-server config structures */
+    socache_memcache_cmds,    /* table of config file commands       */
+    register_hooks            /* register hooks                      */
 };