genirq, proc: Speedup /proc/stat interrupt statistics
Subsystems (3)
v2 cover genirq, proc: Speedup /proc/stat interrupt statistics
Waiman reported that on large systems with a large amount of interrupts the readout of /proc/stat takes a long time to sum up the interrupt statistics. In principle this is not a problem. but for unknown reasons some enterprise quality software reads /proc/stat with a high frequency.
The reason for this is that interrupt statistics are accounted per cpu. So the /proc/stat logic has to sum up the interrupt stats for each interrupt.
The following series addresses this by making the interrupt statitics code in the core generate the sum directly and by making the loop in the /proc/stat read function smarter.
V1 -> V2: Address review feedback: undo struct layout changes, make
variables unsigned and add test results to the changelog.
Thanks,
tglx
8<----------------
fs/proc/stat.c | 29 ++++++++++++++++++++++++++--- include/linux/irqdesc.h | 1 + kernel/irq/chip.c | 12 ++++++++++-- kernel/irq/internals.h | 8 +++++++- kernel/irq/irqdesc.c | 7 ++++++- 5 files changed, 50 insertions(+), 7 deletions(-)
PATCH v2 1/2 genriq: Avoid summation loops for /proc/stat
Waiman reported that on large systems with a large amount of interrupts the readout of /proc/stat takes a long time to sum up the interrupt statistics. In principle this is not a problem. but for unknown reasons some enterprise quality software reads /proc/stat with a high frequency.
The reason for this is that interrupt statistics are accounted per cpu. So the /proc/stat logic has to sum up the interrupt stats for each interrupt.
This can be largely avoided for interrupts which are not marked as 'PER_CPU' interrupts by simply adding a per interrupt summation counter which is incremented along with the per interrupt per cpu counter.
The PER_CPU interrupts need to avoid that and use only per cpu accounting because they share the interrupt number and the interrupt descriptor and concurrent updates would conflict or require unwanted synchronization.
8<-------------
v2: Undo the unintentional layout change of struct irq_desc.
include/linux/irqdesc.h | 1 + kernel/irq/chip.c | 12 ++++++++++-- kernel/irq/internals.h | 8 +++++++- kernel/irq/irqdesc.c | 7 ++++++- 4 files changed, 24 insertions(+), 4 deletions(-)
include/linux/irqdesc.h +1 -0
@@ -65,6 +65,7 @@ struct irq_desc {unsigned int core_internal_state__do_not_mess_with_it;unsigned int depth;/* nested irq disables */ unsigned int wake_depth;/* nested wake enables */ +unsigned int tot_count;unsigned int irq_count;/* For detecting broken IRQs */ unsigned long last_unhandled;/* Aging timer for unhandled count */ unsigned int irqs_unhandled;
kernel/irq/chip.c +10 -2
@@ -855,7 +855,11 @@ void handle_percpu_irq(struct irq_desc * {struct irq_chip *chip =irq_desc_get_chip (desc); -kstat_incr_irqs_this_cpu (desc); +/* +* PER CPU interrupts are not serialized. Do not touch +* desc->tot_count. +*/ +__kstat_incr_irqs_this_cpu (desc);if (chip->irq_ack) chip->irq_ack (&desc->irq_data);
@@ -884,7 +888,11 @@ void handle_percpu_devid_irq(struct irq_unsigned int irq =irq_desc_get_irq (desc);irqreturn_t res; -kstat_incr_irqs_this_cpu (desc); +/* +* PER CPU interrupts are not serialized. Do not touch +* desc->tot_count. +*/ +__kstat_incr_irqs_this_cpu (desc);if (chip->irq_ack) chip->irq_ack (&desc->irq_data);
kernel/irq/internals.h +7 -1
@@ -242,12 +242,18 @@ static inline void irq_state_set_masked(#undef __irqd_to_state -static inline void kstat_incr_irqs_this_cpu (struct irq_desc *desc) +static inline void __kstat_incr_irqs_this_cpu (struct irq_desc *desc) {__this_cpu_inc (*desc->kstat_irqs);__this_cpu_inc (kstat.irqs_sum); } +static inline void kstat_incr_irqs_this_cpu (struct irq_desc *desc) +{ +__kstat_incr_irqs_this_cpu (desc); + desc->tot_count++; +} +static inline int irq_desc_get_node (struct irq_desc *desc) {return irq_common_data_get_node (&desc->irq_common_data);
kernel/irq/irqdesc.c +6 -1
@@ -119,6 +119,7 @@ static void desc_set_defaults(unsigned i desc->depth =1 ; desc->irq_count =0 ; desc->irqs_unhandled =0 ; + desc->tot_count =0 ; desc->name =NULL ; desc->owner = owner;for_each_possible_cpu (cpu)
@@ -919,11 +920,15 @@ unsigned int kstat_irqs_cpu(unsigned intunsigned int kstat_irqs (unsigned int irq) {struct irq_desc *desc =irq_to_desc (irq); -int cpu;unsigned int sum =0 ; +int cpu;if (!desc || !desc->kstat_irqs)return 0 ; +if (!irq_settings_is_per_cpu_devid (desc) && + !irq_settings_is_per_cpu (desc)) +return desc->tot_count; +for_each_possible_cpu (cpu) sum += *per_cpu_ptr (desc->kstat_irqs, cpu);return sum;
Re: [patch V2 1/2] genriq: Avoid summation loops for /proc/stat
Quoted 21 lines · On Fri, 08 Feb 2019 14:48:03 +0100 Thomas Gleixner <[email protected]> wrote:
Waiman reported that on large systems with a large amount of interrupts the readout of
/proc/stattakes a long time to sum up the interrupt statistics. In principle this is not a problem. but for unknown reasons some enterprise quality software reads/proc/statwith a high frequency.The reason for this is that interrupt statistics are accounted per cpu. So the
/proc/statlogic has to sum up the interrupt stats for each interrupt.This can be largely avoided for interrupts which are not marked as '
PER_CPU' interrupts by simply adding a per interrupt summation counter which is incremented along with the per interrupt per cpu counter.The
PER_CPUinterrupts need to avoid that and use only per cpu accounting because they share the interrupt number and the interrupt descriptor and concurrent updates would conflict or require unwanted synchronization....
include/linux/irqdesc.h struct irq_desc { · line 68
Quoted 4 lines
include/linux/irqdesc.h +1
-0@@ -65,6 +65,7 @@ struct irq_desc {unsigned int core_internal_state__do_not_mess_with_it;unsigned int depth;/* nested irq disables */ unsigned int wake_depth;/* nested wake enables */ +unsigned int tot_count;
Confused. Isn't this going to quickly overflow?
Re: [patch V2 1/2] genriq: Avoid summation loops for /proc/stat
Quoted 20 lines · Andrew Morton
Quoted 18 lines · On Fri, 08 Feb 2019 14:48:03 +0100 Thomas Gleixner <[email protected]> wrote:
Waiman reported that on large systems with a large amount of interrupts the readout of
/proc/stattakes a long time to sum up the interrupt statistics. In principle this is not a problem. but for unknown reasons some enterprise quality software reads/proc/statwith a high frequency.The reason for this is that interrupt statistics are accounted per cpu. So the
/proc/statlogic has to sum up the interrupt stats for each interrupt.This can be largely avoided for interrupts which are not marked as '
PER_CPU' interrupts by simply adding a per interrupt summation counter which is incremented along with the per interrupt per cpu counter.The
PER_CPUinterrupts need to avoid that and use only per cpu accounting because they share the interrupt number and the interrupt descriptor and concurrent updates would conflict or require unwanted synchronization....
Quoted 10 lines
include/linux/irqdesc.h struct irq_desc { · line 68
Quoted 7 lines
include/linux/irqdesc.h +1
-0@@ -65,6 +65,7 @@ struct irq_desc {unsigned int core_internal_state__do_not_mess_with_it;unsigned int depth;/* nested irq disables */ unsigned int wake_depth;/* nested wake enables */ +unsigned int tot_count;Confused. Isn't this going to quickly overflow?
All the current irq count computations for each individual irqs are using unsigned int type. Only the sum of all the irqs is u64. Yes, it is possible for an individual irq count to exceed 32 bits given sufficient uptime. My PC has an uptime of 36 days and the highest irq count value is 79,227,699. Given the current rate, the overflow will happen after about 5 years. A larger server system may have an overflow in much shorter period. So maybe we should consider changing all the irq counts to unsigned long then.
Cheers,
Longman
Re: [patch V2 1/2] genriq: Avoid summation loops for /proc/stat
Quoted 31 lines · On Fri, 8 Feb 2019 17:46:39 -0500 Waiman Long <[email protected]> wrote:
Quoted 20 lines · Andrew Morton
Quoted 18 lines · On Fri, 08 Feb 2019 14:48:03 +0100 Thomas Gleixner <[email protected]> wrote:
Waiman reported that on large systems with a large amount of interrupts the readout of
/proc/stattakes a long time to sum up the interrupt statistics. In principle this is not a problem. but for unknown reasons some enterprise quality software reads/proc/statwith a high frequency.The reason for this is that interrupt statistics are accounted per cpu. So the
/proc/statlogic has to sum up the interrupt stats for each interrupt.This can be largely avoided for interrupts which are not marked as '
PER_CPU' interrupts by simply adding a per interrupt summation counter which is incremented along with the per interrupt per cpu counter.The
PER_CPUinterrupts need to avoid that and use only per cpu accounting because they share the interrupt number and the interrupt descriptor and concurrent updates would conflict or require unwanted synchronization....
Quoted 10 lines
include/linux/irqdesc.h struct irq_desc { · line 68
Quoted 7 lines
include/linux/irqdesc.h +1
-0@@ -65,6 +65,7 @@ struct irq_desc {unsigned int core_internal_state__do_not_mess_with_it;unsigned int depth;/* nested irq disables */ unsigned int wake_depth;/* nested wake enables */ +unsigned int tot_count;Confused. Isn't this going to quickly overflow?
Quoted 8 lines
All the current irq count computations for each individual irqs are using unsigned int type. Only the sum of all the irqs is u64. Yes, it is possible for an individual irq count to exceed 32 bits given sufficient uptime. My PC has an uptime of 36 days and the highest irq count value is 79,227,699. Given the current rate, the overflow will happen after about 5 years. A larger server system may have an overflow in much shorter period. So maybe we should consider changing all the irq counts to unsigned long then.
It sounds like it. A 10khz interrupt will overflow in 4 days...
Re: [patch V2 1/2] genriq: Avoid summation loops for /proc/stat
Quoted 1 line · Andrew Morton
It sounds like it. A 10khz interrupt will overflow in 4 days...
If you've got a 10kHz interrupt, you have a bigger problem. Anything happening 10,000 times a second is going to need interrupt mitigation to perform acceptably.
More importantly, userspace can (and must) cope with wrapping. This isn't anything new from Thomas' patch. As long as userspace is polling more often than once a day, it's going to see a wrapped value before it wraps again, so it won't miss 4 billion interrupts.
RE: [patch V2 1/2] genriq: Avoid summation loops for /proc/stat
From: Matthew Wilcox
Quoted 8 lines
Sent: 09 February 2019 03:41
Quoted 1 line · Andrew Morton
It sounds like it. A 10khz interrupt will overflow in 4 days...
If you've got a 10kHz interrupt, you have a bigger problem. Anything happening 10,000 times a second is going to need interrupt mitigation to perform acceptably.
Not necessarily - you may want the immediate interrupt for each received ethernet packet.
Quoted 4 lines
More importantly, userspace can (and must) cope with wrapping. This isn't anything new from Thomas' patch. As long as userspace is polling more often than once a day, it's going to see a wrapped value before it wraps again, so it won't miss 4 billion interrupts.
If userspace is expected to detect wraps, making the sum 64bit is pointless, confusing and stupid.
The code would have to mask off the high bits before determining that the value has decreased and then adding in 2^32.
David
-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
tip-bot for Thomas Gleixner
merge bot[tip:irq/core] genirq: Avoid summation loops for /proc/stat
In reply to Thomas Gleixnergenirq: Avoid summation loops for /proc/stat
Commit-ID: 1136b0728969901a091f0471968b2b76ed14d9ad Gitweb: https://git.kernel.org/tip/1136b0728969901a091f0471968b2b76ed14d9ad Author: Thomas Gleixner <[email protected]> AuthorDate: Fri, 8 Feb 2019 14:48:03 +0100 Committer: Thomas Gleixner <[email protected]> CommitDate: Sun, 10 Feb 2019 21:34:45 +0100
genirq: Avoid summation loops for /proc/stat
Waiman reported that on large systems with a large amount of interrupts the readout of /proc/stat takes a long time to sum up the interrupt statistics. In principle this is not a problem. but for unknown reasons some enterprise quality software reads /proc/stat with a high frequency.
The reason for this is that interrupt statistics are accounted per cpu. So the /proc/stat logic has to sum up the interrupt stats for each interrupt.
This can be largely avoided for interrupts which are not marked as 'PER_CPU' interrupts by simply adding a per interrupt summation counter which is incremented along with the per interrupt per cpu counter.
The PER_CPU interrupts need to avoid that and use only per cpu accounting because they share the interrupt number and the interrupt descriptor and concurrent updates would conflict or require unwanted synchronization.
8<-------------
v2: Undo the unintentional layout change of struct irq_desc.
include/linux/irqdesc.h | 1 + kernel/irq/chip.c | 12 ++++++++++-- kernel/irq/internals.h | 8 +++++++- kernel/irq/irqdesc.c | 7 ++++++- 4 files changed, 24 insertions(+), 4 deletions(-)
--- include/linux/irqdesc.h | 1 + kernel/irq/chip.c | 12 ++++++++++-- kernel/irq/internals.h | 8 +++++++- kernel/irq/irqdesc.c | 7 ++++++- 4 files changed, 24 insertions(+), 4 deletions(-)
include/linux/irqdesc.h +1 -0
@@ -65,6 +65,7 @@ struct irq_desc {unsigned int core_internal_state__do_not_mess_with_it;unsigned int depth;/* nested irq disables */ unsigned int wake_depth;/* nested wake enables */ +unsigned int tot_count;unsigned int irq_count;/* For detecting broken IRQs */ unsigned long last_unhandled;/* Aging timer for unhandled count */ unsigned int irqs_unhandled;
kernel/irq/chip.c +10 -2
@@ -855,7 +855,11 @@ void handle_percpu_irq(struct irq_desc *desc) {struct irq_chip *chip =irq_desc_get_chip (desc); -kstat_incr_irqs_this_cpu (desc); +/* +* PER CPU interrupts are not serialized. Do not touch +* desc->tot_count. +*/ +__kstat_incr_irqs_this_cpu (desc);if (chip->irq_ack) chip->irq_ack (&desc->irq_data);
@@ -884,7 +888,11 @@ void handle_percpu_devid_irq(struct irq_desc *desc)unsigned int irq =irq_desc_get_irq (desc);irqreturn_t res; -kstat_incr_irqs_this_cpu (desc); +/* +* PER CPU interrupts are not serialized. Do not touch +* desc->tot_count. +*/ +__kstat_incr_irqs_this_cpu (desc);if (chip->irq_ack) chip->irq_ack (&desc->irq_data);
kernel/irq/internals.h +7 -1
@@ -242,12 +242,18 @@ static inline void irq_state_set_masked(struct irq_desc *desc)#undef __irqd_to_state -static inline void kstat_incr_irqs_this_cpu (struct irq_desc *desc) +static inline void __kstat_incr_irqs_this_cpu (struct irq_desc *desc) {__this_cpu_inc (*desc->kstat_irqs);__this_cpu_inc (kstat.irqs_sum); } +static inline void kstat_incr_irqs_this_cpu (struct irq_desc *desc) +{ +__kstat_incr_irqs_this_cpu (desc); + desc->tot_count++; +} +static inline int irq_desc_get_node (struct irq_desc *desc) {return irq_common_data_get_node (&desc->irq_common_data);
kernel/irq/irqdesc.c +6 -1
@@ -119,6 +119,7 @@ static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node, desc->depth =1 ; desc->irq_count =0 ; desc->irqs_unhandled =0 ; + desc->tot_count =0 ; desc->name =NULL ; desc->owner = owner;for_each_possible_cpu (cpu)
@@ -919,11 +920,15 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)unsigned int kstat_irqs (unsigned int irq) {struct irq_desc *desc =irq_to_desc (irq); -int cpu;unsigned int sum =0 ; +int cpu;if (!desc || !desc->kstat_irqs)return 0 ; +if (!irq_settings_is_per_cpu_devid (desc) && + !irq_settings_is_per_cpu (desc)) +return desc->tot_count; +for_each_possible_cpu (cpu) sum += *per_cpu_ptr (desc->kstat_irqs, cpu);return sum;
PATCH v2 2/2 proc/stat: Make the interrupt statistics more efficient
In reply to Thomas GleixnerWaiman reported that on large systems with a large amount of interrupts the readout of /proc/stat takes a long time to sum up the interrupt statistics. In principle this is not a problem. but for unknown reasons some enterprise quality software reads /proc/stat with a high frequency.
The reason for this is that interrupt statistics are accounted per cpu. So the /proc/stat logic has to sum up the interrupt stats for each interrupt.
The interrupt core provides now a per interrupt summary counter which can be used to avoid the summation loops completely except for interrupts marked PER_CPU which are only a small fraction of the interrupt space if at all.
Another simplification is to iterate only over the active interrupts and skip the potentially large gaps in the interrupt number space and just print zeros for the gaps without going into the interrupt core in the first place.
Waiman provided test results from a 4-socket IvyBridge-EX system (60-core 120-thread, 3016 irqs) excuting a test program which reads /proc/stat 50,000 times:
Before: 18.436s (sys 18.380s)
After: 3.769s (sys 3.742s)
---
v2: Make variables unsigned int. Add results to changelog.
fs/proc/stat.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-)
fs/proc/stat.c +26 -3
@@ -79,6 +79,31 @@ static u64 get_iowait_time(int cpu)#endif +static void show_irq_gap (struct seq_file *p,unsigned int gap) +{ +static const char zeros[] =" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" ; + +while (gap >0 ) { +unsigned int inc; + + inc = min_t(unsigned int, gap, ARRAY_SIZE(zeros) / 2); +seq_write (p, zeros,2 * inc); + gap -= inc; + } +} + +static void show_all_irqs (struct seq_file *p) +{ +unsigned int i, next =0 ; + +for_each_active_irq (i) { +show_irq_gap (p, i - next); +seq_put_decimal_ull (p," " ,kstat_irqs_usr (i)); + next = i +1 ; + } +show_irq_gap (p, nr_irqs - next); +} +static int show_stat (struct seq_file *p,void *v) {int i, j;
@@ -156,9 +181,7 @@ static int show_stat(struct seq_file *p, }seq_put_decimal_ull (p,"intr " , (unsigned long long )sum); -/* sum again ? it could be updated? */ -for_each_irq_nr (j) -seq_put_decimal_ull (p," " ,kstat_irqs_usr (j)); +show_all_irqs (p);seq_printf (p, "\nctxt %llu\n"
Re: [patch V2 2/2] proc/stat: Make the interrupt statistics more efficient
fs/proc/stat.c static int show_stat(struct seq_file *p, · line 184
Quoted 3 lines · Thomas Gleixner
fs/proc/stat.c +1
-2-for_each_irq_nr (j) -seq_put_decimal_ull (p," " ,kstat_irqs_usr (j)); +show_all_irqs (p);
tip-bot for Thomas Gleixner
merge bot[tip:irq/core] proc/stat: Make the interrupt statistics more efficient
In reply to Thomas Gleixnerproc/stat: Make the interrupt statistics more efficient
Commit-ID: c2da3f1b711173b72378258496b49f74db7479de Gitweb: https://git.kernel.org/tip/c2da3f1b711173b72378258496b49f74db7479de Author: Thomas Gleixner <[email protected]> AuthorDate: Fri, 8 Feb 2019 14:48:04 +0100 Committer: Thomas Gleixner <[email protected]> CommitDate: Sun, 10 Feb 2019 21:34:46 +0100
proc/stat: Make the interrupt statistics more efficient
Waiman reported that on large systems with a large amount of interrupts the readout of /proc/stat takes a long time to sum up the interrupt statistics. In principle this is not a problem. but for unknown reasons some enterprise quality software reads /proc/stat with a high frequency.
The reason for this is that interrupt statistics are accounted per cpu. So the /proc/stat logic has to sum up the interrupt stats for each interrupt.
The interrupt core provides now a per interrupt summary counter which can be used to avoid the summation loops completely except for interrupts marked PER_CPU which are only a small fraction of the interrupt space if at all.
Another simplification is to iterate only over the active interrupts and skip the potentially large gaps in the interrupt number space and just print zeros for the gaps without going into the interrupt core in the first place.
Waiman provided test results from a 4-socket IvyBridge-EX system (60-core 120-thread, 3016 irqs) excuting a test program which reads /proc/stat 50,000 times:
Before: 18.436s (sys 18.380s)
After: 3.769s (sys 3.742s)
--- fs/proc/stat.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-)
fs/proc/stat.c +26 -3
@@ -79,6 +79,31 @@ static u64 get_iowait_time(int cpu)#endif +static void show_irq_gap (struct seq_file *p,unsigned int gap) +{ +static const char zeros[] =" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" ; + +while (gap >0 ) { +unsigned int inc; + + inc = min_t(unsigned int, gap, ARRAY_SIZE(zeros) / 2); +seq_write (p, zeros,2 * inc); + gap -= inc; + } +} + +static void show_all_irqs (struct seq_file *p) +{ +unsigned int i, next =0 ; + +for_each_active_irq (i) { +show_irq_gap (p, i - next); +seq_put_decimal_ull (p," " ,kstat_irqs_usr (i)); + next = i +1 ; + } +show_irq_gap (p, nr_irqs - next); +} +static int show_stat (struct seq_file *p,void *v) {int i, j;
@@ -156,9 +181,7 @@ static int show_stat(struct seq_file *p, void *v) }seq_put_decimal_ull (p,"intr " , (unsigned long long )sum); -/* sum again ? it could be updated? */ -for_each_irq_nr (j) -seq_put_decimal_ull (p," " ,kstat_irqs_usr (j)); +show_all_irqs (p);seq_printf (p, "\nctxt %llu\n"
Quoted 19 lines · Thomas Gleixner
Waiman reported that on large systems with a large amount of interrupts the readout of
/proc/stattakes a long time to sum up the interrupt statistics. In principle this is not a problem. but for unknown reasons some enterprise quality software reads/proc/statwith a high frequency.The reason for this is that interrupt statistics are accounted per cpu. So the
/proc/statlogic has to sum up the interrupt stats for each interrupt.The following series addresses this by making the interrupt statitics code in the core generate the sum directly and by making the loop in the
/proc/statread function smarter.V1 -> V2: Address review feedback: undo struct layout changes, make
variables unsigned and add test results to the changelog.Thanks,
tglx
Quoted 8 lines
8<----------------
fs/proc/stat.c | 29 ++++++++++++++++++++++++++--- include/linux/irqdesc.h | 1 + kernel/irq/chip.c | 12 ++++++++++-- kernel/irq/internals.h | 8 +++++++- kernel/irq/irqdesc.c | 7 ++++++- 5 files changed, 50 insertions(+), 7 deletions(-)
Thanks for the patch.
-Longman
Quoted 4 lines · Thomas Gleixner
Waiman reported that on large systems with a large amount of interrupts the readout of
/proc/stattakes a long time to sum up the interrupt statistics. In principle this is not a problem. but for unknown reasons some enterprise quality software reads/proc/statwith a high frequency.
:)
Quoted 15 lines
The reason for this is that interrupt statistics are accounted per cpu. So the
/proc/statlogic has to sum up the interrupt stats for each interrupt.The following series addresses this by making the interrupt statitics code in the core generate the sum directly and by making the loop in the
/proc/statread function smarter.V1 -> V2: Address review feedback: undo struct layout changes, make
variables unsigned and add test results to the changelog.Thanks,
tglx
Quoted 7 lines
8<----------------
fs/proc/stat.c | 29 ++++++++++++++++++++++++++--- include/linux/irqdesc.h | 1 + kernel/irq/chip.c | 12 ++++++++++-- kernel/irq/internals.h | 8 +++++++- kernel/irq/irqdesc.c | 7 ++++++- 5 files changed, 50 insertions(+), 7 deletions(-)
Quoted 19 lines · Thomas Gleixner
Waiman reported that on large systems with a large amount of interrupts the readout of
/proc/stattakes a long time to sum up the interrupt statistics. In principle this is not a problem. but for unknown reasons some enterprise quality software reads/proc/statwith a high frequency.The reason for this is that interrupt statistics are accounted per cpu. So the
/proc/statlogic has to sum up the interrupt stats for each interrupt.The following series addresses this by making the interrupt statitics code in the core generate the sum directly and by making the loop in the
/proc/statread function smarter.V1 -> V2: Address review feedback: undo struct layout changes, make
variables unsigned and add test results to the changelog.Thanks,
tglx
Quoted 8 lines
8<----------------
fs/proc/stat.c | 29 ++++++++++++++++++++++++++--- include/linux/irqdesc.h | 1 + kernel/irq/chip.c | 12 ++++++++++-- kernel/irq/internals.h | 8 +++++++- kernel/irq/irqdesc.c | 7 ++++++- 5 files changed, 50 insertions(+), 7 deletions(-)
Thanks,
M.
Signature · 1 line
Jazz is not dead. It just smells funny...