All of lore.kernel.org
 help / color / mirror / Atom feed
From: Al Viro <viro@ZenIV.linux.org.uk>
To: Miklos Szeredi <mszeredi@redhat.com>
Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	miklos@szeredi.hu
Subject: Re: [PATCH] dcache: fix quadratic behavior with parallel shrinkers
Date: Wed, 2 May 2018 23:45:33 +0100	[thread overview]
Message-ID: <20180502224533.GW30522@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20180502222635.1862-1-mszeredi@redhat.com>

On Thu, May 03, 2018 at 12:26:35AM +0200, Miklos Szeredi wrote:
> When multiple shrinkers are operating on a directory containing many
> dentries, it takes much longer than if only one shrinker is operating on
> the directory.
> 
> Call the shrinker instances A and B, which shrink DIR containing NUM
> dentries.
> 
> Assume A wins the race for locking DIR's d_lock, then it goes onto moving
> all unlinked dentries to its dispose list.  When it's done, then B will
> scan the directory once again, but will find that all dentries are already
> being shrunk, so it will have an empty dispose list.  Both A and B will
> have found NUM dentries (data.found == NUM).
> 
> Now comes the interesting part: A will proceed to shrink the dispose list
> by killing individual dentries and decrementing the refcount of the parent
> (which is DIR).  NB: decrementing DIR's refcount will block if DIR's d_lock
> is held.  B will shrink a zero size list and then immediately restart
> scanning the directory, where it will lock DIR's d_lock, scan the remaining
> dentries and find no dentry to dispose.
> 
> So that results in B doing the directory scan over and over again, holding
> d_lock of DIR, while A is waiting for a chance to decrement refcount of DIR
> and making very slow progress because of this.  B is wasting time and
> holding up progress of A at the same time.
> 
> Proposed fix is to check this situation in B (found some dentries, but
> all are being shrunk already) and just sleep for some time, before retrying
> the scan.  The sleep is proportional to the number of found dentries.

The thing is, the majority of massive shrink_dcache_parent() can be killed.
Let's do that first and see if anything else is really needed.

As it is, rmdir() and rename() are ridiculously bad - they should only call
shrink_dcache_parent() after successful ->rmdir() or ->rename().  Sure,
there are other places where we do large shrink_dcache_parent() runs,
but those won't trigger in parallel on the same tree.

IOW, let's wait adding complexity until we fix the sources of those calls.

  reply	other threads:[~2018-05-02 22:45 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-02 22:26 [PATCH] dcache: fix quadratic behavior with parallel shrinkers Miklos Szeredi
2018-05-02 22:45 ` Al Viro [this message]
2018-05-03  7:44   ` Miklos Szeredi
2018-05-03  8:18     ` Miklos Szeredi

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=20180502224533.GW30522@ZenIV.linux.org.uk \
    --to=viro@zeniv.linux.org.uk \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    --cc=mszeredi@redhat.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 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.