On Mon, Oct 4, 2021 at 10:44 AM Tejun Heo <tj@xxxxxxxxxx> wrote: > > On Mon, Oct 04, 2021 at 10:25:12AM -0700, Shakeel Butt wrote: > > > > To evaluate the impact of this patch, an 8 GiB tmpfs file is created on > > > > a system with swap-on-zram and the file was pushed to swap through > > > > memory.force_empty interface. On reading the whole file, the memcg stat > > > > flush in the refault code path is triggered. With this patch, we > > > > observed 38% reduction in the read time of 8 GiB file. > > > > > > The patch looks fine to me but that's a lot of reduction in read time. Can > > > you elaborate a bit on why this makes such a huge difference? Who's hitting > > > on that lock so hard? > > > > It was actually due to machine size. I ran a single threaded workload > > without any interference on a 112 cpus machine. So, most of the time > > the flush was acquiring and releasing the per-cpu rstat lock for empty > > trees. > > Sorry for being so slow but can you point to the exact call path which gets > slowed down so significantly? This is the mem_cgroup_flush_stats() inside workingset_refault() in mm/workingset.c. > I'm mostly wondering whether we need some sort > of time-batched flushes because even with lock avoidance the flush path > really isn't great when called frequently. We can mitigate it further if > necessary - e.g. by adding an "updated" bitmap so that the flusher doesn't > have to go around touching the cachelines for all the cpus. For the memcg stats, I already proposed a batched flush at [1]. I actually did perform the same experiment with the proposed patch along with [1] and it improves around just 1%. More specifically for memcg stats [1] is good enough but that is memcg specific and this patch has merits on its own. [1] https://lkml.kernel.org/r/20210930044711.2892660-1-shakeelb@xxxxxxxxxx > > Thanks. > > -- > tejun