Hi Lasse, thanks for the prompt reply. I've done a little bit more 
investigation on this issue.

1. I tried using smart bans but I saw no change in performance. I tried change 
the ban from a regex to a straight match on the URL (i.e. from 
ban("obj.http.x-url ~ " + [header containing regex]) to ban("obj.http.x-url == 
" + [header containing url]) ) and I still observed the same performance 
issues. I also tried changing from ban() to ban_url() - no performance 
improvement. Removing that line from the VCL brings the CPU right back down, so 
I've concluded the problem is adding the ban to the ban list. Is this an 
inherently CPU intensive operation, is there going to be no way around this?

2. I've also gone down the route of trying purges because they are 
significantly faster and look like they can handle the load okay, but my only 
issue is matching variations of a page. My vcl_hash function looks like this:

sub vcl_hash {
   hash_data(req.http.Accept);
   hash_data(req.http.X-Forwarded-Proto);
}

So the problem I'm having is purging all variations of the file based on 
"Accept" and "X-Forwarded-Proto" headers, as well as the host. Is this 
something that is even possible? I personally wouldn't have thought so but 
after seeing in the documentation 
(https://www.varnish-cache.org/docs/trunk/tutorial/purging.html):  "The purge 
in vcl_miss is necessary to purge all variants in the cases where you hit an 
object, but miss a particular variant." Seems to imply that this functionality 
is present but I can't find any more documentation on how it works. Do I need 
to remove the hash_data() calls in vcl_hash and instead include "Accept" and 
"X-Forwarded-Proto" in the "Vary" header coming from the backend server?

Thanks,
Connor Walls

-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Lasse Karstensen
Sent: 26 July 2012 10:36
To: [email protected]
Subject: Re: High CPU usage when using ban with HTTP PURGE

Connor Walls:
> So, I've been having an issue with CPU usage recently. We run a 
> cluster of
> 3 varnish boxes, running 3.0.2, serving content on a particular port, 
> and accepting HTTP PURGE request on another (:82). This is used so 
> whenever a user on the site changes something on their profile page, 
> one of the backend servers will send a HTTP PURGE request to each box 
> in the cluster, containing a regex in the header, which is then used 
> to ban based on a particular URL - the relevant VCL is as follows:
[..]
> Now what we've been seeing is very high CPU usage with this 
> functionality, which has been slowly growing over time with increased 
> traffic on the website, and is now averaging above 70%, peaking at 
> 100% at times and causing some user requests to fail. The CPU usage 
> correlates very closely with timeout exceptions we get when making the 
> HTTP PURGE requests. This became an issue yesterday to the point where 
> we disabled the HTTP PURGE - CPU usage has now fallen from averaging > 
> 70% to averaging around 8%, so clearly the purges are the issue. What 
> I'm wondering is whether or not banning like this is going to be 
> inherently heavy and I need to find a way to throttle the purge 
> requests, or if I could rework the VCL so it will be less CPU heavy to 
> process these requests? Will the CPU usage depend on what the actual regex is?

There are two methods for cache invalidation in Varnish 3.0: Purges and bans.
Bans are flexible and cool, and purges are less flexible but very fast. Use 
purges if you can.

If you are using a high amount of bans, you should use what Kristian calls 
"Smart bans" in the Varnish Book: 

    
https://www.varnish-software.com/static/book/Cache_invalidation.html#smart-bans


--
Lasse Karstensen
Varnish Software AS
http://www.varnish-software.com/

_______________________________________________
varnish-misc mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-misc

_______________________________________________
varnish-misc mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-misc

Reply via email to