From: Andrew Morton <akpm@linux-foundation.org>
To: Tim Chen <tim.c.chen@linux.intel.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Andi Kleen <ak@linux.intel.com>
Subject: Re: [RFC] mm: Make vm_acct_memory scalable for large memory allocations
Date: Thu, 27 Jan 2011 15:36:42 -0800 [thread overview]
Message-ID: <20110127153642.f022b51c.akpm@linux-foundation.org> (raw)
In-Reply-To: <1296082319.2712.100.camel@schen9-DESK>
On Wed, 26 Jan 2011 14:51:59 -0800
Tim Chen <tim.c.chen@linux.intel.com> wrote:
> During testing of concurrent malloc/free by multiple processes on a 8
> socket NHM-EX machine (8cores/socket, 64 cores total), I noticed that
> malloc of large memory (e.g. 32MB) did not scale well. A test patch
> included here increased 32MB mallocs/free with 64 concurrent processes
> from 69K operations/sec to 4066K operations/sec on 2.6.37 kernel, and
> eliminated the cpu cycles contending for spin_lock in the vm_commited_as
> percpu_counter.
This seems like a pretty dumb test case. We have 64 cores sitting in a
loop "allocating" 32MB of memory, not actually using that memory and
then freeing it up again.
Any not-completely-insane application would actually _use_ the memory.
Which involves pagefaults, page allocations and much memory traffic
modifying the page contents.
Do we actually care?
> Spin lock contention occurs when vm_acct_memory increments/decrements
> the percpu_counter vm_committed_as by the number of pages being
> used/freed. Theoretically vm_committed_as is a percpu_counter and should
> streamline the concurrent update by using the local counter in
> vm_commited_as. However, if the update is greater than
> percpu_counter_batch limit, then it will overflow into the global count
> in vm_commited_as. Currently percpu_counter_batch is non-configurable
> and hardcoded to 2*num_online_cpus. So any update of vm_commited_as by
> more than 256 pages will cause overflow in my test scenario which has
> 128 logical cpus.
>
> In the patch, I have set an enlargement multiplication factor for
> vm_commited_as's batch limit. I limit the sum of all local counters up
> to 5% of the total pages before overflowing into the global counter.
> This will avoid the frequent contention of the spin_lock in
> vm_commited_as. Some additional work will need to be done to make
> setting of this multiplication factor cpu hotplug aware. Advise on
> better approaches are welcomed.
>
> ...
>
> Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com>
> diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h
> index 46f6ba5..5a892d8 100644
> --- a/include/linux/percpu_counter.h
> +++ b/include/linux/percpu_counter.h
> @@ -21,6 +21,7 @@ struct percpu_counter {
> #ifdef CONFIG_HOTPLUG_CPU
> struct list_head list; /* All percpu_counters are on a list */
> #endif
> + u32 multibatch;
> s32 __percpu *counters;
> };
I dunno. Wouldn't it be better to put a `batch' field into
percpu_counter and then make the global percpu_counter_batch just go
away?
That would require modifying each counter's `batch' at cpuhotplug time,
while somehow retaining the counter's user's intent. So perhaps the
counter would need two fields - original_batch and operating_batch or
similar.
WARNING: multiple messages have this Message-ID (diff)
From: Andrew Morton <akpm@linux-foundation.org>
To: Tim Chen <tim.c.chen@linux.intel.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Andi Kleen <ak@linux.intel.com>
Subject: Re: [RFC] mm: Make vm_acct_memory scalable for large memory allocations
Date: Thu, 27 Jan 2011 15:36:42 -0800 [thread overview]
Message-ID: <20110127153642.f022b51c.akpm@linux-foundation.org> (raw)
In-Reply-To: <1296082319.2712.100.camel@schen9-DESK>
On Wed, 26 Jan 2011 14:51:59 -0800
Tim Chen <tim.c.chen@linux.intel.com> wrote:
> During testing of concurrent malloc/free by multiple processes on a 8
> socket NHM-EX machine (8cores/socket, 64 cores total), I noticed that
> malloc of large memory (e.g. 32MB) did not scale well. A test patch
> included here increased 32MB mallocs/free with 64 concurrent processes
> from 69K operations/sec to 4066K operations/sec on 2.6.37 kernel, and
> eliminated the cpu cycles contending for spin_lock in the vm_commited_as
> percpu_counter.
This seems like a pretty dumb test case. We have 64 cores sitting in a
loop "allocating" 32MB of memory, not actually using that memory and
then freeing it up again.
Any not-completely-insane application would actually _use_ the memory.
Which involves pagefaults, page allocations and much memory traffic
modifying the page contents.
Do we actually care?
> Spin lock contention occurs when vm_acct_memory increments/decrements
> the percpu_counter vm_committed_as by the number of pages being
> used/freed. Theoretically vm_committed_as is a percpu_counter and should
> streamline the concurrent update by using the local counter in
> vm_commited_as. However, if the update is greater than
> percpu_counter_batch limit, then it will overflow into the global count
> in vm_commited_as. Currently percpu_counter_batch is non-configurable
> and hardcoded to 2*num_online_cpus. So any update of vm_commited_as by
> more than 256 pages will cause overflow in my test scenario which has
> 128 logical cpus.
>
> In the patch, I have set an enlargement multiplication factor for
> vm_commited_as's batch limit. I limit the sum of all local counters up
> to 5% of the total pages before overflowing into the global counter.
> This will avoid the frequent contention of the spin_lock in
> vm_commited_as. Some additional work will need to be done to make
> setting of this multiplication factor cpu hotplug aware. Advise on
> better approaches are welcomed.
>
> ...
>
> Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com>
> diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h
> index 46f6ba5..5a892d8 100644
> --- a/include/linux/percpu_counter.h
> +++ b/include/linux/percpu_counter.h
> @@ -21,6 +21,7 @@ struct percpu_counter {
> #ifdef CONFIG_HOTPLUG_CPU
> struct list_head list; /* All percpu_counters are on a list */
> #endif
> + u32 multibatch;
> s32 __percpu *counters;
> };
I dunno. Wouldn't it be better to put a `batch' field into
percpu_counter and then make the global percpu_counter_batch just go
away?
That would require modifying each counter's `batch' at cpuhotplug time,
while somehow retaining the counter's user's intent. So perhaps the
counter would need two fields - original_batch and operating_batch or
similar.
--
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/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2011-01-27 23:36 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-26 22:51 [RFC] mm: Make vm_acct_memory scalable for large memory allocations Tim Chen
2011-01-26 22:51 ` Tim Chen
2011-01-27 23:36 ` Andrew Morton [this message]
2011-01-27 23:36 ` Andrew Morton
2011-01-28 0:15 ` Andi Kleen
2011-01-28 0:15 ` Andi Kleen
2011-01-28 0:26 ` Andrew Morton
2011-01-28 0:26 ` Andrew Morton
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=20110127153642.f022b51c.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=ak@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=tim.c.chen@linux.intel.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: link
Be 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.