]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: pools: release cached objects in batches
authorWilly Tarreau <w@1wt.eu>
Sun, 2 Jan 2022 16:53:02 +0000 (17:53 +0100)
committerWilly Tarreau <w@1wt.eu>
Sun, 2 Jan 2022 18:35:26 +0000 (19:35 +0100)
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..

src/pool.c

index 13ecc5fb0980ca147d948a4c0f17b60db1394036..a3b14d241737b15e61bddcf6dc87801e500c9753 100644 (file)
@@ -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;