lkml.org 
[lkml]   [2010]   [Jul]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 8/8] vmscan: Kick flusher threads to clean pages when reclaim is encountering dirty pages
    On Tue, Jul 20, 2010 at 12:48:39AM +0200, Johannes Weiner wrote:
    > On Mon, Jul 19, 2010 at 03:37:37PM +0100, Mel Gorman wrote:
    > > On Mon, Jul 19, 2010 at 10:23:49AM -0400, Christoph Hellwig wrote:
    > > > On Mon, Jul 19, 2010 at 02:11:30PM +0100, Mel Gorman wrote:
    > > > > + /*
    > > > > + * 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 some pages
    > > > > + */
    > > > > + wakeup_flusher_threads(laptop_mode ? 0 : nr_dirty + nr_dirty / 2);
    > > > > +
    > > >
    > > > Where is the laptop-mode magic coming from?
    > > >
    > >
    > > It comes from other parts of page reclaim where writing pages is avoided
    > > by page reclaim where possible. Things like this
    > >
    > > wakeup_flusher_threads(laptop_mode ? 0 : total_scanned);
    >
    > Actually, it's not avoiding writing pages in laptop mode, instead it
    > is lumping writeouts aggressively (as I wrote in my other mail,
    > .nr_pages=0 means 'write everything') to keep disk spinups rare and
    > make maximum use of them.
    >

    You're right, 0 does mean flush everything - /me slaps self. It was introduced
    in 2.6.6 with the patch "[PATCH] laptop mode". Quoting from it

    Algorithm: the idea is to hold dirty data in memory for a long time,
    but to flush everything which has been accumulated if the disk happens
    to spin up for other reasons.

    So, the reason for the magic is half right - avoid excessive disk spin-ups
    but my reasoning for it was wrong. I thought it was avoiding a cleaning to
    save power. What it is actually intended to do is "if we are spinning up the
    disk anyway, do as much work as possible so it can spin down for longer later".

    Where it's wrong is that it should only wakeup flusher threads if dirty
    pages were encountered. What it's doing right now is potentially
    cleaning everything. It means I need to rerun all the tests and see if
    the number of pages encountered by page reclaim is really reduced or was
    it because I was calling wakeup_flusher_threads(0) when no dirty pages
    were encountered.

    > > although the latter can get disabled too. Deleting the magic is an
    > > option which would trade IO efficiency for power efficiency but my
    > > current thinking is laptop mode preferred reduced power.
    >
    > Maybe couple your wakeup with sc->may_writepage? It is usually false
    > for laptop_mode but direct reclaimers enable it at one point in
    > do_try_to_free_pages() when it scanned more than 150% of the reclaim
    > target, so you could use existing disk spin-up points instead of
    > introducing new ones or disabling the heuristics in laptop mode.
    >

    How about the following?

    if (nr_dirty && sc->may_writepage)
    wakeup_flusher_threads(laptop_mode ? 0 :
    nr_dirty + nr_dirty / 2);


    1. Wakup flusher threads if dirty pages are encountered
    2. For direct reclaim, only wake them up if may_writepage is set
    indicating that the system is ready to spin up disks and start
    reclaiming
    3. In laptop_mode, flush everything to reduce future spin-ups

    --
    Mel Gorman
    Part-time Phd Student Linux Technology Center
    University of Limerick IBM Dublin Software Lab


    \
     
     \ /
      Last update: 2010-07-20 16:13    [W:2.445 / U:0.460 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site