• Yu Zhao's avatar
    mm/mglru: fix underprotected page cache · 08148805
    Yu Zhao authored
    Unmapped folios accessed through file descriptors can be underprotected. 
    Those folios are added to the oldest generation based on:
    
    1. The fact that they are less costly to reclaim (no need to walk the
       rmap and flush the TLB) and have less impact on performance (don't
       cause major PFs and can be non-blocking if needed again).
    2. The observation that they are likely to be single-use. E.g., for
       client use cases like Android, its apps parse configuration files
       and store the data in heap (anon); for server use cases like MySQL,
       it reads from InnoDB files and holds the cached data for tables in
       buffer pools (anon).
    
    However, the oldest generation can be very short lived, and if so, it
    doesn't provide the PID controller with enough time to respond to a surge
    of refaults.  (Note that the PID controller uses weighted refaults and
    those from evicted generations only take a half of the whole weight.) In
    other words, for a short lived generation, the moving average smooths out
    the spike quickly.
    
    To fix the problem:
    1. For folios that are already on LRU, if they can be beyond the
       tracking range of tiers, i.e., five accesses through file
       descriptors, move them to the second oldest generation to give them
       more time to age. (Note that tiers are used by the PID controller
       to statistically determine whether folios accessed multiple times
       through file descriptors are worth protecting.)
    2. When adding unmapped folios to LRU, adjust the placement of them so
       that they are not too close to the tail. The effect of this is
       similar to the above.
    
    On Android, launching 55 apps sequentially:
                               Before     After      Change
      workingset_refault_anon  25641024   25598972   0%
      workingset_refault_file  115016834  106178438  -8%
    
    Link: https://lkml.kernel.org/r/20231208061407.2125867-1-yuzhao@google.com
    Fixes: ac35a490 ("mm: multi-gen LRU: minimal implementation")
    Signed-off-by: default avatarYu Zhao <yuzhao@google.com>
    Reported-by: default avatarCharan Teja Kalla <quic_charante@quicinc.com>
    Tested-by: default avatarKalesh Singh <kaleshsingh@google.com>
    Cc: T.J. Mercier <tjmercier@google.com>
    Cc: Kairui Song <ryncsn@gmail.com>
    Cc: Hillf Danton <hdanton@sina.com>
    Cc: Jaroslav Pulchart <jaroslav.pulchart@gooddata.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    08148805
vmscan.c 206 KB