From: Waiman Long <longman@redhat.com>
To: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
Linus Torvalds <torvalds@linux-foundation.org>,
Jan Kara <jack@suse.cz>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Andrew Morton <akpm@linux-foundation.org>,
Ingo Molnar <mingo@kernel.org>,
Miklos Szeredi <mszeredi@redhat.com>,
Matthew Wilcox <willy@infradead.org>,
Larry Woodman <lwoodman@redhat.com>,
James Bottomley <James.Bottomley@HansenPartnership.com>,
"Wangkai (Kevin C)" <wangkai86@huawei.com>,
Waiman Long <longman@redhat.com>
Subject: [PATCH v4 6/6] fs/dcache: Autotuning of negative dentry limit
Date: Mon, 18 Sep 2017 14:20:34 -0400 [thread overview]
Message-ID: <1505758834-1201-7-git-send-email-longman@redhat.com> (raw)
In-Reply-To: <1505758834-1201-1-git-send-email-longman@redhat.com>
To have a proper balance of positive and negative dentries, the free
pool negative dentry limit can be dynamically tuned up to no more than
the number of positive dentries that have ever been used. The total
positive dentry count is computed at a frequency of no more than once
every 5 minutes.
Signed-off-by: Waiman Long <longman@redhat.com>
---
fs/dcache.c | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/fs/dcache.c b/fs/dcache.c
index f46603e..ac68fbd 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -143,12 +143,19 @@ struct dentry_stat_t dentry_stat = {
* If a per-cpu counter runs out of negative dentries, it can borrow extra
* ones from the global free pool. If it has more than its percpu limit,
* the extra ones will be returned back to the global pool.
+ *
+ * In order to have a proper balance between negative and positive dentries,
+ * the free pool negative dentry limit can be tuned up dynamically at run
+ * time to no more than the highest number of positive dentries that were
+ * ever used. Total positive dentry count is checked no more than once
+ * every 5 mins to reduce performance impact.
*/
#define NEG_DENTRY_PC 2
#define NEG_DENTRY_BATCH (1 << 8)
#define NEG_PRUNING_SIZE (1 << 6)
#define NEG_PRUNING_SLOW_RATE (HZ/10)
#define NEG_PRUNING_FAST_RATE (HZ/50)
+#define NEG_COUNT_CHECK_PERIOD (HZ*5*60)
#define NEG_IS_SB_UMOUNTING(sb) \
unlikely(!(sb)->s_root || !((sb)->s_flags & MS_ACTIVE))
@@ -163,6 +170,7 @@ struct dentry_stat_t dentry_stat = {
long nfree; /* Negative dentry free pool */
struct super_block *prune_sb; /* Super_block for pruning */
atomic_long_t nr_neg_killed; /* # of negative entries killed */
+ unsigned long last_jiffies; /* Last time +ve count is checked */
} ndblk ____cacheline_aligned_in_smp;
static void prune_negative_dentry(struct work_struct *work);
@@ -1469,6 +1477,36 @@ static void prune_negative_dentry(struct work_struct *work)
ndblk.n_pos += freed - (ndblk.n_neg - last_n_neg);
/*
+ * Also check the total negative & positive dentries count to see
+ * if we can increase the free pool negative dentry limit.
+ */
+ if (time_after(jiffies, ndblk.last_jiffies + NEG_COUNT_CHECK_PERIOD)) {
+ unsigned long pos = 0, neg = 0;
+ int i;
+
+ /*
+ * The positive count may include a small number of
+ * negative dentries in transit, but that should be
+ * negligible.
+ */
+ for_each_possible_cpu(i) {
+ pos += per_cpu(nr_dentry, i);
+ neg += per_cpu(nr_dentry_neg, i);
+ }
+ pos -= neg;
+
+ if (unlikely(pos > neg_dentry_nfree_init)) {
+ unsigned long inc = pos - neg_dentry_nfree_init;
+
+ raw_spin_lock(&ndblk.nfree_lock);
+ ndblk.nfree += inc;
+ raw_spin_unlock(&ndblk.nfree_lock);
+ WRITE_ONCE(neg_dentry_nfree_init, pos);
+ }
+ ndblk.last_jiffies = jiffies;
+ }
+
+ /*
* Continue delayed pruning until negative dentry free pool is at
* least 1/2 of the initial value, the super_block has no more
* negative dentries left at the front, or unmounting is in
--
1.8.3.1
next prev parent reply other threads:[~2017-09-18 18:21 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-18 18:20 [PATCH v4 0/6] fs/dcache: Limit # of negative dentries Waiman Long
2017-09-18 18:20 ` [PATCH v4 1/6] fs/dcache: Relocate dentry_kill() after lock_parent() Waiman Long
2017-09-18 18:20 ` [PATCH v4 2/6] fs/dcache: Track & report number of negative dentries Waiman Long
2017-09-18 18:20 ` [PATCH v4 3/6] fs/dcache: Limit numbers " Waiman Long
2017-09-18 18:20 ` [PATCH v4 4/6] fs/dcache: Enable automatic pruning " Waiman Long
2017-09-18 18:20 ` [PATCH v4 5/6] fs/dcache: Track count of negative dentries forcibly killed Waiman Long
2017-09-18 18:20 ` Waiman Long [this message]
2017-10-05 15:41 ` [PATCH v4 0/6] fs/dcache: Limit # of negative dentries Waiman Long
2017-10-10 22:54 ` Andrew Morton
2017-10-11 20:47 ` Waiman Long
2017-10-11 20:56 ` Dave Chinner
2017-10-11 21:08 ` Waiman Long
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=1505758834-1201-7-git-send-email-longman@redhat.com \
--to=longman@redhat.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=akpm@linux-foundation.org \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lwoodman@redhat.com \
--cc=mingo@kernel.org \
--cc=mszeredi@redhat.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
--cc=wangkai86@huawei.com \
--cc=willy@infradead.org \
/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