From 852879d2f9c8c37bdd468d28fb3cefbca2b59eef Mon Sep 17 00:00:00 2001 From: phk Date: Fri, 15 Sep 2006 09:43:56 +0000 Subject: [PATCH] Try to avoid sending EOF'ed or ready sessions to the herder. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@987 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/cache_center.c | 60 ++++++++++++++++------- varnish-cache/bin/varnishd/heritage.h | 3 ++ varnish-cache/bin/varnishd/mgt_param.c | 26 ++++++++++ varnish-cache/include/stat_field.h | 7 +++ 4 files changed, 79 insertions(+), 17 deletions(-) diff --git a/varnish-cache/bin/varnishd/cache_center.c b/varnish-cache/bin/varnishd/cache_center.c index 047890dc..4260f540 100644 --- a/varnish-cache/bin/varnishd/cache_center.c +++ b/varnish-cache/bin/varnishd/cache_center.c @@ -33,8 +33,10 @@ DOT start -> RECV #include #include #include +#include #include "shmlog.h" +#include "heritage.h" #include "vcl.h" #include "cache.h" @@ -122,6 +124,8 @@ static int cnt_done(struct sess *sp) { double dh, dp, da; + struct pollfd fds[1]; + int i; AZ(sp->obj); AZ(sp->vbc); @@ -150,25 +154,47 @@ cnt_done(struct sess *sp) sp->xid = 0; sp->t_open = sp->t_end; SES_Charge(sp); - if (sp->fd > 0) { - VSL(SLT_SessionReuse, sp->fd, "%s %s", sp->addr, sp->port); - - /* If we have anything in the input buffer, start over */ - /* - * XXX: we might even want to do a short timed read (poll) - * XXX: here to see if something is pending in the kernel - */ - - if (http_RecvPrepAgain(sp->http)) { - sp->step = STP_RECV; - return (0); - } - if (sp->http->t < sp->http->v) { - sp->step = STP_AGAIN; - return (0); - } + if (sp->fd < 0) { + VSL_stats->sess_closed++; + sp->wrk->idle = sp->t_open.tv_sec; + vca_return_session(sp); + return (1); } + if (http_RecvPrepAgain(sp->http)) { + VSL_stats->sess_pipeline++; + VSL(SLT_SessionReuse, sp->fd, "%s %s", sp->addr, sp->port); + sp->step = STP_RECV; + return (0); + } + if (sp->http->t < sp->http->v) { + VSL_stats->sess_readahead++; + VSL(SLT_SessionReuse, sp->fd, "%s %s", sp->addr, sp->port); + sp->step = STP_AGAIN; + return (0); + } + if (params->session_grace == 0) { + VSL_stats->sess_herd++; + sp->wrk->idle = sp->t_open.tv_sec; + vca_return_session(sp); + return (1); + } + fds[0].fd = sp->fd; + fds[0].events = POLLIN; + fds[0].revents = 0; + i = poll(fds, 1, params->session_grace); + if (i == 1 && (fds[0].revents & POLLHUP)) { + VSL_stats->sess_EOF++; + vca_close_session(sp, "EOF"); + } else if (i == 1 && (fds[0].revents & POLLIN)) { + VSL_stats->sess_ready++; + VSL(SLT_SessionReuse, sp->fd, "%s %s", + sp->addr, sp->port); + sp->step = STP_AGAIN; + return (0); + } else { + VSL_stats->sess_herd++; + } sp->wrk->idle = sp->t_open.tv_sec; vca_return_session(sp); return (1); diff --git a/varnish-cache/bin/varnishd/heritage.h b/varnish-cache/bin/varnishd/heritage.h index 1997118b..d16f172d 100644 --- a/varnish-cache/bin/varnishd/heritage.h +++ b/varnish-cache/bin/varnishd/heritage.h @@ -53,6 +53,9 @@ struct params { /* Sendfile object minimum size */ unsigned sendfile_threshold; + + /* Session dispostion grace period */ + unsigned session_grace; }; extern struct params *params; diff --git a/varnish-cache/bin/varnishd/mgt_param.c b/varnish-cache/bin/varnishd/mgt_param.c index ff3879f1..67501389 100644 --- a/varnish-cache/bin/varnishd/mgt_param.c +++ b/varnish-cache/bin/varnishd/mgt_param.c @@ -168,6 +168,28 @@ tweak_send_timeout(struct cli *cli, struct parspec *par, const char *arg) /*--------------------------------------------------------------------*/ +static void +tweak_session_grace(struct cli *cli, struct parspec *par, const char *arg) +{ + unsigned u; + + (void)par; + if (arg != NULL) { + u = strtoul(arg, NULL, 0); + if (u == 0) { + cli_out(cli, "Timeout must be greater than zero\n"); + cli_result(cli, CLIS_PARAM); + return; + } + params->session_grace = u; + } + if (cli == NULL) + return; + cli_out(cli, "%u [milliseconds]\n", params->session_grace); +} + +/*--------------------------------------------------------------------*/ + static void tweak_auto_restart(struct cli *cli, struct parspec *par, const char *arg) { @@ -301,6 +323,10 @@ static struct parspec parspec[] = { "The minimum size of objects transmitted with sendfile.\n" "Default is 8192 bytes.", "8192" }, #endif /* HAVE_SENDFILE */ + { "session_grace", tweak_session_grace, + "How long a workerthread waits for a new request to arrive " + "before sending the session to the herder.\n" + "Default is 10 msec.", "10" }, { NULL, NULL, NULL } }; diff --git a/varnish-cache/include/stat_field.h b/varnish-cache/include/stat_field.h index e59365c3..8a171df1 100644 --- a/varnish-cache/include/stat_field.h +++ b/varnish-cache/include/stat_field.h @@ -43,3 +43,10 @@ MAC_STAT(s_pass, uint64_t, "u", "Total pass") MAC_STAT(s_fetch, uint64_t, "u", "Total fetch") MAC_STAT(s_hdrbytes, uint64_t, "u", "Total header bytes") MAC_STAT(s_bodybytes, uint64_t, "u", "Total body bytes") + +MAC_STAT(sess_closed, uint64_t, "u", "Session Closed") +MAC_STAT(sess_pipeline, uint64_t, "u", "Session Pipeline") +MAC_STAT(sess_readahead, uint64_t, "u", "Session Read Ahead") +MAC_STAT(sess_EOF, uint64_t, "u", "Session EOF") +MAC_STAT(sess_ready, uint64_t, "u", "Session Ready") +MAC_STAT(sess_herd, uint64_t, "u", "Session herd") -- 2.39.5