lkml.org 
[lkml]   [2002]   [Sep]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [patch 3/4] slab reclaim balancing
Andrew Morton wrote:
>
>>* After flushing a batch back into the lists, the number of free objects
>>in the lists is calculated. If freeable pages exist and the number
>>exceeds a target, then the freeable pages above the target are returned
>>to the page buddy.
>
>
> Probably OK for now. But slab should _not_ hold onto an unused,
> cache-warm page. Because do_anonymous_page() may want one.
>
If the per-cpu caches are enabled on UP, too, then this is a moot point:
by the time a batch is freed from the per-cpu array, it will be cache cold.
And btw, why do you think a page is cache-warm when the last object on a
page is freed? If the last 32-byte kmalloc is released on a page, 40xx
bytes are probably cache-cold.

Back to your first problem: You've mentioned excess hits on the
cache_chain_semaphore. Which app did you use for stress testing? Could
you run a stress test with the applied patch?

I've tried dbench 50, with 128 MB RAM, on uniprocessor, with 2.4:

There were 9100 calls to kmem_cache_reap, and in 90% of the calls, no
freeable memory was found. Alltogether, only 1300 pages were freed from
the slabs.

Are there just too many calls to kmem_cache_reap()? Perhaps we should
try to optimize the "nothing freeable exists" logic?

--
Manfred
--- 2.4/mm/slab.c Fri Aug 30 18:39:22 2002
+++ build-2.4/mm/slab.c Fri Sep 27 21:01:31 2002
@@ -1727,6 +1735,9 @@
}
#endif

+unsigned long g_calls = 0;
+unsigned long g_pages = 0;
+unsigned long g_success = 0;
/**
* kmem_cache_reap - Reclaim memory from caches.
* @gfp_mask: the type of memory required.
@@ -1749,6 +1760,7 @@
if (down_trylock(&cache_chain_sem))
return 0;

+g_calls++;
scan = REAP_SCANLEN;
best_len = 0;
best_pages = 0;
@@ -1827,6 +1839,8 @@
perfect:
/* free only 50% of the free slabs */
best_len = (best_len + 1)/2;
+g_success++;
+g_pages+=best_len;
for (scan = 0; scan < best_len; scan++) {
struct list_head *p;

@@ -1907,6 +1921,7 @@
* Output format version, so at least we can change it
* without _too_ many complaints.
*/
+ seq_printf(m, "%lu %lu %lu.\n",g_calls, g_pages, g_success);
seq_puts(m, "slabinfo - version: 1.1"
#if STATS
" (statistics)"
\
 
 \ /
  Last update: 2005-03-22 13:29    [W:0.062 / U:0.752 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site