I am running the latest FC5-i686-smp kernel, 2.6.20, on a machine with
8Gb of RAM, and 2 Xeon processors. The system has a 750Mb ramdisk,
and one process allocating and deallocating memory that is also
writing lots of files to the ramdisk. The process also reads and
writes from the network. After the process runs for a while, the
linux OOM killer starts killing processes, even though there is lots
of memory available.
The system does not ordinarily use swap space, but I've added swap to
see if it makes a difference, but it only defers the problem.
The OOM dump below shows that memory in the NORMAL_ZONE is exhausted,
but there is still plenty of memory (6Gb+) in the HighMem Zone. I can
provide .config and dmesg data if these would be helpful.
Why is the OOM killer being invoked when there is still memory
available for use?
java invoked oom-killer: gfp_mask=0xd0, order=0, oomkilladj=0
java invoked oom-killer: gfp_mask=0xd0, order=0, oomkilladj=0
[<c0455f84>] out_of_memory+0x69/0x191
[<c0457460>] __alloc_pages+0x220/0x2aa
[<c046c80a>] cache_alloc_refill+0x26f/0x468
[<c046ca76>] __kmalloc+0x73/0x7d
[<c05bb4ce>] __alloc_skb+0x49/0xf7
[<c05e483d>] tcp_sendmsg+0x169/0xa04
[<c05fd76d>] inet_sendmsg+0x3b/0x45
[<c05b57d5>] sock_aio_write+0xf9/0x105
[<c0455708>] generic_file_aio_read+0x173/0x1a3
[<c046fd11>] do_sync_write+0xc7/0x10a
[<c04379fd>] autoremove_wake_function+0x0/0x35
[<c05e413e>] tcp_ioctl+0x10a/0x115
[<c05e4034>] tcp_ioctl+0x0/0x115
[<c05fd406>] inet_ioctl+0x8d/0x91
[<c0470564>] vfs_write+0xbc/0x154
[<c0470b62>] sys_write+0x41/0x67
[<c0403ef6>] sysenter_past_esp+0x5f/0x85
=======================
DMA per-cpu:
CPU 0: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 usd: 0
CPU 1: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 usd: 0
CPU 2: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 usd: 0
CPU 3: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 usd: 0
Normal ...