All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RFC 1/4] mm: throttle MADV_FREE
@ 2015-02-24  8:18 ` Minchan Kim
  0 siblings, 0 replies; 71+ messages in thread
From: Minchan Kim @ 2015-02-24  8:18 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-kernel, linux-mm, Rik van Riel, Michal Hocko,
	Johannes Weiner, Mel Gorman, Shaohua Li, Yalin.Wang, Minchan Kim

Recently, Shaohua reported that MADV_FREE is much slower than
MADV_DONTNEED in his MADV_FREE bomb test. The reason is many of
applications went to stall with direct reclaim since kswapd's
reclaim speed isn't fast than applications's allocation speed
so that it causes lots of stall and lock contention.

This patch throttles MADV_FREEing so it works only if there
are enough pages in the system which will not trigger backgroud/
direct reclaim. Otherwise, MADV_FREE falls back to MADV_DONTNEED
because there is no point to delay freeing if we know system
is under memory pressure.

When I test the patch on my 3G machine + 12 CPU + 8G swap,
test: 12 processes

loop = 5;
mmap(512M);
while (loop--) {
	memset(512M);
	madvise(MADV_FREE or MADV_DONTNEED);
}

1) dontneed: 6.78user 234.09system 0:48.89elapsed
2) madvfree: 6.03user 401.17system 1:30.67elapsed
3) madvfree + this ptach: 5.68user 113.42system 0:36.52elapsed

It's clearly win.

Reported-by: Shaohua Li <shli@kernel.org>
Signed-off-by: Minchan Kim <minchan@kernel.org>
---
 mm/madvise.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/mm/madvise.c b/mm/madvise.c
index 6d0fcb8921c2..81bb26ecf064 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -523,8 +523,17 @@ madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev,
 		 * XXX: In this implementation, MADV_FREE works like
 		 * MADV_DONTNEED on swapless system or full swap.
 		 */
-		if (get_nr_swap_pages() > 0)
-			return madvise_free(vma, prev, start, end);
+		if (get_nr_swap_pages() > 0) {
+			unsigned long threshold;
+			/*
+			 * If we have trobule with memory pressure(ie,
+			 * under high watermark), free pages instantly.
+			 */
+			threshold = min_free_kbytes >> (PAGE_SHIFT - 10);
+			threshold = threshold + (threshold >> 1);
+			if (nr_free_pages() > threshold)
+				return madvise_free(vma, prev, start, end);
+		}
 		/* passthrough */
 	case MADV_DONTNEED:
 		return madvise_dontneed(vma, prev, start, end);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 71+ messages in thread

end of thread, other threads:[~2015-03-03  2:06 UTC | newest]

Thread overview: 71+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-24  8:18 [PATCH RFC 1/4] mm: throttle MADV_FREE Minchan Kim
2015-02-24  8:18 ` Minchan Kim
2015-02-24  8:18 ` [PATCH RFC 2/4] mm: change deactivate_page with deactivate_file_page Minchan Kim
2015-02-24  8:18   ` Minchan Kim
2015-02-24  8:18 ` [PATCH RFC 3/4] mm: move lazy free pages to inactive list Minchan Kim
2015-02-24  8:18   ` Minchan Kim
2015-02-24 16:14   ` Michal Hocko
2015-02-24 16:14     ` Michal Hocko
2015-02-25  0:27     ` Minchan Kim
2015-02-25  0:27       ` Minchan Kim
2015-02-25 15:17       ` Michal Hocko
2015-02-25 15:17         ` Michal Hocko
2015-02-24  8:18 ` [PATCH RFC 4/4] mm: support MADV_FREE in swapless system Minchan Kim
2015-02-24  8:18   ` Minchan Kim
2015-02-24 16:51   ` Michal Hocko
2015-02-24 16:51     ` Michal Hocko
2015-02-25  1:41     ` Minchan Kim
2015-02-25  1:41       ` Minchan Kim
2015-02-24 15:43 ` [PATCH RFC 1/4] mm: throttle MADV_FREE Michal Hocko
2015-02-24 15:43   ` Michal Hocko
2015-02-24 22:54   ` Shaohua Li
2015-02-24 22:54     ` Shaohua Li
2015-02-25 14:13     ` Michal Hocko
2015-02-25 14:13       ` Michal Hocko
2015-02-25  0:08   ` Minchan Kim
2015-02-25  0:08     ` Minchan Kim
2015-02-25  7:11     ` Minchan Kim
2015-02-25  7:11       ` Minchan Kim
2015-02-25 15:07       ` Michal Hocko
2015-02-25 15:07         ` Michal Hocko
2015-02-25 18:37       ` Shaohua Li
2015-02-25 18:37         ` Shaohua Li
2015-02-26  0:42         ` Minchan Kim
2015-02-26  0:42           ` Minchan Kim
2015-02-26 19:04           ` Shaohua Li
2015-02-26 19:04             ` Shaohua Li
2015-02-27  3:37     ` [RFC] mm: change mm_advise_free to clear page dirty Wang, Yalin
2015-02-27  3:37       ` Wang, Yalin
2015-02-27  5:28       ` Minchan Kim
2015-02-27  5:28         ` Minchan Kim
2015-02-27  5:48         ` Wang, Yalin
2015-02-27  5:48           ` Wang, Yalin
2015-02-27  6:44           ` Minchan Kim
2015-02-27  6:44             ` Minchan Kim
2015-02-27  7:50             ` Wang, Yalin
2015-02-27  7:50               ` Wang, Yalin
2015-02-27 13:37               ` Minchan Kim
2015-02-27 13:37                 ` Minchan Kim
2015-02-28 13:50                 ` Minchan Kim
2015-02-28 13:50                   ` Minchan Kim
2015-03-02  1:59                   ` Wang, Yalin
2015-03-02  1:59                     ` Wang, Yalin
2015-03-03  0:42                     ` Minchan Kim
2015-03-03  0:42                       ` Minchan Kim
2015-02-28 13:50                 ` [RFC] mm: change mm_advise_free to clear page dirty, " Minchan Kim
2015-02-27 21:02       ` Michal Hocko
2015-02-27 21:02         ` Michal Hocko
2015-02-28  2:11         ` Wang, Yalin
2015-02-28  2:11           ` Wang, Yalin
2015-02-28  6:01           ` [RFC V2] " Wang, Yalin
2015-02-28  6:01             ` Wang, Yalin
2015-03-02 12:38             ` Michal Hocko
2015-03-02 12:38               ` Michal Hocko
2015-03-03  2:06               ` [RFC V3] " Wang, Yalin
2015-03-03  2:06                 ` Wang, Yalin
2015-02-28 13:55           ` [RFC] " Minchan Kim
2015-02-28 13:55             ` Minchan Kim
2015-03-02  1:53             ` Wang, Yalin
2015-03-02  1:53               ` Wang, Yalin
2015-03-02 12:33           ` Michal Hocko
2015-03-02 12:33             ` Michal Hocko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.