per-workpool exp threads

Nils Goroll slink at
Mon Sep 16 13:26:45 CEST 2013

First a side note on the private_oh: Couldn't the code handle a second magic 
private_oh which demands "don't queue here" and is always empty? This way we 
would only need to take on the additional sync overhead when needed (for 
debugging). (side note on the side note: why is this worrying me so much? 
Probably a benchmark would help putting this into perspective...)

On 09/13/13 09:43 AM, Poul-Henning Kamp wrote:
> Yanking an object from a live hash-list will look something like:
> 	(we have the oh->mtx locked)
> 	...
> 	oc->objhead = NULL;
> 	EXP_Feed(oc);
> 		lock(EXP-mtx)
> 		if (!(oc->flags&  OC_F_EXP_QUEUED) {
> 			VTAILQ_INSERT_TAIL(EXP->queue, oc, exp_list)
> 			oc->flags |= OC_F_EXP_QUEUED;
> 		}
> 		unlock(EXP-mtx)
> 	...

Hm, reflecting on this verbosely:

The per-workerpool exp thread could minimize the critical section on EXP-mtx by 
just taking the whole queue onto its own private head for processing, so there 
really should be virtually no contention on this lock.

Also I find it quite appealing to take all of the expire / free handling out of 
the delivery code path with the exp thread mailbox concept.

Could we hand off additional functions to async processing in the exp thread, like

- EXP_Rearm
- EXP_Insert
- all of HSH_Deref* which is not related to the oh
   - BAN_DestroyObj
   - freeing stuff


On the other handl I am not so sure if keeping objs on the exp->q until their 
refcount becomes 0 is the best solution. Maybe one could make them private 
(optionally lockless private as proposed above) and let Deref hand them over to Exp.

Other than that, yes, I do understand that LRU has to rip objects out of the oh, 
and there is the special case that LRU needs to make room "now". Do I understand 
correctly that there currently is no "proactive LRU nuke" (trying keep free 
space above thresholt per stevedore)?

Thanks, Nils

More information about the varnish-dev mailing list