r1033 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Sat Sep 16 22:52:35 CEST 2006


Author: phk
Date: 2006-09-16 22:52:35 +0200 (Sat, 16 Sep 2006)
New Revision: 1033

Modified:
   trunk/varnish-cache/bin/varnishd/cache.h
   trunk/varnish-cache/bin/varnishd/cache_session.c
   trunk/varnish-cache/bin/varnishd/heritage.h
   trunk/varnish-cache/bin/varnishd/mgt_param.c
Log:
Give the srcaddr stats an overhaul.

Make the number of buckets a parameter (needs restart though).

Make the ttl a parameter and have zero disable srcaddr accounting.

Give each hash bucket its own mutex.


Modified: trunk/varnish-cache/bin/varnishd/cache.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache.h	2006-09-16 20:17:15 UTC (rev 1032)
+++ trunk/varnish-cache/bin/varnishd/cache.h	2006-09-16 20:52:35 UTC (rev 1033)
@@ -213,22 +213,6 @@
 
 /* -------------------------------------------------------------------*/
 
-struct srcaddr {
-	unsigned		magic;
-#define SRCADDR_MAGIC		0x375111db
-
-	unsigned		hash;
-	TAILQ_ENTRY(srcaddr)	list;
-	struct srcaddrhead	*sah;
-
-	char			addr[TCP_ADDRBUFSIZE];
-	unsigned		nref;
-
-	time_t			ttl;
-
-	struct acct		acct;
-};
-
 struct sess {
 	unsigned		magic;
 #define SESS_MAGIC		0x2c2f9c5a

Modified: trunk/varnish-cache/bin/varnishd/cache_session.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_session.c	2006-09-16 20:17:15 UTC (rev 1032)
+++ trunk/varnish-cache/bin/varnishd/cache_session.c	2006-09-16 20:52:35 UTC (rev 1033)
@@ -30,9 +30,6 @@
 #include "shmlog.h"
 #include "cache.h"
 
-#define CLIENT_HASH			1024
-#define CLIENT_TTL			30
-
 /*--------------------------------------------------------------------*/
 
 struct sessmem {
@@ -46,20 +43,41 @@
 	TAILQ_ENTRY(sessmem)	list;
 };
 
-/*--------------------------------------------------------------------*/
-
 static TAILQ_HEAD(,sessmem)	ses_free_mem[2] = {
     TAILQ_HEAD_INITIALIZER(ses_free_mem[0]),
     TAILQ_HEAD_INITIALIZER(ses_free_mem[1]),
 };
 
 static unsigned ses_qp;
+static MTX			ses_mem_mtx;
 
-TAILQ_HEAD(srcaddrhead ,srcaddr);
-static struct srcaddrhead	srcaddr_hash[CLIENT_HASH];
-static MTX			ses_mtx;
+/*--------------------------------------------------------------------*/
+
+struct srcaddr {
+	unsigned		magic;
+#define SRCADDR_MAGIC		0x375111db
+
+	unsigned		hash;
+	TAILQ_ENTRY(srcaddr)	list;
+	struct srcaddrhead	*sah;
+
+	char			addr[TCP_ADDRBUFSIZE];
+	unsigned		nref;
+
+	time_t			ttl;
+
+	struct acct		acct;
+};
+
+static struct srcaddrhead {
+	unsigned		magic;
+#define SRCADDRHEAD_MAGIC	0x38231a8b
+	TAILQ_HEAD(,srcaddr)	head;
+	MTX			mtx;
+} *srchash;
+	
+unsigned			nsrchash;
 static MTX			stat_mtx;
-static MTX			ses_mem_mtx;
 
 /*--------------------------------------------------------------------
  * Assign a srcaddr to this session.
@@ -77,29 +95,34 @@
 	struct srcaddrhead *ch;
 	time_t now;
 
+	if (params->srcaddr_ttl == 0) {
+		sp->srcaddr = NULL;
+		return;
+	}
 	AZ(sp->srcaddr);
 	u = crc32_2s(sp->addr, "");
-	v = u % CLIENT_HASH;
-	ch = &srcaddr_hash[v];
+	v = u % nsrchash;
+	ch = &srchash[v];
+	CHECK_OBJ(ch, SRCADDRHEAD_MAGIC);
 	now = sp->t_open.tv_sec;
 
-	LOCK(&ses_mtx);
+	LOCK(&ch->mtx);
 	c3 = NULL;
-	TAILQ_FOREACH_SAFE(c, ch, list, c2) {
+	TAILQ_FOREACH_SAFE(c, &ch->head, list, c2) {
 		if (c->hash == u && !strcmp(c->addr, sp->addr)) {
 			if (c->nref == 0)
 				VSL_stats->n_srcaddr_act++;
 			c->nref++;
-			c->ttl = now + CLIENT_TTL;
+			c->ttl = now + params->srcaddr_ttl;
 			sp->srcaddr = c;
-			TAILQ_REMOVE(ch, c, list);
-			TAILQ_INSERT_TAIL(ch, c, list);
+			TAILQ_REMOVE(&ch->head, c, list);
+			TAILQ_INSERT_TAIL(&ch->head, c, list);
 			if (0 && c3 != NULL) {
-				TAILQ_REMOVE(ch, c3, list);
+				TAILQ_REMOVE(&ch->head, c3, list);
 				VSL_stats->n_srcaddr--;
 				free(c3);
 			}
-			UNLOCK(&ses_mtx);
+			UNLOCK(&ch->mtx);
 			return;
 		}
 		if (c->nref > 0 || c->ttl > now)
@@ -108,7 +131,7 @@
 			c3 = c;
 			continue;
 		}
-		TAILQ_REMOVE(ch, c, list);
+		TAILQ_REMOVE(&ch->head, c, list);
 		free(c);
 		VSL_stats->n_srcaddr--;
 	}
@@ -118,24 +141,46 @@
 		if (c3 != NULL)
 			VSL_stats->n_srcaddr++;
 	} else
-		TAILQ_REMOVE(ch, c3, list);
+		TAILQ_REMOVE(&ch->head, c3, list);
 	AN(c3);
 	if (c3 != NULL) {
 		memset(c3, 0, sizeof *c3);
 		strcpy(c3->addr, sp->addr);
 		c3->hash = u;
 		c3->acct.first = now;
-		c3->ttl = now + CLIENT_TTL;
+		c3->ttl = now + params->srcaddr_ttl;
 		c3->nref = 1;
 		c3->sah = ch;
 		VSL_stats->n_srcaddr_act++;
-		TAILQ_INSERT_TAIL(ch, c3, list);
+		TAILQ_INSERT_TAIL(&ch->head, c3, list);
 		sp->srcaddr = c3;
 	}
-	UNLOCK(&ses_mtx);
+	UNLOCK(&ch->mtx);
 }
 
+/*--------------------------------------------------------------------*/
+
 static void
+ses_relsrcaddr(struct sess *sp)
+{
+	struct srcaddrhead *ch;
+
+	if (sp->srcaddr == NULL)
+		return;
+	ch = sp->srcaddr->sah;
+	CHECK_OBJ(ch, SRCADDRHEAD_MAGIC);
+	LOCK(&ch->mtx);
+	assert(sp->srcaddr->nref > 0);
+	sp->srcaddr->nref--;
+	if (sp->srcaddr->nref == 0)
+		VSL_stats->n_srcaddr_act--;
+	sp->srcaddr = NULL;
+	UNLOCK(&ch->mtx);
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
 ses_sum_acct(struct acct *sum, struct acct *inc)
 {
 
@@ -152,16 +197,19 @@
 SES_Charge(struct sess *sp)
 {
 	struct acct *a = &sp->wrk->acct;
-	struct acct *b = &sp->srcaddr->acct;
+	struct acct *b;
 
 	ses_sum_acct(&sp->acct, a);
 	
 	LOCK(&stat_mtx);
-	ses_sum_acct(b, a);
-	VSL(SLT_StatAddr, 0, "%s 0 %d %ju %ju %ju %ju %ju %ju %ju",
-	    sp->srcaddr->addr, sp->t_end.tv_sec - b->first,
-	    b->sess, b->req, b->pipe, b->pass,
-	    b->fetch, b->hdrbytes, b->bodybytes);
+	if (sp->srcaddr != NULL) {
+		b = &sp->srcaddr->acct;
+		ses_sum_acct(b, a);
+		VSL(SLT_StatAddr, 0, "%s 0 %d %ju %ju %ju %ju %ju %ju %ju",
+		    sp->srcaddr->addr, sp->t_end.tv_sec - b->first,
+		    b->sess, b->req, b->pipe, b->pass,
+		    b->fetch, b->hdrbytes, b->bodybytes);
+	}
 	VSL_stats->s_sess += a->sess;
 	VSL_stats->s_req += a->req;
 	VSL_stats->s_pipe += a->pipe;
@@ -173,24 +221,6 @@
 	memset(a, 0, sizeof *a);
 }
 
-static void
-ses_relsrcaddr(struct sess *sp)
-{
-
-	if (sp->srcaddr == NULL) {
-		/* If we never get to work pool (illegal req) */
-		return;
-	}
-	AN(sp->srcaddr);
-	LOCK(&ses_mtx);
-	assert(sp->srcaddr->nref > 0);
-	sp->srcaddr->nref--;
-	if (sp->srcaddr->nref == 0)
-		VSL_stats->n_srcaddr_act--;
-	sp->srcaddr = NULL;
-	UNLOCK(&ses_mtx);
-}
-
 /*--------------------------------------------------------------------*/
 
 struct sess *
@@ -286,9 +316,14 @@
 {
 	int i;
 
-	for (i = 0; i < CLIENT_HASH; i++)
-		TAILQ_INIT(&srcaddr_hash[i]);
-	MTX_INIT(&ses_mtx);
+	nsrchash = params->srcaddr_hash;
+	srchash = calloc(sizeof *srchash, nsrchash);
+	XXXAN(srchash);
+	for (i = 0; i < nsrchash; i++) {
+		srchash[i].magic = SRCADDRHEAD_MAGIC;
+		TAILQ_INIT(&srchash[i].head);
+		MTX_INIT(&srchash[i].mtx);
+	}
 	MTX_INIT(&stat_mtx);
 	MTX_INIT(&ses_mem_mtx);
 }

Modified: trunk/varnish-cache/bin/varnishd/heritage.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/heritage.h	2006-09-16 20:17:15 UTC (rev 1032)
+++ trunk/varnish-cache/bin/varnishd/heritage.h	2006-09-16 20:52:35 UTC (rev 1033)
@@ -65,6 +65,10 @@
 
 	/* Listen depth */
 	unsigned		listen_depth;
+
+	/* Srcaddr hash */
+	unsigned		srcaddr_hash;
+	unsigned		srcaddr_ttl;
 };
 
 extern struct params *params;

Modified: trunk/varnish-cache/bin/varnishd/mgt_param.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_param.c	2006-09-16 20:17:15 UTC (rev 1032)
+++ trunk/varnish-cache/bin/varnishd/mgt_param.c	2006-09-16 20:52:35 UTC (rev 1033)
@@ -282,6 +282,24 @@
 
 /*--------------------------------------------------------------------*/
 
+static void
+tweak_srcaddr_hash(struct cli *cli, struct parspec *par, const char *arg)
+{
+	(void)par;
+	tweak_generic_uint(cli, &params->srcaddr_hash, arg, 64, UINT_MAX);
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
+tweak_srcaddr_ttl(struct cli *cli, struct parspec *par, const char *arg)
+{
+	(void)par;
+	tweak_generic_uint(cli, &params->srcaddr_ttl, arg, 0, UINT_MAX);
+}
+
+/*--------------------------------------------------------------------*/
+
 /*
  * Make sure to end all lines with either a space or newline of the
  * formatting will go haywire.
@@ -372,6 +390,13 @@
 		"Listen(2) queue depth.\n"
 		MUST_RESTART,
 		"1024", "connections" },
+	{ "srcaddr_hash", tweak_srcaddr_hash,
+		"Number of source address hash buckets.\n"
+		MUST_RESTART,
+		"1024", "buckets" },
+	{ "srcaddr_ttl", tweak_srcaddr_ttl,
+		"Lifetime of srcaddr entries.\n",
+		"30", "seconds" },
 	{ NULL, NULL, NULL }
 };
 




More information about the varnish-commit mailing list