From: Willy Tarreau Date: Sun, 2 Jan 2022 16:53:02 +0000 (+0100) Subject: MEDIUM: pools: release cached objects in batches X-Git-Tag: v2.6-dev1~191 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1513c5479;p=thirdparty%2Fhaproxy.git MEDIUM: pools: release cached objects in batches With this patch pool_evict_last_items builds clusters of up to CONFIG_HAP_POOL_CLUSTER_SIZE entries so that accesses to the shared pools are reduced by CONFIG_HAP_POOL_CLUSTER_SIZE and the inter- thread contention is reduced by as much.. --- diff --git a/src/pool.c b/src/pool.c index 13ecc5fb09..a3b14d2417 100644 --- a/src/pool.c +++ b/src/pool.c @@ -310,8 +310,9 @@ void pool_free_nocache(struct pool_head *pool, void *ptr) static void pool_evict_last_items(struct pool_head *pool, struct pool_cache_head *ph, uint count) { struct pool_cache_item *item; - struct pool_item *pi; + struct pool_item *pi, *head = NULL; uint released = 0; + uint cluster = 0; uint to_free_max; to_free_max = pool_releasable(pool); @@ -320,17 +321,29 @@ static void pool_evict_last_items(struct pool_head *pool, struct pool_cache_head item = LIST_PREV(&ph->list, typeof(item), by_pool); LIST_DELETE(&item->by_pool); LIST_DELETE(&item->by_lru); - released++; - if (to_free_max) { + if (to_free_max > released || cluster) { pi = (struct pool_item *)item; - pi->down = NULL; - pool_put_to_shared_cache(pool, pi, 1); - to_free_max--; + pi->next = NULL; + pi->down = head; + head = pi; + cluster++; + if (cluster >= CONFIG_HAP_POOL_CLUSTER_SIZE) { + /* enough to make a cluster */ + pool_put_to_shared_cache(pool, head, cluster); + cluster = 0; + head = NULL; + } } else pool_free_nocache(pool, item); + + released++; } + /* incomplete cluster left */ + if (cluster) + pool_put_to_shared_cache(pool, head, cluster); + ph->count -= released; pool_cache_count -= released; pool_cache_bytes -= released * pool->size;