From: Andrew Morton <akpm@osdl.org>
To: Neil Horman <nhorman@tuxdriver.com>
Cc: linux-kernel@vger.kernel.org, mingo@redhat.com
Subject: Re: [PATCH] vm: enhance __alloc_pages to prioritize pagecache eviction when pressed for memory
Date: Fri, 9 Dec 2005 16:29:01 -0800 [thread overview]
Message-ID: <20051209162901.71728620.akpm@osdl.org> (raw)
In-Reply-To: <20051207220401.GB13577@hmsreliant.homelinux.net>
Neil Horman <nhorman@tuxdriver.com> wrote:
>
> Hey all-
> I was recently shown this issue, wherein, if the kernel was kept full of
> pagecache via applications that were constantly writing large amounts of data to
> disk, the box could find itself in a position where the vm, in __alloc_pages
> would invoke the oom killer repetatively within try_to_free_pages, until such
> time as the box had no candidate processes left to kill, at which point it would
> panic.
That's pretty bad. Are you able to provide a description which would permit
others to reproduce this?
> /*
> + * Writeback nr_pages from pagecache to disk synchronously
> + * blocks until the writeback is complete
> + */
> +void clean_pagecache(long nr_pages)
> +{
> + struct writeback_control wbc = {
> + .bdi = NULL,
> + .sync_mode = WB_SYNC_ALL,
> + .older_than_this = NULL,
> + .nr_to_write = nr_pages,
> + .nonblocking = 0,
> + };
> +
> + writeback_inodes(&wbc);
> +}
Interesting.
> +/*
> * Start writeback of `nr_pages' pages. If `nr_pages' is zero, write back
> * the whole world. Returns 0 if a pdflush thread was dispatched. Returns
> * -1 if all pdflush threads were busy.
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -949,6 +949,16 @@ rebalance:
> reclaim_state.reclaimed_slab = 0;
> p->reclaim_state = &reclaim_state;
>
> + /*
> + * We're pinched for memory, so before we try to reclaim some
> + * pages synchronously, lets try to force some more pages out
> + * of pagecache, to raise our chances of this succeding.
> + * specifically, lets write out the number of pages that this
> + * allocation is requesting, in the hopes that they will be
> + * contiguous
> + */
> + clean_pagecache(1<<order);
> +
> did_some_progress = try_to_free_pages(zonelist->zones, gfp_mask);
I suspect that we shuld be passing more than (1<<order) into
clean_pagecache() - if we're going to do this sort of writeback then we
might as well do a decent amount. Maybe something like (number of pages on
the eligible LRUs * proportion of dirty memory) or something. But then,
page reclaim does writeback off the LRU, so none of this should be
needed... Need to work out why it broke.
And we should not be calling into filesystem writeback unless the caller
specified __GFP_FS.
next prev parent reply other threads:[~2005-12-10 0:28 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-12-07 22:04 Neil Horman
2005-12-10 0:29 ` Andrew Morton [this message]
2005-12-10 18:25 ` Neil Horman
2005-12-12 18:22 ` Neil Horman
2005-12-12 20:16 ` Andrew Morton
2005-12-12 21:40 ` Neil Horman
2005-12-14 19:43 ` Neil Horman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20051209162901.71728620.akpm@osdl.org \
--to=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=nhorman@tuxdriver.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome