mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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: Johannes Weiner <hannes@cmpxchg.org> Signed-off-by: Andrew 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.org Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									497a6c1b09
								
							
						
					
					
						commit
						c843966c55
					
				
					 3 changed files with 21 additions and 7 deletions
				
			
		| 
						 | 
					@ -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;
 | 
				
			||||||
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[] = {
 | 
				
			||||||
		.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 {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * From 0 .. 100.  Higher means more swappy.
 | 
					 * From 0 .. 200.  Higher means more swappy.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int vm_swappiness = 60;
 | 
					int vm_swappiness = 60;
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue