All of lore.kernel.org
 help / color / mirror / Atom feed
From: Linus Torvalds <torvalds@linux-foundation.org>
To: Marc MERLIN <marc@merlins.org>,
	Kent Overstreet <kent.overstreet@gmail.com>,
	Tejun Heo <tj@kernel.org>, Jens Axboe <axboe@fb.com>
Cc: Michal Hocko <mhocko@kernel.org>,
	Vlastimil Babka <vbabka@suse.cz>, linux-mm <linux-mm@kvack.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Joonsoo Kim <iamjoonsoo.kim@lge.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: Re: 4.8.8 kernel trigger OOM killer repeatedly when I have lots of RAM that should be free
Date: Wed, 30 Nov 2016 10:14:50 -0800	[thread overview]
Message-ID: <CA+55aFzPQpvttSryRL3+EWeY7X+uFWOk2V+mM8JYm7ba+X1gHg@mail.gmail.com> (raw)
In-Reply-To: <20161130174713.lhvqgophhiupzwrm@merlins.org>

[-- Attachment #1: Type: text/plain, Size: 2651 bytes --]

On Wed, Nov 30, 2016 at 9:47 AM, Marc MERLIN <marc@merlins.org> wrote:
>
> I gave it a thought again, I think it is exactly the nasty situation you
> described.
> bcache takes I/O quickly while sending to SSD cache. SSD fills up, now
> bcache can't handle IO as quickly and has to hang until the SSD has been
> flushed to spinning rust drives.
> This actually is exactly the same as filling up the cache on a USB key
> and now you're waiting for slow writes to flash, is it not?

It does sound like you might hit exactly the same kind of situation, yes.

And the fact that you have dmcrypt running too just makes things pile
up more. All those IO's end up slowed down by the scheduling too.

Anyway, none of this seems new per se. I'm adding Kent and Jens to the
cc (Tejun already was), in the hope that maybe they have some idea how
to control the nasty worst-case behavior wrt workqueue lockup (it's
not really a "lockup", it looks like it's just hundreds of workqueues
all waiting for IO to complete and much too deep IO queues).

I think it's the traditional "throughput is much easier to measure and
improve" situation, where making queues big help some throughput
situation, but ends up causing chaos when things go south.

And I think your NMI watchdog then turns the "system is no longer
responsive" into an actual kernel panic.

> With your dirty ratio workaround, I was able to re-enable bcache and
> have it not fall over, but only barely. I recorded over a hundred
> workqueues in flight during the copy at some point (just not enough
> to actually kill the kernel this time).
>
> I've started a bcache followp on this here:
> http://marc.info/?l=linux-bcache&m=148052441423532&w=2
> http://marc.info/?l=linux-bcache&m=148052620524162&w=2
>
> A full traceback showing the pilup of requests is here:
> http://marc.info/?l=linux-bcache&m=147949497808483&w=2
>
> and there:
> http://pastebin.com/rJ5RKUVm
> (2 different ones but mostly the same result)

Tejun/Kent - any way to just limit the workqueue depth for bcache?
Because that really isn't helping, and things *will* time out and
cause those problems when you have hundreds of IO's queued on a disk
that likely as a write iops around ~100..

And I really wonder if we should do the "big hammer" approach to the
dirty limits on non-HIGHMEM machines too (approximate the
"vm_highmem_is_dirtyable" by just limiting global_dirtyable_memory()
to 1 GB).

That would make the default dirty limits be 100/200MB (for soft/hard
throttling), which really is much more reasonable than gigabytes and
gigabytes of dirty data.

Of course, no way do we do that during rc7..

                    Linus

[-- Attachment #2: patch.diff --]
[-- Type: text/plain, Size: 956 bytes --]

 mm/page-writeback.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 439cc63ad903..26ecbdecb815 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -352,6 +352,10 @@ static unsigned long highmem_dirtyable_memory(unsigned long total)
 #endif
 }
 
+/* Limit dirtyable memory to 1GB */
+#define PAGES_IN_GB(x) ((x) << (30 - PAGE_SHIFT))
+#define MAX_DIRTYABLE_LOWMEM_PAGES PAGES_IN_GB(1)
+
 /**
  * global_dirtyable_memory - number of globally dirtyable pages
  *
@@ -373,8 +377,11 @@ static unsigned long global_dirtyable_memory(void)
 	x += global_node_page_state(NR_INACTIVE_FILE);
 	x += global_node_page_state(NR_ACTIVE_FILE);
 
-	if (!vm_highmem_is_dirtyable)
+	if (!vm_highmem_is_dirtyable) {
 		x -= highmem_dirtyable_memory(x);
+		if (x > MAX_DIRTYABLE_LOWMEM_PAGES)
+			x = MAX_DIRTYABLE_LOWMEM_PAGES;
+	}
 
 	return x + 1;	/* Ensure that we never return 0 */
 }

  reply	other threads:[~2016-11-30 18:15 UTC|newest]

Thread overview: 113+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-21 15:43 4.8.8 kernel trigger OOM killer repeatedly when I have lots of RAM that should be free Marc MERLIN
2016-11-21 16:30 ` Marc MERLIN
2016-11-21 21:50 ` Vlastimil Babka
2016-11-21 21:50   ` Vlastimil Babka
2016-11-21 21:56   ` Marc MERLIN
2016-11-21 21:56     ` Marc MERLIN
2016-11-21 23:03     ` [PATCH] block,blkcg: use __GFP_NOWARN for best-effort allocations in blkcg Tejun Heo
2016-11-21 23:03       ` Tejun Heo
2016-11-22 15:47       ` Vlastimil Babka
2016-11-22 15:47         ` Vlastimil Babka
2016-11-22 16:48         ` Tejun Heo
2016-11-22 16:48           ` Tejun Heo
2016-11-22 22:13           ` Linus Torvalds
2016-11-22 22:13             ` Linus Torvalds
2016-11-23  8:50             ` Vlastimil Babka
2016-11-23  8:50               ` Vlastimil Babka
2016-11-28 17:19               ` Tejun Heo
2016-11-28 17:19                 ` Tejun Heo
2016-11-29  7:25                 ` Michal Hocko
2016-11-29  7:25                   ` Michal Hocko
2016-11-29 16:38                   ` Tejun Heo
2016-11-29 16:38                     ` Tejun Heo
2016-11-29 16:57                     ` Vlastimil Babka
2016-11-29 16:57                       ` Vlastimil Babka
2016-11-29 17:13                       ` Michal Hocko
2016-11-29 17:13                         ` Michal Hocko
2016-11-29 17:17                         ` Linus Torvalds
2016-11-29 17:17                           ` Linus Torvalds
2016-11-29 17:28                           ` Michal Hocko
2016-11-29 17:28                             ` Michal Hocko
2016-11-29 17:48                             ` Linus Torvalds
2016-11-29 17:48                               ` Linus Torvalds
2016-11-22 16:00       ` Jens Axboe
2016-11-22 16:00         ` Jens Axboe
2016-11-22 16:06     ` 4.8.8 kernel trigger OOM killer repeatedly when I have lots of RAM that should be free Marc MERLIN
2016-11-22 16:06       ` Marc MERLIN
2016-11-22 16:14       ` Vlastimil Babka
2016-11-22 16:14         ` Vlastimil Babka
2016-11-22 16:25         ` Michal Hocko
2016-11-22 16:25           ` Michal Hocko
2016-11-22 16:47           ` Marc MERLIN
2016-11-22 16:47             ` Marc MERLIN
2016-11-22 16:38         ` Greg Kroah-Hartman
2016-11-22 16:38           ` Greg Kroah-Hartman
2016-11-29 16:25           ` Michal Hocko
2016-11-29 16:25             ` Michal Hocko
2016-11-29 16:25             ` Michal Hocko
2016-11-29 16:43             ` Patch "mm, oom: stop pre-mature high-order OOM killer invocations" has been added to the 4.8-stable tree gregkh
2016-11-29 16:43             ` 4.8.8 kernel trigger OOM killer repeatedly when I have lots of RAM that should be free Greg Kroah-Hartman
2016-11-29 16:43               ` Greg Kroah-Hartman
2016-11-22 19:38         ` Linus Torvalds
2016-11-22 19:38           ` Linus Torvalds
2016-11-23  6:34           ` Michal Hocko
2016-11-23  6:34             ` Michal Hocko
2016-11-23  6:53             ` Hillf Danton
2016-11-23  6:53               ` Hillf Danton
2016-11-23  7:00               ` Michal Hocko
2016-11-23  7:00                 ` Michal Hocko
2016-11-23  9:18             ` Vlastimil Babka
2016-11-23  9:18               ` Vlastimil Babka
2016-11-28  7:23             ` Michal Hocko
2016-11-28  7:23               ` Michal Hocko
2016-11-28 20:55               ` Marc MERLIN
2016-11-29 15:55               ` Marc MERLIN
2016-11-29 15:55                 ` Marc MERLIN
2016-11-29 16:07                 ` Michal Hocko
2016-11-29 16:07                   ` Michal Hocko
2016-11-29 16:34                   ` Marc MERLIN
2016-11-29 16:34                     ` Marc MERLIN
2016-11-29 17:07                     ` Linus Torvalds
2016-11-29 17:07                       ` Linus Torvalds
2016-11-29 17:40                       ` Marc MERLIN
2016-11-29 17:40                         ` Marc MERLIN
2016-11-29 18:01                         ` Linus Torvalds
2016-11-29 18:01                           ` Linus Torvalds
2016-11-30 17:47                           ` Marc MERLIN
2016-11-30 17:47                             ` Marc MERLIN
2016-11-30 18:14                             ` Linus Torvalds [this message]
2016-11-30 18:21                               ` Marc MERLIN
2016-11-30 18:21                                 ` Marc MERLIN
2016-11-30 18:27                               ` Jens Axboe
2016-11-30 18:27                                 ` Jens Axboe
2016-11-30 20:30                               ` Tejun Heo
2016-11-30 20:30                                 ` Tejun Heo
2016-12-01 13:50                                 ` Kent Overstreet
2016-12-01 13:50                                   ` Kent Overstreet
2016-12-01 18:16                                   ` Linus Torvalds
2016-12-01 18:16                                     ` Linus Torvalds
2016-12-01 18:30                                     ` Jens Axboe
2016-12-01 18:30                                       ` Jens Axboe
2016-12-01 18:37                                       ` Linus Torvalds
2016-12-01 18:37                                         ` Linus Torvalds
2016-12-01 18:46                                         ` Jens Axboe
2016-12-01 18:46                                           ` Jens Axboe
2016-11-29 20:11                         ` Holger Hoffstätte
2016-11-29 23:01                         ` Marc MERLIN
2016-11-29 23:01                           ` Marc MERLIN
2016-11-30 13:58                           ` Tetsuo Handa
2016-11-30 13:58                             ` Tetsuo Handa
2017-05-02  4:12                           ` Marc MERLIN
2017-05-02  4:12                             ` Marc MERLIN
2017-05-02  7:44                             ` Michal Hocko
2017-05-02  7:44                               ` Michal Hocko
2017-05-02 14:15                               ` Marc MERLIN
2017-05-02 14:15                                 ` Marc MERLIN
2017-05-02 10:44                             ` Tetsuo Handa
2017-05-02 10:44                               ` Tetsuo Handa
2016-11-29 16:15               ` Marc MERLIN
2016-11-29 16:15                 ` Marc MERLIN
2016-11-22 21:46         ` Simon Kirby
2016-11-22 21:46           ` Simon Kirby
2016-11-28  8:06           ` Vlastimil Babka
2016-11-28  8:06             ` Vlastimil Babka

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=CA+55aFzPQpvttSryRL3+EWeY7X+uFWOk2V+mM8JYm7ba+X1gHg@mail.gmail.com \
    --to=torvalds@linux-foundation.org \
    --cc=axboe@fb.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=kent.overstreet@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=marc@merlins.org \
    --cc=mhocko@kernel.org \
    --cc=tj@kernel.org \
    --cc=vbabka@suse.cz \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.