Commit c843966c authored by Johannes Weiner's avatar Johannes Weiner Committed by Linus Torvalds

mm: allow swappiness that prefers reclaiming anon over the file workingset

With the advent of fast random IO devices (SSDs, PMEM) and in-memory swap
devices such as zswap, it's possible for swap to be much faster than
filesystems, and for swapping to be preferable over thrashing filesystem
caches.

Allow setting swappiness - which defines the rough relative IO cost of
cache misses between page cache and swap-backed pages - to reflect such
situations by making the swap-preferred range configurable.
Signed-off-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Rik van Riel <riel@surriel.com>
Link: http://lkml.kernel.org/r/20200520232525.798933-4-hannes@cmpxchg.orgSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 497a6c1b
...@@ -831,14 +831,27 @@ tooling to work, you can do:: ...@@ -831,14 +831,27 @@ tooling to work, you can do::
swappiness swappiness
========== ==========
This control is used to define how aggressive the kernel will swap This control is used to define the rough relative IO cost of swapping
memory pages. Higher values will increase aggressiveness, lower values and filesystem paging, as a value between 0 and 200. At 100, the VM
decrease the amount of swap. A value of 0 instructs the kernel not to assumes equal IO cost and will thus apply memory pressure to the page
initiate swap until the amount of free and file-backed pages is less cache and swap-backed pages equally; lower values signify more
than the high water mark in a zone. expensive swap IO, higher values indicates cheaper.
Keep in mind that filesystem IO patterns under memory pressure tend to
be more efficient than swap's random IO. An optimal value will require
experimentation and will also be workload-dependent.
The default value is 60. The default value is 60.
For in-memory swap, like zram or zswap, as well as hybrid setups that
have swap on faster devices than the filesystem, values beyond 100 can
be considered. For example, if the random IO against the swap device
is on average 2x faster than IO from the filesystem, swappiness should
be 133 (x + 2x = 200, 2x = 133.33).
At 0, the kernel will not initiate swap until the amount of free and
file-backed pages is less than the high watermark in a zone.
unprivileged_userfaultfd unprivileged_userfaultfd
======================== ========================
......
...@@ -131,6 +131,7 @@ static unsigned long zero_ul; ...@@ -131,6 +131,7 @@ static unsigned long zero_ul;
static unsigned long one_ul = 1; static unsigned long one_ul = 1;
static unsigned long long_max = LONG_MAX; static unsigned long long_max = LONG_MAX;
static int one_hundred = 100; static int one_hundred = 100;
static int two_hundred = 200;
static int one_thousand = 1000; static int one_thousand = 1000;
#ifdef CONFIG_PRINTK #ifdef CONFIG_PRINTK
static int ten_thousand = 10000; static int ten_thousand = 10000;
...@@ -1391,7 +1392,7 @@ static struct ctl_table vm_table[] = { ...@@ -1391,7 +1392,7 @@ static struct ctl_table vm_table[] = {
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec_minmax, .proc_handler = proc_dointvec_minmax,
.extra1 = SYSCTL_ZERO, .extra1 = SYSCTL_ZERO,
.extra2 = &one_hundred, .extra2 = &two_hundred,
}, },
#ifdef CONFIG_HUGETLB_PAGE #ifdef CONFIG_HUGETLB_PAGE
{ {
......
...@@ -161,7 +161,7 @@ struct scan_control { ...@@ -161,7 +161,7 @@ struct scan_control {
#endif #endif
/* /*
* From 0 .. 100. Higher means more swappy. * From 0 .. 200. Higher means more swappy.
*/ */
int vm_swappiness = 60; int vm_swappiness = 60;
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment