[master] 5e5b4d5 wake up herder from sleeping after destroying, sleep for longer

Nils Goroll nils.goroll at uplex.de
Tue Nov 1 10:14:05 CET 2016


commit 5e5b4d5943ed8f5d3e8f18cdb1f678ab2ff6e098
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Thu Oct 27 07:04:00 2016 +0200

    wake up herder from sleeping after destroying, sleep for longer
    
    Previously, after sending a thread to varnish heaven, the herder slept
    for wthread_destroy_delay unconditionally. Instead, we now wait on the
    cv so we get woken up in case we run dry during the delay.
    
    This change is relevant proportionally to the value of
    wthread_destroy_delay if the spread between thread_pool_min and
    thread_pool_max is big and varnish is exposed to sudden traffic peaks.
    
    IOW, it will probably be only relevant for high performance setups.
    
    Also, we now sleep for thread_pool_timeout unless a shorter delay is
    warranted. This will delay the effect of thread parameter changes for
    up to thread_pool_timeout seconds unless the pool runs dry, in which
    case they will become effective immediately.

diff --git a/bin/varnishd/cache/cache_wrk.c b/bin/varnishd/cache/cache_wrk.c
index 4e8af44..6ba528e 100644
--- a/bin/varnishd/cache/cache_wrk.c
+++ b/bin/varnishd/cache/cache_wrk.c
@@ -435,6 +435,7 @@ pool_herder(void *priv)
 	struct pool_task *pt;
 	double t_idle;
 	struct worker *wrk;
+	int delay;
 
 	CAST_OBJ_NOTNULL(pp, priv, POOL_MAGIC);
 
@@ -447,6 +448,8 @@ pool_herder(void *priv)
 			pool_breed(pp);
 			continue;
 		}
+
+		delay = cache_param->wthread_timeout;
 		assert(pp->nthr >= cache_param->wthread_min);
 
 		if (pp->nthr > cache_param->wthread_min) {
@@ -472,8 +475,10 @@ pool_herder(void *priv)
 					    &wrk->task, list);
 					wrk->task.func = pool_kiss_of_death;
 					AZ(pthread_cond_signal(&wrk->cond));
-				} else
+				} else {
+					delay = wrk->lastused - t_idle;
 					wrk = NULL;
+				}
 			}
 			Lck_Unlock(&pp->mtx);
 
@@ -483,15 +488,15 @@ pool_herder(void *priv)
 				VSC_C_main->threads--;
 				VSC_C_main->threads_destroyed++;
 				Lck_Unlock(&pool_mtx);
-				VTIM_sleep(cache_param->wthread_destroy_delay);
-				continue;
-			}
+				delay = cache_param->wthread_destroy_delay;
+			} else if (delay < cache_param->wthread_destroy_delay)
+				delay = cache_param->wthread_destroy_delay;
 		}
 
 		Lck_Lock(&pp->mtx);
 		if (!pp->dry) {
 			(void)Lck_CondWait(&pp->herder_cond, &pp->mtx,
-				VTIM_real() + 5);
+				VTIM_real() + delay);
 		} else {
 			/* XXX: unsafe counters */
 			VSC_C_main->threads_limited++;
diff --git a/bin/varnishtest/tests/r01490.vtc b/bin/varnishtest/tests/r01490.vtc
index 82ffdb4..76b32be 100644
--- a/bin/varnishtest/tests/r01490.vtc
+++ b/bin/varnishtest/tests/r01490.vtc
@@ -9,6 +9,7 @@ varnish v1 \
 	-arg "-p thread_pool_min=2" \
 	-arg "-p thread_pool_max=3" \
 	-arg "-p thread_pools=1" \
+	-arg "-p thread_pool_timeout=10" \
 	-vcl+backend {}
 varnish v1 -start
 
@@ -21,16 +22,16 @@ logexpect l1 -v v1 -g raw {
 
 varnish v1 -cliok "param.set thread_pool_min 3"
 
-# Herder thread sleeps 5 seconds. Have to wait longer than that.
-delay 6
+# Have to wait longer than thread_pool_timeout
+delay 11
 
 varnish v1 -expect threads == 3
 
 varnish v1 -cliok "param.set thread_pool_min 2"
 varnish v1 -cliok "param.set thread_pool_max 2"
 
-# Herder thread sleeps 5 seconds. Have to wait longer than that.
-delay 6
+# Have to wait longer than thread_pool_timeout
+delay 11
 
 varnish v1 -expect threads == 2
 



More information about the varnish-commit mailing list