From: Tollef Fog Heen Date: Tue, 7 Oct 2008 09:43:49 +0000 (+0200) Subject: Sleep for a bit if accept(2) returns EMFILE X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=219fa3d572d34978a7a13a785473a8224843455f;p=varnish Sleep for a bit if accept(2) returns EMFILE Hopefully, this will mitigate pile-ups somewhat and prevent us from running out of file descriptors, at least as quickly. See #330. --- diff --git a/varnish-cache/bin/varnishd/cache_acceptor.c b/varnish-cache/bin/varnishd/cache_acceptor.c index e4fa352c..cf47872a 100644 --- a/varnish-cache/bin/varnishd/cache_acceptor.c +++ b/varnish-cache/bin/varnishd/cache_acceptor.c @@ -221,10 +221,20 @@ vca_acct(void *arg) addr = (void*)&addr_s; i = accept(ls->sock, addr, &l); if (i < 0) { - if (errno != EAGAIN && errno != ECONNABORTED) { + switch (errno) { + case EAGAIN: + case ECONNABORTED: + break; + case EMFILE: VSL(SLT_Debug, ls->sock, - "Accept failed errno=%d", errno); + "Too many open files when accept(2)ing. Sleeping."); + TIM_sleep(params->accept_fd_holdoff * 1000.0); + break; + default: + VSL(SLT_Debug, ls->sock, + "Accept failed: %s", strerror(errno)); /* XXX: stats ? */ + break; } continue; } diff --git a/varnish-cache/bin/varnishd/heritage.h b/varnish-cache/bin/varnishd/heritage.h index 80c1c3a7..9cf61337 100644 --- a/varnish-cache/bin/varnishd/heritage.h +++ b/varnish-cache/bin/varnishd/heritage.h @@ -179,6 +179,10 @@ struct params { /* Acceptable clockskew with backends */ unsigned clock_skew; + + /* Amount of time to sleep when running out of file + descriptors. In msecs */ + unsigned accept_fd_holdoff; }; extern volatile struct params *params; diff --git a/varnish-cache/bin/varnishd/mgt_param.c b/varnish-cache/bin/varnishd/mgt_param.c index 3a080886..fab995dd 100644 --- a/varnish-cache/bin/varnishd/mgt_param.c +++ b/varnish-cache/bin/varnishd/mgt_param.c @@ -747,6 +747,12 @@ static const struct parspec parspec[] = { "VCL can override this default value for each backend.", 0, "400", "ms" }, + { "accept_fd_holdoff", tweak_timeout, + &master.accept_fd_holdoff, 0, 3600*1000, + "If we run out of file descriptors, the accept thread will " + "sleep. This parameter control for how long it will sleep.", + EXPERIMENTAL, + "50", "ms" }, { "clock_skew", tweak_uint, &master.clock_skew, 0, UINT_MAX, "How much clockskew we are willing to accept between the " "backend and our own clock.",