Here is a simple patch against 1.2.2 that should increase the memory usage efficiency in certain cases. We've been running it stable for a few days without problems, and it works as expected. It just checks to see if the last item in the LRU is expired before allocating space for the new item. In the case that it is expired, remove it before allocating. That has the effect of replacing the oldest item in that size, if possible. It won't help in all cases, but if slabs have different write and expiry profiles, it may help keep them in check. In the extreme case, it may even keep the total memory usage well below the maximum, when it would currently fill with expired data. It would be a big help if certain slab sizes see much higher write load than others, but those writes have a short expiry time.

Timo
--- items.c.orig        2007-08-16 14:46:18.000000000 -0600
+++ items.c     2007-08-16 14:46:51.000000000 -0600
@@ -82,6 +82,11 @@
     if (id == 0)
         return 0;
 
+    /* Try to keep memory usage to a minimum by removing/replacing the last 
item
+     * in the queue if it has already expired, instead of allocating more 
space.
+     */
+    if (tails[id] != 0 && tails[id]->refcount == 0 && tails[id]->exptime != 0 
&& tails[id]->exptime < current_time)
+        do_item_unlink(tails[id]);
     it = slabs_alloc(ntotal);
     if (it == 0) {
         int tries = 50;

Reply via email to