Just to pile on, test data that is all the same size like that is
probably a very bad test of memcached. Most likely, all your data is not
the exact same size.
Brian.
--------
http://brian.moonspot.net/
On 7/6/10 5:36 PM, siroga wrote:
Hi,
I just started playing with memcached. While doing very basic stuff I
found one thing that confused me a lot.
I have memcached running with default settings - 64M of memory for
caching.
1. Called flushALL to clean the cache.
2. insert 100 of byte arrays 512K each - this should consume about 51M
of memory so I should have enough space to keep all of them - and to
very that call get() for each of them - as expected all arrays are
present
3. I call flushAll again - so cache should be clear
4. insert 100 arrays of smaller size ( 256K). I also expected that I
have enough memory to store them (overall I need about 26M), but
surprisingly to me when calling get() only last 15 where found in the
cache!!!
It looks like memcached still hold memory occupied by first 100
arrays.
Memcache-top says that only 3.8M out of 64 used.
Any info/explanation on memcached memory management details is very
welcomed. Sorry if it is a well known feature, but I did not find much
on a wiki that would suggest explanation.
Regards,
Sergei
Here is my test program (I got the same result using both danga and
spy.memcached. clients):
MemCachedClient cl;
@Test
public void strange() throws Throwable
{
byte[] testLarge = new byte[1024*512];
byte[] testSmall = new byte[1024*256];
int COUNT = 100;
cl.flushAll();
Thread.sleep(1000);
for (int i = 0; i< COUNT; i++)
{
cl.set("largekey" + i, testLarge, 600);
}
for (int i = 0; i< COUNT; i++)
{
if (null != cl.get("largekey" + i))
{
System.out.println("First not null " + i);
break;
}
}
Thread.sleep(1000);
cl.flushAll();
Thread.sleep(1000);
for (int i = 0; i< COUNT; i++)
{
cl.set("smallkey" + i, testSmall, 600);
}
for (int i = 0; i< COUNT; i++)
{
if (null != cl.get("smallkey" + i))
{
System.out.println("First not null " + i);
break;
}
}
}