Queue at 130 concurrent requests?

Robert Egglestone r.egglestone at auckland.ac.nz
Wed Mar 27 03:06:30 CET 2013


Hi,

I have Varnish 3.0.3 on RHEL6 configured to use 2000 worker threads (both min and max). While testing, at the point of exactly 130 concurrent requests, I consistently see the maximum response time jump up, and continue to grow as the number of concurrent requests increases.  I'm wondering if it's hitting a limit at this point causing the requests to be queued.

I need to be able to process up to 500 concurrent requests with fairly consistent performance to take this through to production. The material I've seen online suggests that this should be no problem, so I'm wondering if I've overlooked a configuration setting.

The backend is an Apache server returning a redirect. I've tested directly against the backend too and that shows the maximum response times increasing fairly linear with the number of concurrent requests - the maximum response time does not jump up like this.

I've included details below of the test results and configuration below.

Thanks,
Robert Egglestone | Application Engineering Team Lead | The University of Auckland
r.egglestone at auckland.ac.nz<mailto:r.egglestone at auckland.ac.nz> | ext: 84624 | m: +64 21 240 8992 | Level 2, 58 Symonds St, Auckland, NZ

The test results are:

$ ab -n 10000 -c 110 localhost:6081/

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   2.0      1      10
Processing:     2    7   1.9      7      24
Waiting:        0    6   2.1      6      24
Total:          5    8   1.9      8      24

$ ab -n 10000 -c 129 localhost:6081/

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    4   3.1      5      10
Processing:     2    8   2.0      8      25
Waiting:        0    7   2.5      6      24
Total:          6   12   2.5     13      25

$ ab -n 10000 -c 130 localhost:6081/

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   2.6      1      10
Processing:     2    8   3.6      7     215
Waiting:        0    7   3.7      7     214
Total:          6   10   3.8     10     215

$ ab -n 10000 -c 150 localhost:6081/

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    3   2.7      2      12
Processing:     2    8  12.2      7     523
Waiting:        0    7  12.3      6     523
Total:          6   11  12.3     10     523


The Varnish startup parameters I'm using are:

/usr/sbin/varnishd -F -a :6081
-f /etc/varnish/webroute.vcl
-T 127.0.0.1:6082
-t 120
-w 2000,2000,120
-u varnish -g varnish
-S /etc/varnish/secret
-s file,/var/lib/varnish/varnish_storage.bin,1G

The Varnish configuration is:

backend apache {
  .host = "127.0.0.1";
  .port = "8080";
}

#
# Serve stale content while retrieving content from backend
# https://www.varnish-cache.org/trac/wiki/VCLExampleGrace
#

sub vcl_recv {
  set req.grace = 30s;
}

sub vcl_fetch {
  set beresp.grace = 30s;
}

#
# Normalize cookies
#

sub vcl_recv {
  # Remove has_js and Google Analytics __* cookies.
  set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", "");
  # Remove a ";" prefix, if present.
  set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");

  # Cookies
  if (req.http.Cookie == "") {
    remove req.http.Cookie;
  }
}

#
# Normalize Accept-Encoding header
#

sub vcl_recv {
  if (req.http.Accept-Encoding) {
    if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
      # No point in compressing these
      remove req.http.Accept-Encoding;
    } elsif (req.http.Accept-Encoding ~ "gzip") {
      set req.http.Accept-Encoding = "gzip";
    } elsif (req.http.Accept-Encoding ~ "deflate") {
      set req.http.Accept-Encoding = "deflate";
    } else {
      # unknown algorithm
      remove req.http.Accept-Encoding;
    }
  }
}

#
# Allow items to be purged from the cache
#

acl purgers {
  "127.0.0.1";
}

sub vcl_recv {
  if (req.request == "PURGE") {
    if (!client.ip ~ purgers) {
      error 405 "Method not allowed";
    }
    return (lookup);
  }
}

sub vcl_hit {
  if (req.request == "PURGE") {
    purge;
    error 200 "Purged";
  }
}

sub vcl_miss {
  if (req.request == "PURGE") {
    purge;
    error 404 "Not in cache";
  }
}

sub vcl_pass {
  if (req.request == "PURGE") {
    error 502 "PURGE on a passed object";
  }
}

#
# ESI support
# http://www.w3.org/TR/edge-arch
#
# http://symfony.com/doc/2.0/cookbook/cache/varnish.html
#

sub vcl_recv {
  set req.http.Surrogate-Capability = "webroute=ESI/1.0";
}

sub vcl_fetch {
  if (beresp.http.Surrogate-Control ~ "ESI/1.0") {
    unset beresp.http.Surrogate-Control;
    set beresp.http.X-ESI = "true";
    set beresp.do_esi = true;
  }
}

#
# Debugging
#

sub vcl_deliver {
  if (obj.hits > 0) {
    set resp.http.X-Cache = "HIT";
    set resp.http.X-Cache-Hits = obj.hits;
  } else {
    set resp.http.X-Cache = "MISS";
  }
}


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.varnish-cache.org/lists/pipermail/varnish-misc/attachments/20130327/ac738c79/attachment.html>


More information about the varnish-misc mailing list