lkml.org 
[lkml]   [2009]   [Dec]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH] vmscan: limit concurrent reclaimers in shrink_zone
    From
    Date
    On Mon, 2009-12-14 at 14:08 +0100, Andi Kleen wrote:
    > Rik van Riel <riel@redhat.com> writes:
    >
    > > +max_zone_concurrent_reclaim:
    > > +
    > > +The number of processes that are allowed to simultaneously reclaim
    > > +memory from a particular memory zone.
    > > +
    > > +With certain workloads, hundreds of processes end up in the page
    > > +reclaim code simultaneously. This can cause large slowdowns due
    > > +to lock contention, freeing of way too much memory and occasionally
    > > +false OOM kills.
    > > +
    > > +To avoid these problems, only allow a smaller number of processes
    > > +to reclaim pages from each memory zone simultaneously.
    > > +
    > > +The default value is 8.
    >
    > I don't like the hardcoded number. Is the same number good for a 128MB
    > embedded system as for as 1TB server? Seems doubtful.
    >
    > This should be perhaps scaled with memory size and number of CPUs?

    Remember this a per-zone number.

    >
    > > +/*
    > > + * Maximum number of processes concurrently running the page
    > > + * reclaim code in a memory zone. Having too many processes
    > > + * just results in them burning CPU time waiting for locks,
    > > + * so we're better off limiting page reclaim to a sane number
    > > + * of processes at a time. We do this per zone so local node
    > > + * reclaim on one NUMA node will not block other nodes from
    > > + * making progress.
    > > + */
    > > +int max_zone_concurrent_reclaimers = 8;
    >
    > __read_mostly
    >
    > > +
    > > static LIST_HEAD(shrinker_list);
    > > static DECLARE_RWSEM(shrinker_rwsem);
    > >
    > > @@ -1600,6 +1612,29 @@ static void shrink_zone(int priority, struct zone *zone,
    > > struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(zone, sc);
    > > int noswap = 0;
    > >
    > > + if (!current_is_kswapd() && atomic_read(&zone->concurrent_reclaimers) >
    > > + max_zone_concurrent_reclaimers) {
    > > + /*
    > > + * Do not add to the lock contention if this zone has
    > > + * enough processes doing page reclaim already, since
    > > + * we would just make things slower.
    > > + */
    > > + sleep_on(&zone->reclaim_wait);
    >
    > wait_event()? sleep_on is a really deprecated racy interface.
    >
    > This would still badly thunder the herd if not enough memory is freed
    > , won't it? It would be better to only wake up a single process if memory got freed.
    >
    > How about for each page freed do a wake up for one thread?
    >
    >
    > -Andi



    \
     
     \ /
      Last update: 2009-12-14 15:23    [W:0.023 / U:1.576 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site