From: Mel Gorman <mel@csn.ul.ie> To: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Linux Kernel List <linux-kernel@vger.kernel.org>, Rik van Riel <riel@redhat.com>, Johannes Weiner <hannes@cmpxchg.org>, Minchan Kim <minchan.kim@gmail.com>, Wu Fengguang <fengguang.wu@intel.com>, Andrea Arcangeli <aarcange@redhat.com>, KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>, Dave Chinner <david@fromorbit.com>, Chris Mason <chris.mason@oracle.com>, Christoph Hellwig <hch@lst.de>, Andrew Morton <akpm@linux-foundation.org> Subject: Re: [PATCH 10/10] vmscan: Kick flusher threads to clean pages when reclaim is encountering dirty pages Date: Thu, 9 Sep 2010 10:32:11 +0100 [thread overview] Message-ID: <20100909093211.GM29263@csn.ul.ie> (raw) In-Reply-To: <20100909122228.3db2b95c.kamezawa.hiroyu@jp.fujitsu.com> On Thu, Sep 09, 2010 at 12:22:28PM +0900, KAMEZAWA Hiroyuki wrote: > On Mon, 6 Sep 2010 11:47:33 +0100 > Mel Gorman <mel@csn.ul.ie> wrote: > > > There are a number of cases where pages get cleaned but two of concern > > to this patch are; > > o When dirtying pages, processes may be throttled to clean pages if > > dirty_ratio is not met. > > o Pages belonging to inodes dirtied longer than > > dirty_writeback_centisecs get cleaned. > > > > The problem for reclaim is that dirty pages can reach the end of the LRU if > > pages are being dirtied slowly so that neither the throttling or a flusher > > thread waking periodically cleans them. > > > > Background flush is already cleaning old or expired inodes first but the > > expire time is too far in the future at the time of page reclaim. To mitigate > > future problems, this patch wakes flusher threads to clean 4M of data - > > an amount that should be manageable without causing congestion in many cases. > > > > Ideally, the background flushers would only be cleaning pages belonging > > to the zone being scanned but it's not clear if this would be of benefit > > (less IO) or not (potentially less efficient IO if an inode is scattered > > across multiple zones). > > > > Signed-off-by: Mel Gorman <mel@csn.ul.ie> > > --- > > mm/vmscan.c | 32 ++++++++++++++++++++++++++++++-- > > 1 files changed, 30 insertions(+), 2 deletions(-) > > > > diff --git a/mm/vmscan.c b/mm/vmscan.c > > index 408c101..33d27a4 100644 > > --- a/mm/vmscan.c > > +++ b/mm/vmscan.c > > @@ -148,6 +148,18 @@ static DECLARE_RWSEM(shrinker_rwsem); > > /* Direct lumpy reclaim waits up to five seconds for background cleaning */ > > #define MAX_SWAP_CLEAN_WAIT 50 > > > > +/* > > + * When reclaim encounters dirty data, wakeup flusher threads to clean > > + * a maximum of 4M of data. > > + */ > > +#define MAX_WRITEBACK (4194304UL >> PAGE_SHIFT) > > +#define WRITEBACK_FACTOR (MAX_WRITEBACK / SWAP_CLUSTER_MAX) > > +static inline long nr_writeback_pages(unsigned long nr_dirty) > > +{ > > + return laptop_mode ? 0 : > > + min(MAX_WRITEBACK, (nr_dirty * WRITEBACK_FACTOR)); > > +} > > + > > static struct zone_reclaim_stat *get_reclaim_stat(struct zone *zone, > > struct scan_control *sc) > > { > > @@ -686,12 +698,14 @@ static noinline_for_stack void free_page_list(struct list_head *free_pages) > > */ > > static unsigned long shrink_page_list(struct list_head *page_list, > > struct scan_control *sc, > > + int file, > > unsigned long *nr_still_dirty) > > { > > LIST_HEAD(ret_pages); > > LIST_HEAD(free_pages); > > int pgactivate = 0; > > unsigned long nr_dirty = 0; > > + unsigned long nr_dirty_seen = 0; > > unsigned long nr_reclaimed = 0; > > > > cond_resched(); > > @@ -790,6 +804,8 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > } > > > > if (PageDirty(page)) { > > + nr_dirty_seen++; > > + > > /* > > * Only kswapd can writeback filesystem pages to > > * avoid risk of stack overflow > > @@ -923,6 +939,18 @@ keep_lumpy: > > > > list_splice(&ret_pages, page_list); > > > > + /* > > + * If reclaim is encountering dirty pages, it may be because > > + * dirty pages are reaching the end of the LRU even though the > > + * dirty_ratio may be satisified. In this case, wake flusher > > + * threads to pro-actively clean up to a maximum of > > + * 4 * SWAP_CLUSTER_MAX amount of data (usually 1/2MB) unless > > + * !may_writepage indicates that this is a direct reclaimer in > > + * laptop mode avoiding disk spin-ups > > + */ > > + if (file && nr_dirty_seen && sc->may_writepage) > > + wakeup_flusher_threads(nr_writeback_pages(nr_dirty)); > > + > > Thank you. Ok, I'll check what happens in memcg. > Thanks > Can I add > if (sc->memcg) { > memcg_check_flusher_wakeup() > } > or some here ? > It seems reasonable. > Hm, maybe memcg should wake up flusher at starting try_to_free_memory_cgroup_pages(). > I'm afraid I cannot make a judgement call on which is the best as I am not very familiar with how cgroups behave in comparison to normal reclaim. There could easily be a follow-on patch though that was cgroup specific? -- Mel Gorman Part-time Phd Student Linux Technology Center University of Limerick IBM Dublin Software Lab
WARNING: multiple messages have this Message-ID (diff)
From: Mel Gorman <mel@csn.ul.ie> To: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Linux Kernel List <linux-kernel@vger.kernel.org>, Rik van Riel <riel@redhat.com>, Johannes Weiner <hannes@cmpxchg.org>, Minchan Kim <minchan.kim@gmail.com>, Wu Fengguang <fengguang.wu@intel.com>, Andrea Arcangeli <aarcange@redhat.com>, KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>, Dave Chinner <david@fromorbit.com>, Chris Mason <chris.mason@oracle.com>, Christoph Hellwig <hch@lst.de>, Andrew Morton <akpm@linux-foundation.org> Subject: Re: [PATCH 10/10] vmscan: Kick flusher threads to clean pages when reclaim is encountering dirty pages Date: Thu, 9 Sep 2010 10:32:11 +0100 [thread overview] Message-ID: <20100909093211.GM29263@csn.ul.ie> (raw) In-Reply-To: <20100909122228.3db2b95c.kamezawa.hiroyu@jp.fujitsu.com> On Thu, Sep 09, 2010 at 12:22:28PM +0900, KAMEZAWA Hiroyuki wrote: > On Mon, 6 Sep 2010 11:47:33 +0100 > Mel Gorman <mel@csn.ul.ie> wrote: > > > There are a number of cases where pages get cleaned but two of concern > > to this patch are; > > o When dirtying pages, processes may be throttled to clean pages if > > dirty_ratio is not met. > > o Pages belonging to inodes dirtied longer than > > dirty_writeback_centisecs get cleaned. > > > > The problem for reclaim is that dirty pages can reach the end of the LRU if > > pages are being dirtied slowly so that neither the throttling or a flusher > > thread waking periodically cleans them. > > > > Background flush is already cleaning old or expired inodes first but the > > expire time is too far in the future at the time of page reclaim. To mitigate > > future problems, this patch wakes flusher threads to clean 4M of data - > > an amount that should be manageable without causing congestion in many cases. > > > > Ideally, the background flushers would only be cleaning pages belonging > > to the zone being scanned but it's not clear if this would be of benefit > > (less IO) or not (potentially less efficient IO if an inode is scattered > > across multiple zones). > > > > Signed-off-by: Mel Gorman <mel@csn.ul.ie> > > --- > > mm/vmscan.c | 32 ++++++++++++++++++++++++++++++-- > > 1 files changed, 30 insertions(+), 2 deletions(-) > > > > diff --git a/mm/vmscan.c b/mm/vmscan.c > > index 408c101..33d27a4 100644 > > --- a/mm/vmscan.c > > +++ b/mm/vmscan.c > > @@ -148,6 +148,18 @@ static DECLARE_RWSEM(shrinker_rwsem); > > /* Direct lumpy reclaim waits up to five seconds for background cleaning */ > > #define MAX_SWAP_CLEAN_WAIT 50 > > > > +/* > > + * When reclaim encounters dirty data, wakeup flusher threads to clean > > + * a maximum of 4M of data. > > + */ > > +#define MAX_WRITEBACK (4194304UL >> PAGE_SHIFT) > > +#define WRITEBACK_FACTOR (MAX_WRITEBACK / SWAP_CLUSTER_MAX) > > +static inline long nr_writeback_pages(unsigned long nr_dirty) > > +{ > > + return laptop_mode ? 0 : > > + min(MAX_WRITEBACK, (nr_dirty * WRITEBACK_FACTOR)); > > +} > > + > > static struct zone_reclaim_stat *get_reclaim_stat(struct zone *zone, > > struct scan_control *sc) > > { > > @@ -686,12 +698,14 @@ static noinline_for_stack void free_page_list(struct list_head *free_pages) > > */ > > static unsigned long shrink_page_list(struct list_head *page_list, > > struct scan_control *sc, > > + int file, > > unsigned long *nr_still_dirty) > > { > > LIST_HEAD(ret_pages); > > LIST_HEAD(free_pages); > > int pgactivate = 0; > > unsigned long nr_dirty = 0; > > + unsigned long nr_dirty_seen = 0; > > unsigned long nr_reclaimed = 0; > > > > cond_resched(); > > @@ -790,6 +804,8 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > } > > > > if (PageDirty(page)) { > > + nr_dirty_seen++; > > + > > /* > > * Only kswapd can writeback filesystem pages to > > * avoid risk of stack overflow > > @@ -923,6 +939,18 @@ keep_lumpy: > > > > list_splice(&ret_pages, page_list); > > > > + /* > > + * If reclaim is encountering dirty pages, it may be because > > + * dirty pages are reaching the end of the LRU even though the > > + * dirty_ratio may be satisified. In this case, wake flusher > > + * threads to pro-actively clean up to a maximum of > > + * 4 * SWAP_CLUSTER_MAX amount of data (usually 1/2MB) unless > > + * !may_writepage indicates that this is a direct reclaimer in > > + * laptop mode avoiding disk spin-ups > > + */ > > + if (file && nr_dirty_seen && sc->may_writepage) > > + wakeup_flusher_threads(nr_writeback_pages(nr_dirty)); > > + > > Thank you. Ok, I'll check what happens in memcg. > Thanks > Can I add > if (sc->memcg) { > memcg_check_flusher_wakeup() > } > or some here ? > It seems reasonable. > Hm, maybe memcg should wake up flusher at starting try_to_free_memory_cgroup_pages(). > I'm afraid I cannot make a judgement call on which is the best as I am not very familiar with how cgroups behave in comparison to normal reclaim. There could easily be a follow-on patch though that was cgroup specific? -- Mel Gorman Part-time Phd Student Linux Technology Center University of Limerick IBM Dublin Software Lab -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2010-09-09 9:32 UTC|newest] Thread overview: 133+ messages / expand[flat|nested] mbox.gz Atom feed top 2010-09-06 10:47 [PATCH 0/9] Reduce latencies and improve overall reclaim efficiency v1 Mel Gorman 2010-09-06 10:47 ` Mel Gorman 2010-09-06 10:47 ` [PATCH 01/10] tracing, vmscan: Add trace events for LRU list shrinking Mel Gorman 2010-09-06 10:47 ` Mel Gorman 2010-09-06 10:47 ` [PATCH 02/10] writeback: Account for time spent congestion_waited Mel Gorman 2010-09-06 10:47 ` Mel Gorman 2010-09-06 10:47 ` [PATCH 03/10] writeback: Do not congestion sleep if there are no congested BDIs or significant writeback Mel Gorman 2010-09-06 10:47 ` Mel Gorman 2010-09-07 15:25 ` Minchan Kim 2010-09-07 15:25 ` Minchan Kim 2010-09-08 11:04 ` Mel Gorman 2010-09-08 11:04 ` Mel Gorman 2010-09-08 14:52 ` Minchan Kim 2010-09-08 14:52 ` Minchan Kim 2010-09-09 8:54 ` Mel Gorman 2010-09-09 8:54 ` Mel Gorman 2010-09-12 15:37 ` Minchan Kim 2010-09-12 15:37 ` Minchan Kim 2010-09-13 8:55 ` Mel Gorman 2010-09-13 8:55 ` Mel Gorman 2010-09-13 9:48 ` Minchan Kim 2010-09-13 9:48 ` Minchan Kim 2010-09-13 10:07 ` Mel Gorman 2010-09-13 10:07 ` Mel Gorman 2010-09-13 10:20 ` Minchan Kim 2010-09-13 10:20 ` Minchan Kim 2010-09-13 10:30 ` Mel Gorman 2010-09-13 10:30 ` Mel Gorman 2010-09-08 21:23 ` Andrew Morton 2010-09-08 21:23 ` Andrew Morton 2010-09-09 10:43 ` Mel Gorman 2010-09-09 10:43 ` Mel Gorman 2010-09-09 3:02 ` KAMEZAWA Hiroyuki 2010-09-09 3:02 ` KAMEZAWA Hiroyuki 2010-09-09 8:58 ` Mel Gorman 2010-09-09 8:58 ` Mel Gorman 2010-09-06 10:47 ` [PATCH 04/10] vmscan: Synchronous lumpy reclaim should not call congestion_wait() Mel Gorman 2010-09-06 10:47 ` Mel Gorman 2010-09-07 15:26 ` Minchan Kim 2010-09-07 15:26 ` Minchan Kim 2010-09-08 6:15 ` Johannes Weiner 2010-09-08 6:15 ` Johannes Weiner 2010-09-08 11:25 ` Wu Fengguang 2010-09-08 11:25 ` Wu Fengguang 2010-09-09 3:03 ` KAMEZAWA Hiroyuki 2010-09-09 3:03 ` KAMEZAWA Hiroyuki 2010-09-06 10:47 ` [PATCH 05/10] vmscan: Synchrounous lumpy reclaim use lock_page() instead trylock_page() Mel Gorman 2010-09-06 10:47 ` Mel Gorman 2010-09-07 15:28 ` Minchan Kim 2010-09-07 15:28 ` Minchan Kim 2010-09-08 6:16 ` Johannes Weiner 2010-09-08 6:16 ` Johannes Weiner 2010-09-08 11:28 ` Wu Fengguang 2010-09-08 11:28 ` Wu Fengguang 2010-09-09 3:04 ` KAMEZAWA Hiroyuki 2010-09-09 3:04 ` KAMEZAWA Hiroyuki 2010-09-09 3:15 ` KAMEZAWA Hiroyuki 2010-09-09 3:15 ` KAMEZAWA Hiroyuki 2010-09-09 3:25 ` Wu Fengguang 2010-09-09 3:25 ` Wu Fengguang 2010-09-09 4:13 ` KOSAKI Motohiro 2010-09-09 4:13 ` KOSAKI Motohiro 2010-09-09 9:22 ` Mel Gorman 2010-09-09 9:22 ` Mel Gorman 2010-09-10 10:25 ` KOSAKI Motohiro 2010-09-10 10:25 ` KOSAKI Motohiro 2010-09-10 10:33 ` KOSAKI Motohiro 2010-09-10 10:33 ` KOSAKI Motohiro 2010-09-10 10:33 ` KOSAKI Motohiro 2010-09-13 9:14 ` Mel Gorman 2010-09-13 9:14 ` Mel Gorman 2010-09-14 10:14 ` KOSAKI Motohiro 2010-09-14 10:14 ` KOSAKI Motohiro 2010-09-06 10:47 ` [PATCH 06/10] vmscan: Narrow the scenarios lumpy reclaim uses synchrounous reclaim Mel Gorman 2010-09-06 10:47 ` Mel Gorman 2010-09-09 3:14 ` KAMEZAWA Hiroyuki 2010-09-09 3:14 ` KAMEZAWA Hiroyuki 2010-09-06 10:47 ` [PATCH 07/10] vmscan: Remove dead code in shrink_inactive_list() Mel Gorman 2010-09-06 10:47 ` Mel Gorman 2010-09-07 15:33 ` Minchan Kim 2010-09-07 15:33 ` Minchan Kim 2010-09-06 10:47 ` [PATCH 08/10] vmscan: isolated_lru_pages() stop neighbour search if neighbour cannot be isolated Mel Gorman 2010-09-06 10:47 ` Mel Gorman 2010-09-07 15:37 ` Minchan Kim 2010-09-07 15:37 ` Minchan Kim 2010-09-08 11:12 ` Mel Gorman 2010-09-08 11:12 ` Mel Gorman 2010-09-08 14:58 ` Minchan Kim 2010-09-08 14:58 ` Minchan Kim 2010-09-08 11:37 ` Wu Fengguang 2010-09-08 11:37 ` Wu Fengguang 2010-09-08 12:50 ` Mel Gorman 2010-09-08 12:50 ` Mel Gorman 2010-09-08 13:14 ` Wu Fengguang 2010-09-08 13:14 ` Wu Fengguang 2010-09-08 13:27 ` Mel Gorman 2010-09-08 13:27 ` Mel Gorman 2010-09-09 3:17 ` KAMEZAWA Hiroyuki 2010-09-09 3:17 ` KAMEZAWA Hiroyuki 2010-09-06 10:47 ` [PATCH 09/10] vmscan: Do not writeback filesystem pages in direct reclaim Mel Gorman 2010-09-06 10:47 ` Mel Gorman 2010-09-13 13:31 ` Wu Fengguang 2010-09-13 13:31 ` Wu Fengguang 2010-09-13 13:55 ` Mel Gorman 2010-09-13 13:55 ` Mel Gorman 2010-09-13 14:33 ` Wu Fengguang 2010-09-13 14:33 ` Wu Fengguang 2010-10-28 21:50 ` Christoph Hellwig 2010-10-28 21:50 ` Christoph Hellwig 2010-10-29 10:26 ` Mel Gorman 2010-10-29 10:26 ` Mel Gorman 2010-09-06 10:47 ` [PATCH 10/10] vmscan: Kick flusher threads to clean pages when reclaim is encountering dirty pages Mel Gorman 2010-09-06 10:47 ` Mel Gorman 2010-09-09 3:22 ` KAMEZAWA Hiroyuki 2010-09-09 3:22 ` KAMEZAWA Hiroyuki 2010-09-09 9:32 ` Mel Gorman [this message] 2010-09-09 9:32 ` Mel Gorman 2010-09-13 0:53 ` KAMEZAWA Hiroyuki 2010-09-13 0:53 ` KAMEZAWA Hiroyuki 2010-09-13 13:48 ` Wu Fengguang 2010-09-13 13:48 ` Wu Fengguang 2010-09-13 14:10 ` Mel Gorman 2010-09-13 14:10 ` Mel Gorman 2010-09-13 14:41 ` Wu Fengguang 2010-09-13 14:41 ` Wu Fengguang 2010-09-06 10:49 ` [PATCH 0/9] Reduce latencies and improve overall reclaim efficiency v1 Mel Gorman 2010-09-06 10:49 ` Mel Gorman 2010-09-08 3:14 ` KOSAKI Motohiro 2010-09-08 3:14 ` KOSAKI Motohiro 2010-09-08 8:38 ` Mel Gorman 2010-09-08 8:38 ` Mel Gorman 2010-09-13 23:10 ` Minchan Kim 2010-09-13 23:10 ` Minchan Kim
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20100909093211.GM29263@csn.ul.ie \ --to=mel@csn.ul.ie \ --cc=aarcange@redhat.com \ --cc=akpm@linux-foundation.org \ --cc=chris.mason@oracle.com \ --cc=david@fromorbit.com \ --cc=fengguang.wu@intel.com \ --cc=hannes@cmpxchg.org \ --cc=hch@lst.de \ --cc=kamezawa.hiroyu@jp.fujitsu.com \ --cc=kosaki.motohiro@jp.fujitsu.com \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=minchan.kim@gmail.com \ --cc=riel@redhat.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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.