Re: [PATCH] mm: swap: async free swap slot cache entries

From: Chris Li
Date: Wed Jan 31 2024 - 19:43:33 EST


Hi Ying,

Sorry for the late reply.

On Sun, Dec 24, 2023 at 11:10 PM Huang, Ying <ying.huang@xxxxxxxxx> wrote:
>
> Chris Li <chrisl@xxxxxxxxxx> writes:
>
> > On Fri, Dec 22, 2023 at 11:52:08AM -0800, Andrew Morton wrote:
> >> On Thu, 21 Dec 2023 22:25:39 -0800 Chris Li <chrisl@xxxxxxxxxx> wrote:
> >>
> >> > We discovered that 1% swap page fault is 100us+ while 50% of
> >> > the swap fault is under 20us.
> >> >
> >> > Further investigation show that a large portion of the time
> >> > spent in the free_swap_slots() function for the long tail case.
> >> >
> >> > The percpu cache of swap slots is freed in a batch of 64 entries
> >> > inside free_swap_slots(). These cache entries are accumulated
> >> > from previous page faults, which may not be related to the current
> >> > process.
> >> >
> >> > Doing the batch free in the page fault handler causes longer
> >> > tail latencies and penalizes the current process.
> >> >
> >> > Move free_swap_slots() outside of the swapin page fault handler into an
> >> > async work queue to avoid such long tail latencies.
> >>
> >> This will require a larger amount of total work than the current
> >
> > Yes, there will be a tiny little bit of extra overhead to schedule the job
> > on to the other work queue.
> >
> >> scheme. So we're trading that off against better latency.
> >>
> >> Why is this a good tradeoff?
> >
> > That is a very good question. Both Hugh and Wei had asked me similar questions
> > before. +Hugh.
> >
> > The TL;DR is that it makes the swap more palleralizedable.
> >
> > Because morden computers typically have more than one CPU and the CPU utilization
> > is rarely reached to 100%. We are actually not trading the latency for some one
> > run slower. Most of the time the real impact is that the current swapin page fault
> > can return quicker so more work can submit to the kernel sooner, at the same time
> > the other idle CPU can pick up the non latency critical work of freeing of the
> > swap slot cache entries. The net effect is that we speed things up and increase
> > the overall system utilization rather than slow things down.
>
> You solution depends on there is enough idle time in the system. This
> isn't always true.
>
> In general, all async solutions have 2 possible issues.
>
> a) Unrelated applications may be punished. Because they may wait for
> CPU which is running the async operations. In the original solution,
> the application swap more will be punished.

The typical time to perform on the async free is very brief, at about
100ms level.
So the amount of punishment would be small.

The original behavior was already delaying the freeing of swap slots
due to batching.
Adding a tiny bit of time does not change the overall behavior too much.
Another thing is that, if the async free is pending, it will go
through the direct free path.

> b) The CPU time cannot be charged to appropriate applications. The
> original behavior isn't perfect too. But it's better than async worker.

Yes, the original behavior will free other cgroups' swap entries.

> Given the runtime of worker is at 100us level, these issues may be not
> severe. But I think that you may need to explain them at least.

Thanks for the suggestion. Will do in V2.

>
> And, when swap slots freeing batching was introduced, it was mainly used
> to reduce the lock contention of sis->lock (via swap_info_get_cont()).
> So, we may move some operations (e.g., mem_cgroup_uncharge_swap,
> clear_shadow_from_swap_cache(), etc.) out of batched operation (before
> calling free_swap_slot()) to reduce the latency impact.

That is good to know. Thanks for the explanation.

Chris

>
> > The test result of chromebook and Google production server should be able to show
> > that it is beneficial to both laptop and server workloads, making them more responsive
> > in swap related workload.
>
> --
> Best Regards,
> Huang, Ying
>