From: Dave Chinner <david@fromorbit.com>
To: xfs@oss.sgi.com
Subject: [PATCH] xfs: single thread inode cache shrinking.
Date: Thu, 9 Sep 2010 01:20:43 +1000 [thread overview]
Message-ID: <1283959243-29176-1-git-send-email-david@fromorbit.com> (raw)
From: Dave Chinner <dchinner@redhat.com>
Having multiple CPUs trying to do the same cache shrinking work can
be actively harmful to perforamnce when the shrinkers land in the
same AGs. They then lockstep on perag locks, causing contention and
slowing each other down. Reclaim walking is sufficiently efficient
that we do no need parallelism to make significant progress, so stop
parallel access at the door.
Instead, keep track of the number of objects the shrinkers want
cleaned and make sure the single running shrinker does not stop
until it has hit the threshold that the other shrinker calls have
built up.
This increases the cold-cache unlink rate of a 8-way parallel unlink
workload from about 15,000 unlinks/s to 60-70,000 unlinks/s for the
same CPU usage (~700%), resulting in the runtime for a 200M inode
unlink workload dropping from 4h50m to just under 1 hour.
Signed-off-by: Dave Chinner <dchinner@redhat.com>
---
fs/xfs/linux-2.6/xfs_sync.c | 17 ++++++++++++++++-
fs/xfs/xfs_mount.h | 2 ++
2 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c
index d59c4a6..46a826f 100644
--- a/fs/xfs/linux-2.6/xfs_sync.c
+++ b/fs/xfs/linux-2.6/xfs_sync.c
@@ -883,12 +883,25 @@ xfs_reclaim_inode_shrink(
int reclaimable;
mp = container_of(shrink, struct xfs_mount, m_inode_shrink);
+
if (nr_to_scan) {
- if (!(gfp_mask & __GFP_FS))
+ if (!mutex_trylock(&mp->m_ino_shrink_lock)) {
+ atomic64_add(nr_to_scan, &mp->m_ino_shrink_nr);
+ return -1;
+ }
+
+ if (!(gfp_mask & __GFP_FS)) {
+ atomic64_add(nr_to_scan, &mp->m_ino_shrink_nr);
+ mutex_unlock(&mp->m_ino_shrink_lock);
return -1;
+ }
+ nr_to_scan += atomic64_read(&mp->m_ino_shrink_nr);
+ atomic64_set(&mp->m_ino_shrink_nr, 0);
xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0,
XFS_ICI_RECLAIM_TAG, 1, &nr_to_scan);
+ mutex_unlock(&mp->m_ino_shrink_lock);
+
/* if we don't exhaust the scan, don't bother coming back */
if (nr_to_scan > 0)
return -1;
@@ -910,6 +923,8 @@ xfs_inode_shrinker_register(
{
mp->m_inode_shrink.shrink = xfs_reclaim_inode_shrink;
mp->m_inode_shrink.seeks = DEFAULT_SEEKS;
+ atomic64_set(&mp->m_ino_shrink_nr, 0);
+ mutex_init(&mp->m_ino_shrink_lock);
register_shrinker(&mp->m_inode_shrink);
}
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h
index 622da21..57b5644 100644
--- a/fs/xfs/xfs_mount.h
+++ b/fs/xfs/xfs_mount.h
@@ -199,6 +199,8 @@ typedef struct xfs_mount {
__int64_t m_update_flags; /* sb flags we need to update
on the next remount,rw */
struct shrinker m_inode_shrink; /* inode reclaim shrinker */
+ atomic64_t m_ino_shrink_nr;
+ struct mutex m_ino_shrink_lock;
} xfs_mount_t;
/*
--
1.7.1
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next reply other threads:[~2010-09-08 15:20 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-08 15:20 Dave Chinner [this message]
2010-09-09 3:00 ` [PATCH] xfs: single thread inode cache shrinking Christoph Hellwig
2010-09-10 3:29 ` Dave Chinner
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=1283959243-29176-1-git-send-email-david@fromorbit.com \
--to=david@fromorbit.com \
--cc=xfs@oss.sgi.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