• Byungchul Park's avatar
    mm, vmscan: retry kswapd's priority loop with cache_trim_mode off on failure · d221dd5f
    Byungchul Park authored
    With cache_trim_mode on, reclaim logic doesn't bother reclaiming anon
    pages.  However, it should be more careful to use the mode because it's
    going to prevent anon pages from being reclaimed even if there are a huge
    number of anon pages that are cold and should be reclaimed.  Even worse,
    that leads kswapd_failures to reach MAX_RECLAIM_RETRIES and stopping
    kswapd from functioning until direct reclaim eventually works to resume
    kswapd.
    
    So kswapd needs to retry its scan priority loop with cache_trim_mode off
    again if the mode doesn't work for reclaim.
    
    The problematic behavior can be reproduced by:
    
       CONFIG_NUMA_BALANCING enabled
       sysctl_numa_balancing_mode set to NUMA_BALANCING_MEMORY_TIERING
       numa node0 (8GB local memory, 16 CPUs)
       numa node1 (8GB slow tier memory, no CPUs)
    
       Sequence:
    
       1) echo 3 > /proc/sys/vm/drop_caches
       2) To emulate the system with full of cold memory in local DRAM, run
          the following dummy program and never touch the region:
    
             mmap(0, 8 * 1024 * 1024 * 1024, PROT_READ | PROT_WRITE,
                  MAP_ANONYMOUS | MAP_PRIVATE | MAP_POPULATE, -1, 0);
    
       3) Run any memory intensive work e.g. XSBench.
       4) Check if numa balancing is working e.i. promotion/demotion.
       5) Iterate 1) ~ 4) until numa balancing stops.
    
    With this, you could see that promotion/demotion are not working because
    kswapd has stopped due to ->kswapd_failures >= MAX_RECLAIM_RETRIES.
    
    Interesting vmstat delta's differences between before and after are like:
    
       +-----------------------+-------------------------------+
       | interesting vmstat    | before        | after         |
       +-----------------------+-------------------------------+
       | nr_inactive_anon      | 321935        | 1664772       |
       | nr_active_anon        | 1780700       | 437834        |
       | nr_inactive_file      | 30425         | 40882         |
       | nr_active_file        | 14961         | 3012          |
       | pgpromote_success     | 356           | 1293122       |
       | pgpromote_candidate   | 21953245      | 1824148       |
       | pgactivate            | 1844523       | 3311907       |
       | pgdeactivate          | 50634         | 1554069       |
       | pgfault               | 31100294      | 6518806       |
       | pgdemote_kswapd       | 30856         | 2230821       |
       | pgscan_kswapd         | 1861981       | 7667629       |
       | pgscan_anon           | 1822930       | 7610583       |
       | pgscan_file           | 39051         | 57046         |
       | pgsteal_anon          | 386           | 2192033       |
       | pgsteal_file          | 30470         | 38788         |
       | pageoutrun            | 30            | 412           |
       | numa_hint_faults      | 27418279      | 2875955       |
       | numa_pages_migrated   | 356           | 1293122       |
       +-----------------------+-------------------------------+
    
    Link: https://lkml.kernel.org/r/20240304082118.20499-1-byungchul@sk.comSigned-off-by: default avatarByungchul Park <byungchul@sk.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Yu Zhao <yuzhao@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    d221dd5f
vmscan.c 207 KB