Re: nfs unhappiness with memory pressure

From: Trond Myklebust
Date: Mon Dec 05 2005 - 15:33:05 EST


On Mon, 2005-12-05 at 15:13 -0500, Trond Myklebust wrote:
> On Mon, 2005-12-05 at 10:01 -0800, Kenny Simpson wrote:
> > Tested with rc5 - same results. It was suggested that I run slabtop when the system freezed, so
> > here is that info: (again, by hand, I'm getting another machine to use either netconsole or a
> > serial cable).
> >
> > Active / Total Objects (% used) : 478764 / 485383 (98.6%)
> > Active / Total Slabs (% used) : 14618 / 14635 (99.9%)
> > Active / Total Caches (% used) : 79 / 138 (57.2%)
> > Active / Total Size (% used) : 56663.79K / 57566.41K (98.4%)
> > Minimum / Average / Maximum Object : 0.01K / 0.12K / 128.00K
> >
> > OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
> > 403088 403088 100% 0.06K 6832 59 27328K nfs_page
> > 30380 30380 100% 0.50K 4340 7 17360K nfs_write_data
> > 15134 15134 100% 0.27K 1081 14 4324K radix_tree_node
> > ...
> >
> >
> > The other thing is that the stack trace showsd slabtop as being halted in throttle_vm_writeout
> > while allocating memory, and the writetest was halted waiting to allocate memory.
>
> Can somebody VM-savvy please explain how on earth they expect something
> like throttle_vm_writeout() to make progress? Shouldn't that thing at
> the very least be kicking pdflush every time it loops?

Can you try something like this patch, Kenny?

Cheers,
Trond


VM: Ensure that throttle_vm_writeout() can make progress

Once a process is in the loop inside throttle_vm_writeout(), it has
no guarantee that it will ever get out, since there is nothing that
will kickstart the flushing of unstable writes.

Signed-off-by: Trond Myklebust <Trond.Myklebust@xxxxxxxxxx>
---

mm/page-writeback.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 5240e42..9a66dee 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -306,6 +306,8 @@ void throttle_vm_writeout(void)

if (wbs.nr_unstable + wbs.nr_writeback <= dirty_thresh)
break;
+ if (wbs.nr_unstable != 0)
+ wakeup_pdflush(wbs.nr_unstable);
blk_congestion_wait(WRITE, HZ/10);
}
}