On Mon, Mar 07, 2016 at 12:39:55PM -0500, Waiman Long wrote:
On 03/05/2016 01:34 AM, Dave Chinner wrote:Again: How is this an optimisation that is generally useful? Nobody
On Fri, Mar 04, 2016 at 09:51:37PM -0500, Waiman Long wrote:That is not really the case here. The patch won't change anything
This patchset allows the degeneration of per-cpu counters backNACK.
to global counters when:
1) The number of CPUs in the system is large, hence a high
cost for calling percpu_counter_sum(). 2) The initial count
value is small so that it has a high chance of excessive
percpu_counter_sum() calls.
When the above 2 conditions are true, this patchset allows the
user of per-cpu counters to selectively degenerate them into
global counters with lock. This is done by calling the new
percpu_counter_set_limit() API after percpu_counter_set().
Without this call, there is no change in the behavior of the
per-cpu counters.
Patch 1 implements the new percpu_counter_set_limit() API.
Patch 2 modifies XFS to call the new API for the m_ifree and
m_fdblocks per-cpu counters.
Waiman Long (2): percpu_counter: Allow falling back to global
counter on large system xfs: Allow degeneration of
m_fdblocks/m_ifree to global counters
This change to turns off per-counter free block counters for 32p
for the XFS free block counters. We proved 10 years ago that a
global lock for these counters was a massive scalability
limitation for concurrent buffered writes on 16p machines.
IOWs, this change is going to cause fast path concurrent
sequential write regressions for just about everyone, even on
empty filesystems.
if there is enough free blocks available in the filesystem. It
will turn on global lock at mount time iff the number of free
blocks available is less than the given limit. In the case of XFS,
it is 12MB per CPU. On the 80-thread system that I used for
testing, it will be a bit less than 1GB. Even if global lock is
enabled at the beginning, it will be transitioned back to percpu
lock as soon as enough free blocks become available.
runs their production 80-thread workloads on a filesystems with less
than 1GB of free space. This is a situation that most admins would
consider "impending doom".
I am aware that if there are enough threads pounding on the lock,Regardless of whether there is less contention, it still brings back
it can cause a scalability bottleneck. However, the qspinlock used
in x86 should greatly alleviate the scalability impact compared
with 10 years ago when we used the ticket lock.
a global serialisation point and modified cacheline (the free block
counter) in the filesystem that, at some point, will limit
concurrency....
BTW, what exactlyJust something that HPC apps have been known to do for more then 20
was the microbenchmark that you used to exercise concurrent
sequential write? I would like to try it out on the new hardware
and kernel.
years: concurrent sequential write from every CPU in the system.
http://oss.sgi.com/projects/xfs/papers/ols2006/ols-2006-paper.pdf
Where else in the kernel is there a requirement for 100%near to ENOSPC. As i asked you last time - if you want to makeI totally agree. I am not trying to optimize a filesystem
this problem go away, please increase the size of the filesystem
you are running your massively concurrent benchmarks on.
IOWs, please stop trying to optimise a filesystem slow path that:
a) 99.9% of production workloads never execute, b) where we
expect performance to degrade as allocation gets
computationally expensive as we close in on ENOSPC, c) we
start to execute blocking data flush operations that slow
everything down massively, and d) is indicative that the
workload is about to suffer from a fatal, unrecoverable
error (i.e. ENOSPC)
slowpath.
accurate threshold detection on per-cpu counters? There isn't, is
there?
There are use cases, however, where we may want toYet your patch won't have any effect on these "small" filesystems
create relatively small filesystem. One example that I cited in
patch 2 is the battery backed NVDIMM that I have played with
recently. They can be used for log files or other small files.
Each dimm is 8 GB. You can have a few of those available. So the
filesystem size could be 32GB or so. That can come close to the
the limit where excessive percpu_counter_sum() call can happen.
What I want to do here is to try to reduce the chance of excessive
percpu_counter_sum() calls causing a performance problem. For a
large filesystem that is nowhere near ENOSPC, my patch will have
no performance impact whatsoever.
because unless they have less free space than your threshold at
mount time (rare!) they won't ever have this global lock turned on.
Not to mention if space if freed in the fs, the global lock is
turned off, and will never get turned back on.
Further, anyone using XFS on nvdimms will be enabling DAX, which
goes through the direct IO path rather than the buffered IO path
that is generating all this block accounting pressure. Hence it will
behave differently, and so your solution doesn't obviously apply to
that workload space, either.
When we get production workloads hitting free block accounting
issues near ENOSPC, then we'll look at optimising the XFS accounting
code. Microbenchmarks are great when they have real-work relevance,
but this doesn't right now. Not to mention we've got bigger things
to worry about in XFS right now in terms of ENOSPC accounting (think
reverse mapping, shared blocks and breaking shares via COW right
next to ENOSPC) and getting these working *correctly* takes
precendence of optimisation of the accounting code.