Re: 2.4.16: Out of memory - when still more than 100MB free

Ville Herva (vherva@niksula.hut.fi)
Tue, 18 Dec 2001 14:18:58 +0200


On Mon, Dec 17, 2001 at 07:10:54PM -0200, you [Marcelo Tosatti] claimed:
>
>
> On 17 Dec 2001, Samuli Suonpaa wrote:
>
> > I've got VMWare killed a couple of times mysteriously.
> >
> > I've got 256MB memory and no swap on my laptop running 2.4.16 and for
> > some reason VMWare has got killed with the following syslog
> > information:
> >
> > Dec 17 23:33:23 puck kernel: Out of Memory: Killed process 28803 (vmware).
> > Dec 17 23:33:35 puck kernel: Out of Memory: Killed process 28804 (vmware).
> > Dec 17 23:33:37 puck kernel: /dev/vmmon: Vmx86_ReleaseVM: unlocked pages: 75286, unlocked dirty pages: 51084
>
> Samuli,
>
> The problem is that buffer/cache/{i,d}cache pages are not getting freed
> easily, and instead the kernel swapouts anonymous memory.
>
> Could you please try 2.4.17-rc1 and tell me if it makes a difference for
> you ?

See my report on what happens on a 2GB box with .16 or .17rc1. Buffers are
still not released as they should.

http://marc.theaimsgroup.com/?l=linux-kernel&m=100849985518543&w=2
http://marc.theaimsgroup.com/?l=linux-kernel&m=100857274818037&w=2

Perhaps someone could test on x86 with less memory (I can do that later, but
right now I don't have any throw-away box with a recent kernel on it). On ia64
with 2GB+256MB swap this results in OOM when trying to allocate and use
1.7GB, albeit the real mem usage (-buffers) is less than 200MB.

Basically the test is

fill cache

find / -type f -exec cat {} \; > /dev/null
updatedb

then run this with suitable argument:

#include <stdio.h>
#include <stdlib.h>

#define BKSP "\010\010\010\010\010\010"

int main(int argc, char** argv)
{
unsigned long megs = 512;
unsigned long size, i;
unsigned char* buf;
if (argc > 1) megs = atol(argv[1]);
size = megs * 1024 * 1024;

fprintf(stderr, "Allocating %lu megs...\n\n ", megs);
buf = malloc(size);
if (!buf)
{
fprintf(stderr, "malloc(%lu", size);
perror(")");
exit(-1);
}

for (i = 0; i < size; i++)
{
buf[i] = 42;

if ((i + 1) % (1024 * 1024) == 0)
fprintf(stderr, BKSP "%4uMB", (i + 1) / 1024 / 1024);
}

fprintf(stderr, "\n Success.\n");

return 1;
}

-- v --

v@iki.fi
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/