Messages in this thread Patch in this message | | | Date | Tue, 25 Jan 2005 23:11:39 +1100 | From | Nick Piggin <> | Subject | Re: memory leak in 2.6.11-rc2 |
| |
Andrew Tridgell wrote: > Andrew, > > > So what you should do before generating the leak tool output is to put > > heavy memory pressure on the machine to try to get it to free up as much of > > that pagecache as possible. bzero(malloc(lots)) will do it - create a real > > swapstorm, then do swapoff to kill remaining swapcache as well. > > As you saw when you logged into the machine earlier tonight, when you > suspend the dbench processes and run a memory filler the memory is > reclaimed. > > I still think its a bug though, as the oom killer is being triggered > when it shouldn't be. I have 4G of ram in this machine, and I'm only > running a couple of hundred processes that should be using maybe 500M > in total, so for the oom killer to kick in might mean that the memory > isn't being reclaimed under normal memory pressure. Certainly a ps > shows no process using more than a few MB. > > The oom killer report is below. This is with 2.6.11-rc2, with the pipe > leak fix, and the pgown monitoring patch. It was running one nbench of > size 50 and one dbench of size 40 at the time. >
There are various OOM killer improvements and fixes that have gone into Andrew's kernel tree which should be included for 2.6.11.
I don't think the OOM killer was ever perfect in 2.6, but recent tinkering in mm/ probably aggrivated it. *blush*
Here is another small OOM killer improvement. Previously we needed to reclaim SWAP_CLUSTER_MAX pages in a single pass. That should be changed so that we need only reclaim that many pages during the entire try_to_free_pages run, without going OOM.
Andrea? Andrew? Look OK?
---
linux-2.6-npiggin/mm/vmscan.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
diff -puN mm/vmscan.c~oom-helper mm/vmscan.c --- linux-2.6/mm/vmscan.c~oom-helper 2005-01-25 23:04:28.000000000 +1100 +++ linux-2.6-npiggin/mm/vmscan.c 2005-01-25 23:05:06.000000000 +1100 @@ -914,12 +914,12 @@ int try_to_free_pages(struct zone **zone sc.nr_reclaimed += reclaim_state->reclaimed_slab; reclaim_state->reclaimed_slab = 0; } - if (sc.nr_reclaimed >= SWAP_CLUSTER_MAX) { + total_scanned += sc.nr_scanned; + total_reclaimed += sc.nr_reclaimed; + if (total_reclaimed >= SWAP_CLUSTER_MAX) { ret = 1; goto out; } - total_scanned += sc.nr_scanned; - total_reclaimed += sc.nr_reclaimed; /* * Try to write back as many pages as we just scanned. This _
| |