From: Yinghai Lu <yinghai@kernel.org>
To: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Jack Steiner <steiner@sgi.com>,
mingo@elte.hu, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/2] fix slowness of /proc/stat per-cpu IRQ sum calculation on large system by a new counter
Date: Mon, 11 Oct 2010 20:05:59 -0700 [thread overview]
Message-ID: <4CB3D097.6000604@kernel.org> (raw)
In-Reply-To: <20101012113736.f34d1426.kamezawa.hiroyu@jp.fujitsu.com>
On 10/11/2010 07:37 PM, KAMEZAWA Hiroyuki wrote:
> Jack Steiner reported slowness of /proc/stat on a large system.
> This patch set tries to improve it.
>
>> The combination of the 2 patches solves the problem.
>> The timings are (4096p, 256 nodes, 4592 irqs):
>>
>> # time cat /proc/stat > /dev/null
>>
>> Baseline: 12.627 sec
>> Patch1 : 2.459 sec
>> Patch 1 + Patch 2: .561 sec
>
> please review.
>
> ==
> From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
>
> Problem: 'cat /proc/stat' is too slow on verrry bis system.
>
> /proc/stat shows the total number of all interrupts to each cpu. But when
> the number of IRQs are very large, it takes very long time and 'cat /proc/stat'
> takes more than 10 secs. This is because sum of all irq events are counted
> when /proc/stat is read. This patch adds "sum of all irq" counter percpu
> and update it at events.
>
> The cost of reading /proc/stat is important because it's used by major
> applications as 'top', 'ps', 'w', etc....
>
> A test on a host (4096cpu, 256 nodes, 4592 irqs) shows
>
> %time cat /proc/stat > /dev/null
> Before Patch: 12.627 sec
> After Patch: 2.459 sec
>
> Tested-by: Jack Steiner <steiner@sgi.com>
> Acked-by: Jack Steiner <steiner@sgi.com>
> Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
> ---
> fs/proc/stat.c | 4 +---
> include/linux/kernel_stat.h | 14 ++++++++++++--
> 2 files changed, 13 insertions(+), 5 deletions(-)
>
> Index: linux-2.6.36-rc7/fs/proc/stat.c
> ===================================================================
> --- linux-2.6.36-rc7.orig/fs/proc/stat.c
> +++ linux-2.6.36-rc7/fs/proc/stat.c
> @@ -52,9 +52,7 @@ static int show_stat(struct seq_file *p,
> guest = cputime64_add(guest, kstat_cpu(i).cpustat.guest);
> guest_nice = cputime64_add(guest_nice,
> kstat_cpu(i).cpustat.guest_nice);
> - for_each_irq_nr(j) {
> - sum += kstat_irqs_cpu(j, i);
> - }
> + sum = kstat_cpu_irqs_sum(i);
should be
+ sum += kstat_cpu_irqs_sum(i);
> sum += arch_irq_stat_cpu(i);
>
> for (j = 0; j < NR_SOFTIRQS; j++) {
> Index: linux-2.6.36-rc7/include/linux/kernel_stat.h
> ===================================================================
> --- linux-2.6.36-rc7.orig/include/linux/kernel_stat.h
> +++ linux-2.6.36-rc7/include/linux/kernel_stat.h
> @@ -33,6 +33,7 @@ struct kernel_stat {
> #ifndef CONFIG_GENERIC_HARDIRQS
> unsigned int irqs[NR_IRQS];
> #endif
> + unsigned long irqs_sum;
> unsigned int softirqs[NR_SOFTIRQS];
> };
>
> @@ -54,6 +55,7 @@ static inline void kstat_incr_irqs_this_
> struct irq_desc *desc)
> {
> kstat_this_cpu.irqs[irq]++;
> + kstat_this_cpu.irqs_sum++;
> }
>
> static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
> @@ -65,8 +67,9 @@ static inline unsigned int kstat_irqs_cp
> extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu);
> #define kstat_irqs_this_cpu(DESC) \
> ((DESC)->kstat_irqs[smp_processor_id()])
> -#define kstat_incr_irqs_this_cpu(irqno, DESC) \
> - ((DESC)->kstat_irqs[smp_processor_id()]++)
> +#define kstat_incr_irqs_this_cpu(irqno, DESC) do {\
> + ((DESC)->kstat_irqs[smp_processor_id()]++);\
> + kstat_this_cpu.irqs_sum++; } while (0)
>
> #endif
>
> @@ -94,6 +97,13 @@ static inline unsigned int kstat_irqs(un
> return sum;
> }
>
> +/*
> + * Number of interrupts per cpu, since bootup
> + */
> +static inline unsigned int kstat_cpu_irqs_sum(unsigned int cpu)
> +{
> + return kstat_cpu(cpu).irqs_sum;
> +}
>
> /*
> * Lock/unlock the current runqueue - to extract task statistics:
next prev parent reply other threads:[~2010-10-12 3:08 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-29 12:22 Problem: scaling of /proc/stat on large systems Jack Steiner
2010-09-30 5:09 ` KAMEZAWA Hiroyuki
2010-10-04 14:34 ` Jack Steiner
2010-10-05 1:36 ` KAMEZAWA Hiroyuki
2010-10-05 8:19 ` KAMEZAWA Hiroyuki
2010-10-08 16:35 ` Jack Steiner
2010-10-12 0:09 ` KAMEZAWA Hiroyuki
2010-10-12 0:22 ` Andrew Morton
2010-10-12 1:02 ` KAMEZAWA Hiroyuki
2010-10-12 2:37 ` [PATCH 1/2] fix slowness of /proc/stat per-cpu IRQ sum calculation on large system by a new counter KAMEZAWA Hiroyuki
2010-10-12 2:39 ` [PATCH 2/2] improve footprint of kstat_irqs() for large system's /proc/stat KAMEZAWA Hiroyuki
2010-10-12 3:05 ` Yinghai Lu [this message]
2010-10-12 3:11 ` [PATCH 1/2] fix slowness of /proc/stat per-cpu IRQ sum calculation on large system by a new counter KAMEZAWA Hiroyuki
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=4CB3D097.6000604@kernel.org \
--to=yinghai@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=steiner@sgi.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.