diff --git a/include/haproxy/defaults.h b/include/haproxy/defaults.h index 35ad50d04..baa9aff51 100644 --- a/include/haproxy/defaults.h +++ b/include/haproxy/defaults.h @@ -407,6 +407,10 @@ #define CONFIG_HAP_POOL_CACHE_SIZE 1048576 #endif +#ifndef CONFIG_HAP_POOL_CLUSTER_SIZE +#define CONFIG_HAP_POOL_CLUSTER_SIZE 8 +#endif + /* Number of samples used to compute the times reported in stats. A power of * two is highly recommended, and this value multiplied by the largest response * time must not overflow and unsigned int. See freq_ctr.h for more information. diff --git a/src/pool.c b/src/pool.c index 2a56cd4dc..13ecc5fb0 100644 --- a/src/pool.c +++ b/src/pool.c @@ -346,9 +346,10 @@ void pool_evict_from_local_cache(struct pool_head *pool) { struct pool_cache_head *ph = &pool->cache[tid]; - while (ph->count >= 16 + pool_cache_count / 8 && + while (ph->count >= CONFIG_HAP_POOL_CLUSTER_SIZE && + ph->count >= 16 + pool_cache_count / 8 && pool_cache_bytes > CONFIG_HAP_POOL_CACHE_SIZE * 3 / 4) { - pool_evict_last_items(pool, ph, 1); + pool_evict_last_items(pool, ph, CONFIG_HAP_POOL_CLUSTER_SIZE); } } @@ -368,7 +369,7 @@ void pool_evict_from_local_caches() */ ph = LIST_NEXT(&item->by_pool, struct pool_cache_head *, list); pool = container_of(ph - tid, struct pool_head, cache); - pool_evict_last_items(pool, ph, 1); + pool_evict_last_items(pool, ph, CONFIG_HAP_POOL_CLUSTER_SIZE); } while (pool_cache_bytes > CONFIG_HAP_POOL_CACHE_SIZE * 7 / 8); } @@ -389,7 +390,7 @@ void pool_put_to_cache(struct pool_head *pool, void *ptr) pool_cache_bytes += pool->size; if (unlikely(pool_cache_bytes > CONFIG_HAP_POOL_CACHE_SIZE * 3 / 4)) { - if (ph->count >= 16 + pool_cache_count / 8) + if (ph->count >= 16 + pool_cache_count / 8 + CONFIG_HAP_POOL_CLUSTER_SIZE) pool_evict_from_local_cache(pool); if (pool_cache_bytes > CONFIG_HAP_POOL_CACHE_SIZE) pool_evict_from_local_caches();