mm:Add watermark slope for high mark
Subsystems (8)
PATCH 1/1 mm:Add watermark slope for high mark
When tuning the watermark_scale_factor to reduce stalls and compactions the high mark is also changed, it changed a bit too much. So this patch introduces a slope that can reduce this overhead a bit, or increase it if needed.
--- Documentation/sysctl/vm.txt | 15 +++++++++++++++ include/linux/mm.h | 1 + include/linux/mmzone.h | 2 ++ kernel/sysctl.c | 9 +++++++++ mm/page_alloc.c | 6 +++++- 5 files changed, 32 insertions(+), 1 deletion(-)
Documentation/sysctl/vm.txt +15 -0
@@ -62,6 +62,7 @@ Currently, these files are in /proc/sys/vm: - user_reserve_kbytes - vfs_cache_pressure - watermark_scale_factor +- watermark_high_factor_slope - zone_reclaim_mode ==============================================================
@@ -857,6 +858,20 @@ that the number of free pages kswapd maintains for latency reasons is too small for the allocation bursts occurring in the system. This knob can then be used to tune kswapd aggressiveness accordingly. +============================================================= + +watermark_high_factor_slope: + +This factor is high mark for watermark_scale_factor. +The unit is in percent. +Max value is 1000 and min value is 100. (High watermark is the same as +low water mark) Low watermark is min_wmark_pages + watermark_scale_factor. +and high watermark is +min_wmark_pages+(watermark_scale_factor * watermark_high_factor_slope). + +The default value is 200. + + ============================================================== zone_reclaim_mode:
include/linux/mm.h +1 -0
@@ -2094,6 +2094,7 @@ extern void zone_pcp_reset(struct zone *zone);/* page_alloc.c */ extern int min_free_kbytes;extern int watermark_scale_factor; +extern int watermark_high_factor_slope;/* nommu.c */ extern atomic_long_t mmap_pages_allocated;
include/linux/mmzone.h +2 -0
@@ -886,6 +886,8 @@ int min_free_kbytes_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *);int watermark_scale_factor_sysctl_handler (struct ctl_table *,int ,void __user *,size_t *,loff_t *); +//int watermark_high_factor_tilt_sysctl_handler(struct ctl_table *, int, +// void __user *, size_t *, loff_t *); extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES -1 ];int lowmem_reserve_ratio_sysctl_handler (struct ctl_table *,int ,void __user *,size_t *,loff_t *);
kernel/sysctl.c +9 -0
@@ -1444,6 +1444,15 @@ static struct ctl_table vm_table[] = { .extra2 = &one_thousand, }, { + .procname = "watermark_high_factor_slope", + .data = &watermark_high_factor_slope, + .maxlen = sizeof(watermark_high_factor_slope), + .mode = 0644, + .proc_handler = watermark_scale_factor_sysctl_handler, + .extra1 = &one_hundred, + .extra2 = &one_thousand, + }, + { .procname = "percpu_pagelist_fraction", .data = &percpu_pagelist_fraction, .maxlen = sizeof(percpu_pagelist_fraction),
mm/page_alloc.c +5 -1
@@ -263,6 +263,7 @@ compound_page_dtor * const compound_page_dtors[] = {int min_free_kbytes =1024 ;int user_min_free_kbytes =-1 ;int watermark_scale_factor =10 ; +int watermark_high_factor_slope =200 ;static unsigned long __meminitdata nr_kernel_pages;static unsigned long __meminitdata nr_all_pages;
@@ -6989,6 +6990,7 @@ static void __setup_per_zone_wmarks(void)for_each_zone (zone) {u64 tmp; +u64 tmp_high;spin_lock_irqsave (&zone->lock, flags); tmp = (u64 )pages_min * zone->managed_pages;
@@ -7026,7 +7028,9 @@ static void __setup_per_zone_wmarks(void) watermark_scale_factor, 10000)); zone->watermark[WMARK_LOW ] =min_wmark_pages (zone) + tmp; - zone->watermark[WMARK_HIGH ] =min_wmark_pages (zone) + tmp *2 ; + tmp_high =mult_frac (tmp, watermark_high_factor_slope,100 ); + zone->watermark[WMARK_HIGH ] =min_wmark_pages (zone) + tmp_high; +spin_unlock_irqrestore (&zone->lock, flags); }
Signature · 7 lines
2.7.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 4 lines · Peter Enderborg
When tuning the
watermark_scale_factorto reduce stalls and compactions the high mark is also changed, it changed a bit too much. So this patch introduces a slope that can reduce this overhead a bit, or increase it if needed.
This doesn't explain what is the problem, why it is a problem and why we need yet another tuning to address it. Users shouldn't really care about internal stuff like watermark tuning for each watermark independently. This looks like a gross hack. Please start over with the problem description and then we can move on to an approapriate fix. Piling up tuning knobs to workaround problems is simply not acceptable.
Quoted 121 lines
Signed-off-by Peter Enderborg <[email protected]>--- Documentation/sysctl/vm.txt | 15 +++++++++++++++ include/linux/mm.h | 1 + include/linux/mmzone.h | 2 ++ kernel/sysctl.c | 9 +++++++++ mm/page_alloc.c | 6 +++++- 5 files changed, 32 insertions(+), 1 deletion(-)Documentation/sysctl/vm.txt +15
-0@@ -62,6 +62,7 @@ Currently, these files are in /proc/sys/vm: - user_reserve_kbytes - vfs_cache_pressure - watermark_scale_factor +- watermark_high_factor_slope - zone_reclaim_mode ==============================================================@@ -857,6 +858,20 @@ that the number of free pages kswapd maintains for latency reasons is too small for the allocation bursts occurring in the system. This knob can then be used to tune kswapd aggressiveness accordingly. +============================================================= + +watermark_high_factor_slope: + +This factor is high mark for watermark_scale_factor. +The unit is in percent. +Max value is 1000 and min value is 100. (High watermark is the same as +low water mark) Low watermark is min_wmark_pages + watermark_scale_factor. +and high watermark is +min_wmark_pages+(watermark_scale_factor * watermark_high_factor_slope). + +The default value is 200. + + ============================================================== zone_reclaim_mode:include/linux/mm.h +1
-0@@ -2094,6 +2094,7 @@ extern void zone_pcp_reset(struct zone *zone);/* page_alloc.c */ extern int min_free_kbytes;extern int watermark_scale_factor; +extern int watermark_high_factor_slope;/* nommu.c */ extern atomic_long_t mmap_pages_allocated;include/linux/mmzone.h +2
-0@@ -886,6 +886,8 @@ int min_free_kbytes_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *);int watermark_scale_factor_sysctl_handler (struct ctl_table *,int ,void __user *,size_t *,loff_t *); +//int watermark_high_factor_tilt_sysctl_handler(struct ctl_table *, int, +// void __user *, size_t *, loff_t *); extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES -1 ];int lowmem_reserve_ratio_sysctl_handler (struct ctl_table *,int ,void __user *,size_t *,loff_t *);kernel/sysctl.c +9
-0@@ -1444,6 +1444,15 @@ static struct ctl_table vm_table[] = { .extra2 = &one_thousand, }, { + .procname = "watermark_high_factor_slope", + .data = &watermark_high_factor_slope, + .maxlen = sizeof(watermark_high_factor_slope), + .mode = 0644, + .proc_handler = watermark_scale_factor_sysctl_handler, + .extra1 = &one_hundred, + .extra2 = &one_thousand, + }, + { .procname = "percpu_pagelist_fraction", .data = &percpu_pagelist_fraction, .maxlen = sizeof(percpu_pagelist_fraction),mm/page_alloc.c +5
-1@@ -263,6 +263,7 @@ compound_page_dtor * const compound_page_dtors[] = {int min_free_kbytes =1024 ;int user_min_free_kbytes =-1 ;int watermark_scale_factor =10 ; +int watermark_high_factor_slope =200 ;static unsigned long __meminitdata nr_kernel_pages;static unsigned long __meminitdata nr_all_pages;@@ -6989,6 +6990,7 @@ static void __setup_per_zone_wmarks(void)for_each_zone (zone) {u64 tmp; +u64 tmp_high;spin_lock_irqsave (&zone->lock, flags); tmp = (u64 )pages_min * zone->managed_pages;@@ -7026,7 +7028,9 @@ static void __setup_per_zone_wmarks(void) watermark_scale_factor, 10000)); zone->watermark[WMARK_LOW ] =min_wmark_pages (zone) + tmp; - zone->watermark[WMARK_HIGH ] =min_wmark_pages (zone) + tmp *2 ; + tmp_high =mult_frac (tmp, watermark_high_factor_slope,100 ); + zone->watermark[WMARK_HIGH ] =min_wmark_pages (zone) + tmp_high; +spin_unlock_irqrestore (&zone->lock, flags); }Signature · 1 line
2.7.4
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 6 lines · Michal Hocko
Quoted 4 lines · Peter Enderborg
When tuning the
watermark_scale_factorto reduce stalls and compactions the high mark is also changed, it changed a bit too much. So this patch introduces a slope that can reduce this overhead a bit, or increase it if needed.
Quoted 6 lines
This doesn't explain what is the problem, why it is a problem and why we need yet another tuning to address it. Users shouldn't really care about internal stuff like watermark tuning for each watermark independently. This looks like a gross hack. Please start over with the problem description and then we can move on to an approapriate fix. Piling up tuning knobs to workaround problems is simply not acceptable.
Agreed. Also if you send a patch adding userspace API or a tuning knob, please CC linux-api mailing list (did that for this reply).
Quoted 116 lines
Quoted 116 lines
Signed-off-by Peter Enderborg <[email protected]>--- Documentation/sysctl/vm.txt | 15 +++++++++++++++ include/linux/mm.h | 1 + include/linux/mmzone.h | 2 ++ kernel/sysctl.c | 9 +++++++++ mm/page_alloc.c | 6 +++++- 5 files changed, 32 insertions(+), 1 deletion(-)Documentation/sysctl/vm.txt +15
-0@@ -62,6 +62,7 @@ Currently, these files are in /proc/sys/vm: - user_reserve_kbytes - vfs_cache_pressure - watermark_scale_factor +- watermark_high_factor_slope - zone_reclaim_mode ==============================================================@@ -857,6 +858,20 @@ that the number of free pages kswapd maintains for latency reasons is too small for the allocation bursts occurring in the system. This knob can then be used to tune kswapd aggressiveness accordingly. +============================================================= + +watermark_high_factor_slope: + +This factor is high mark for watermark_scale_factor. +The unit is in percent. +Max value is 1000 and min value is 100. (High watermark is the same as +low water mark) Low watermark is min_wmark_pages + watermark_scale_factor. +and high watermark is +min_wmark_pages+(watermark_scale_factor * watermark_high_factor_slope). + +The default value is 200. + + ============================================================== zone_reclaim_mode:include/linux/mm.h +1
-0@@ -2094,6 +2094,7 @@ extern void zone_pcp_reset(struct zone *zone);/* page_alloc.c */ extern int min_free_kbytes;extern int watermark_scale_factor; +extern int watermark_high_factor_slope;/* nommu.c */ extern atomic_long_t mmap_pages_allocated;include/linux/mmzone.h +2
-0@@ -886,6 +886,8 @@ int min_free_kbytes_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *);int watermark_scale_factor_sysctl_handler (struct ctl_table *,int ,void __user *,size_t *,loff_t *); +//int watermark_high_factor_tilt_sysctl_handler(struct ctl_table *, int, +// void __user *, size_t *, loff_t *); extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES -1 ];int lowmem_reserve_ratio_sysctl_handler (struct ctl_table *,int ,void __user *,size_t *,loff_t *);kernel/sysctl.c +9
-0@@ -1444,6 +1444,15 @@ static struct ctl_table vm_table[] = { .extra2 = &one_thousand, }, { + .procname = "watermark_high_factor_slope", + .data = &watermark_high_factor_slope, + .maxlen = sizeof(watermark_high_factor_slope), + .mode = 0644, + .proc_handler = watermark_scale_factor_sysctl_handler, + .extra1 = &one_hundred, + .extra2 = &one_thousand, + }, + { .procname = "percpu_pagelist_fraction", .data = &percpu_pagelist_fraction, .maxlen = sizeof(percpu_pagelist_fraction),mm/page_alloc.c +5
-1@@ -263,6 +263,7 @@ compound_page_dtor * const compound_page_dtors[] = {int min_free_kbytes =1024 ;int user_min_free_kbytes =-1 ;int watermark_scale_factor =10 ; +int watermark_high_factor_slope =200 ;static unsigned long __meminitdata nr_kernel_pages;static unsigned long __meminitdata nr_all_pages;@@ -6989,6 +6990,7 @@ static void __setup_per_zone_wmarks(void)for_each_zone (zone) {u64 tmp; +u64 tmp_high;spin_lock_irqsave (&zone->lock, flags); tmp = (u64 )pages_min * zone->managed_pages;@@ -7026,7 +7028,9 @@ static void __setup_per_zone_wmarks(void) watermark_scale_factor, 10000)); zone->watermark[WMARK_LOW ] =min_wmark_pages (zone) + tmp; - zone->watermark[WMARK_HIGH ] =min_wmark_pages (zone) + tmp *2 ; + tmp_high =mult_frac (tmp, watermark_high_factor_slope,100 ); + zone->watermark[WMARK_HIGH ] =min_wmark_pages (zone) + tmp_high; +
Quoted 6 lines
Quoted 5 lines
mm/page_alloc.c +0
-0spin_unlock_irqrestore (&zone->lock, flags); }Signature · 1 line
2.7.4
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 3 lines · Vlastimil Babka
Agreed. Also if you send a patch adding userspace API or a tuning knob, please CC linux-api mailing list (did that for this reply).
The cc-list is generated by get_maintainer.pl script.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 5 lines · Michal Hocko
Quoted 4 lines · Peter Enderborg
When tuning the
watermark_scale_factorto reduce stalls and compactions the high mark is also changed, it changed a bit too much. So this patch introduces a slope that can reduce this overhead a bit, or increase it if needed.
Quoted 7 lines
This doesn't explain what is the problem, why it is a problem and why we need yet another tuning to address it. Users shouldn't really care about internal stuff like watermark tuning for each watermark independently. This looks like a gross hack. Please start over with the problem description and then we can move on to an approapriate fix. Piling up tuning knobs to workaround problems is simply not acceptable.
In the original patch - https://lkml.org/lkml/2016/2/18/498 - had a
discussion about small systems with 8GB RAM. In the handheld world, that's a lot of RAM. However, the magic number 2 used in the present algorithm is out of the blue. Compaction problems are the same for both small and big. So small devices also need to increase watermark to
get compaction to work and reduce direct reclaims. Changing the low watermark makes direct reclaim rate drop a lot. But it will cause kswap to work more, and that has a negative impact. Lowering the gap will smooth out the kswap workload to suite embedded devices a lot better. This can be addressed by reducing the high watermark using the slope patch herein. Im sort of understand your opinion on user knobs, but hard-coded magic numbers are even worse.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 16 lines · peter enderborg
Quoted 5 lines · Michal Hocko
Quoted 4 lines · Peter Enderborg
When tuning the
watermark_scale_factorto reduce stalls and compactions the high mark is also changed, it changed a bit too much. So this patch introduces a slope that can reduce this overhead a bit, or increase it if needed.Quoted 7 lines
This doesn't explain what is the problem, why it is a problem and why we need yet another tuning to address it. Users shouldn't really care about internal stuff like watermark tuning for each watermark independently. This looks like a gross hack. Please start over with the problem description and then we can move on to an approapriate fix. Piling up tuning knobs to workaround problems is simply not acceptable.
In the original patch - https://lkml.org/lkml/2016/2/18/498 - had a
Quoted 10 lines
discussion about small systems with 8GB RAM. In the handheld world, that's a lot of RAM. However, the magic number 2 used in the present algorithm is out of the blue. Compaction problems are the same for both small and big. So small devices also need to increase watermark to
get compaction to work and reduce direct reclaims. Changing the low watermark makes direct reclaim rate drop a lot. But it will cause kswap to work more, and that has a negative impact. Lowering the gap will smooth out the kswap workload to suite embedded devices a lot better. This can be addressed by reducing the high watermark using the slope patch herein. Im sort of understand your opinion on user knobs, but hard-coded magic numbers are even worse.
How can a poor user know how to tune it when _we_ cannot do a qualified guess and we do know all the implementation details.
Really, describe problems you are seeing with the current code and we can talk about a proper fix or a heuristic when the fix is hard/unfeasible.
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
kbuild test robot
build botThank you for the patch! Yet something to improve:
Hi Peter,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on mmotm/master]
[also build test ERROR on v4.15-rc1 next-20171124]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Peter-Enderborg/mm-Add-watermark-slope-for-high-mark/20171127-140339 base: git://git.cmpxchg.org/linux-mmotm.git master config: i386-tinyconfig (attached as .config) compiler: gcc-7 (Debian 7.2.0-12) 7.2.1 20171025 reproduce: # save the attached .config to linux build tree make ARCH=i386
All errors (new ones prefixed by >>):
mm/page_alloc.o: In function `__setup_per_zone_wmarks':
>> page_alloc.c:(.text+0x9eb): undefined reference to `__umoddi3' >> page_alloc.c:(.text+0xa06): undefined reference to `__udivdi3'
page_alloc.c:(.text+0xa1d): undefined reference to `__udivdi3'
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
kbuild test robot
build botThank you for the patch! Yet something to improve:
Hi Peter,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on mmotm/master]
[also build test ERROR on v4.15-rc1 next-20171127]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Peter-Enderborg/mm-Add-watermark-slope-for-high-mark/20171127-140339 base: git://git.cmpxchg.org/linux-mmotm.git master config: i386-randconfig-s0-201748 (attached as .config) compiler: gcc-6 (Debian 6.4.0-9) 6.4.0 20171026 reproduce: # save the attached .config to linux build tree make ARCH=i386
All errors (new ones prefixed by >>):
mm/page_alloc.o: In function `__setup_per_zone_wmarks':
>> mm/page_alloc.c:7031: undefined reference to `__umoddi3' >> mm/page_alloc.c:7031: undefined reference to `__udivdi3' >> mm/page_alloc.c:7031: undefined reference to `__udivdi3'
vim +7031 mm/page_alloc.c
6977
6978 static void __setup_per_zone_wmarks(void)
6979 {
6980 unsigned long pages_min = min_free_kbytes >> (PAGE_SHIFT - 10);
6981 unsigned long lowmem_pages = 0;
6982 struct zone *zone;
6983 unsigned long flags;
6984
6985 /* Calculate total number of !ZONE_HIGHMEM pages */
6986 for_each_zone(zone) {
6987 if (!is_highmem(zone))
6988 lowmem_pages += zone->managed_pages;
6989 }
6990
6991 for_each_zone(zone) {
6992 u64 tmp;
6993 u64 tmp_high;
6994
6995 spin_lock_irqsave(&zone->lock, flags);
6996 tmp = (u64)pages_min * zone->managed_pages;
6997 do_div(tmp, lowmem_pages);
6998 if (is_highmem(zone)) {
6999 /*
7000 * __GFP_HIGH and PF_MEMALLOC allocations usually don't
7001 * need highmem pages, so cap pages_min to a small
7002 * value here.
7003 *
7004 * The WMARK_HIGH-WMARK_LOW and (WMARK_LOW-WMARK_MIN)
7005 * deltas control asynch page reclaim, and so should
7006 * not be capped for highmem.
7007 */
7008 unsigned long min_pages;
7009
7010 min_pages = zone->managed_pages / 1024;
7011 min_pages = clamp(min_pages, SWAP_CLUSTER_MAX, 128UL);
7012 zone->watermark[WMARK_MIN] = min_pages;
7013 } else {
7014 /*
7015 * If it's a lowmem zone, reserve a number of pages
7016 * proportionate to the zone's size.
7017 */
7018 zone->watermark[WMARK_MIN] = tmp;
7019 }
7020
7021 /*
7022 * Set the kswapd watermarks distance according to the
7023 * scale factor in proportion to available memory, but
7024 * ensure a minimum size on small systems.
7025 */
7026 tmp = max_t(u64, tmp >> 2,
7027 mult_frac(zone->managed_pages,
7028 watermark_scale_factor, 10000));
7029
7030 zone->watermark[WMARK_LOW] = min_wmark_pages(zone) + tmp;
> 7031 tmp_high = mult_frac(tmp, watermark_high_factor_slope, 100);
7032 zone->watermark[WMARK_HIGH] = min_wmark_pages(zone) + tmp_high;
7033
7034
7035 spin_unlock_irqrestore(&zone->lock, flags);
7036 }
7037
7038 /* update totalreserve_pages */
7039 calculate_totalreserve_pages();
7040 }
7041
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation