r870 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Mon Aug 21 15:15:02 CEST 2006


Author: phk
Date: 2006-08-21 15:15:02 +0200 (Mon, 21 Aug 2006)
New Revision: 870

Modified:
   trunk/varnish-cache/bin/varnishd/cache_session.c
Log:
Increase client hash to 1k

Cache used sessmem chunks on a private list and recycle from there,
no point in bothering malloc all the time.



Modified: trunk/varnish-cache/bin/varnishd/cache_session.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_session.c	2006-08-21 12:57:32 UTC (rev 869)
+++ trunk/varnish-cache/bin/varnishd/cache_session.c	2006-08-21 13:15:02 UTC (rev 870)
@@ -21,7 +21,7 @@
 #include "shmlog.h"
 #include "cache.h"
 
-#define CLIENT_HASH			256
+#define CLIENT_HASH			1024
 #define CLIENT_TTL			30
 
 /*--------------------------------------------------------------------*/
@@ -33,14 +33,18 @@
 	struct sess		sess;
 	struct http		http;
 	struct sockaddr		sockaddr[2];	/* INET6 hack */
+	TAILQ_ENTRY(sessmem)	list;
 };
 
 /*--------------------------------------------------------------------*/
 
+static TAILQ_HEAD(,sessmem)	ses_free_mem =
+    TAILQ_HEAD_INITIALIZER(ses_free_mem);
+
 TAILQ_HEAD(srcaddrhead ,srcaddr);
-
 static struct srcaddrhead	srcaddr_hash[CLIENT_HASH];
 static pthread_mutex_t		ses_mtx;
+static pthread_mutex_t		ses_mem_mtx;
 
 /*--------------------------------------------------------------------
  * Assign a srcaddr to this session.
@@ -185,13 +189,21 @@
 {
 	struct sessmem *sm;
 
-	sm = calloc(
-	    sizeof *sm + params->mem_workspace,
-	    1);
+	AZ(pthread_mutex_lock(&ses_mem_mtx));
+	sm = TAILQ_FIRST(&ses_free_mem);
+	if (sm != NULL)
+		TAILQ_REMOVE(&ses_free_mem, sm, list);
+	AZ(pthread_mutex_unlock(&ses_mem_mtx));
+	if (sm == NULL) {
+		sm = calloc(sizeof *sm + params->mem_workspace, 1);
+		sm->magic = SESSMEM_MAGIC;
+		VSL_stats->n_sess_mem++;
+	}
 	if (sm == NULL)
 		return (NULL);
-	sm->magic = SESSMEM_MAGIC;
+	CHECK_OBJ_NOTNULL(sm, SESSMEM_MAGIC);
 	VSL_stats->n_sess++;
+	memset(&sm->sess, 0, sizeof sm->sess);
 	sm->sess.magic = SESS_MAGIC;
 	sm->sess.mem = sm;
 	sm->sess.http = &sm->http;
@@ -225,7 +237,9 @@
 	    b->sess, b->req, b->pipe, b->pass,
 	    b->fetch, b->hdrbytes, b->bodybytes);
 	CHECK_OBJ_NOTNULL(sp->mem, SESSMEM_MAGIC);
-	free(sp->mem);
+	AZ(pthread_mutex_lock(&ses_mem_mtx));
+	TAILQ_INSERT_HEAD(&ses_free_mem, sp->mem, list);
+	AZ(pthread_mutex_unlock(&ses_mem_mtx));
 }
 
 /*--------------------------------------------------------------------*/
@@ -238,4 +252,5 @@
 	for (i = 0; i < CLIENT_HASH; i++)
 		TAILQ_INIT(&srcaddr_hash[i]);
 	AZ(pthread_mutex_init(&ses_mtx, NULL));
+	AZ(pthread_mutex_init(&ses_mem_mtx, NULL));
 }




More information about the varnish-commit mailing list