public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Dynamic ticks make system jerking
@ 2007-06-26 15:00 Uwe Kleine-König
  2007-06-26 15:45 ` Thomas Gleixner
  0 siblings, 1 reply; 5+ messages in thread
From: Uwe Kleine-König @ 2007-06-26 15:00 UTC (permalink / raw)
  To: linux-kernel; +Cc: Ingo Molnar, Thomas Gleixner

Hello,

I implemented GENERIC_TIME and GENERIC_CLOCKEVENTS for
arch-arm/mach-ns9xxx (patches available at

	http://www.modarm9.com/git?p=people/ukleinek/linux-2.6.git;a=shortlog;h=clock

or

	git://www.modarm9.com/gitsrc/pub/people/ukleinek/linux-2.6.git

in the clock branch

). 

If I enable NO_HZ, the system jerks (I hope this is an understandable
term ...).   E.g. 

	# time find /sys
	...
	real    1m 19.52s
	user    0m 0.18s
	sys     0m 0.15s

on a freshly booted machine.  The output comes in several hunks with
pausing between them.  With no_hz=off, I get approx. the same.

If I have NO_HZ disabled however, I get

	# time find /sys
	...
	real    0m 1.53s
	user    0m 0.15s
	sys     0m 0.18s

Another thing is, if I press Enter once, the next prompt appears in a
reasonable time.  If I press twice in a row the 2nd prompt needs
perceptible longer.

Does someone have a hint for me how to debug (or even solve) this problem?

First I wondered why set_next_event is called twice between two timer
interrupts most of the time.  I found out that the timer is programed
for the next tick in any case and if nothing needs the next tick, the
interval is enlarged.  I didn't spend time yet to check if it is
easier/faster to only program the timer once.

Best regards
Uwe

Some addional data:

- ns9xxx_cpuclock() returns 176947200 = 0xa8c0000 for that machine.

- SYS_TR is a read-only register indicating the current timer value.

- SYS_TRC is the start value (and the reload value for auto-reloading
  timers)

- My console is an 8250 clone.

- /proc/timer_list 
	Timer List Version: v0.3
	HRTIMER_MAX_CLOCK_BASES: 2
	now at 15091350847 nsecs

	cpu: 0
	 clock 0:
	  .index:      0
	  .resolution: 1 nsecs
	  .get_time:   ktime_get_real
	  .offset:     0 nsecs
	active timers:
	 clock 1:
	  .index:      1
	  .resolution: 1 nsecs
	  .get_time:   ktime_get
	  .offset:     0 nsecs
	active timers:
	 #0: <c02e5ea0>, tick_sched_timer, S:01
	 # expires at 15100000000 nsecs [in 8649153 nsecs]
	  .expires_next   : 15100000000 nsecs
	  .hres_active    : 1
	  .nr_events      : 424
	  .nohz_mode      : 2
	  .idle_tick      : 14320000000 nsecs
	  .tick_stopped   : 0
	  .idle_jiffies   : 4294938728
	  .idle_calls     : 104
	  .idle_sleeps    : 88
	  .idle_entrytime : 15052376577 nsecs
	  .idle_sleeptime : 10627230732 nsecs
	  .last_jiffies   : 4294938801
	  .next_jiffies   : 4294938802
	  .idle_expires   : 15060000000 nsecs
	jiffies: 4294938805


	Tick Device: mode:     1
	Clock Event Device: ns9xxx-timer2
	 max_delta_ns:   2147483647
	 min_delta_ns:   1000
	 mult:           185542
	 shift:          20
	 mode:           3
	 next_event:     15100000000 nsecs
	 set_next_event: ns9xxx_clockevent_setnextevent
	 set_mode:       ns9xxx_clockevent_setmode
	 event_handler:  hrtimer_interrupt

-- 
Uwe Kleine-König

http://www.google.com/search?q=e+%5E+%28i+pi%29

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Dynamic ticks make system jerking
  2007-06-26 15:00 Dynamic ticks make system jerking Uwe Kleine-König
@ 2007-06-26 15:45 ` Thomas Gleixner
  2007-06-27 16:35   ` Uwe Kleine-Koenig
  0 siblings, 1 reply; 5+ messages in thread
From: Thomas Gleixner @ 2007-06-26 15:45 UTC (permalink / raw)
  To: Uwe Kleine-König; +Cc: linux-kernel, Ingo Molnar

On Tue, 2007-06-26 at 17:00 +0200, Uwe Kleine-König wrote:
> If I enable NO_HZ, the system jerks (I hope this is an understandable
> term ...).   E.g. 
> 
> 	# time find /sys
> 	...
> 	real    1m 19.52s
> 	user    0m 0.18s
> 	sys     0m 0.15s
> 
> on a freshly booted machine.  The output comes in several hunks with
> pausing between them.  With no_hz=off, I get approx. the same.

it's nohz=off not no_hz=off

> If I have NO_HZ disabled however, I get
> 
> 	# time find /sys
> 	...
> 	real    0m 1.53s
> 	user    0m 0.15s
> 	sys     0m 0.18s

Well, you run in periodic mode then.

> Another thing is, if I press Enter once, the next prompt appears in a
> reasonable time.  If I press twice in a row the 2nd prompt needs
> perceptible longer.
> 
> Does someone have a hint for me how to debug (or even solve) this problem?
> 
> First I wondered why set_next_event is called twice between two timer
> interrupts most of the time.  I found out that the timer is programed
> for the next tick in any case and if nothing needs the next tick, the
> interval is enlarged.  I didn't spend time yet to check if it is
> easier/faster to only program the timer once.

We optimize for the non-idle path, i.e. we keep the timer running as
long as we are not idle. Once we go idle we reprogram it.

I looked at the patch and as far as I can understand it, there is
nothing obviously wrong about it.

One remark: why did you expand the clocksource to be 64 bit? The generic
code handles the 32 bit wrap already, so the expansion in your read
routine is adding overhead. The counter will wrap every 24 seconds, so
there is nothing to worry about.

The behavior you are describing is might be related to some problem with
the clocksource readout, as the reprogramming values are calculated from
there. 

	tglx





^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Dynamic ticks make system jerking
  2007-06-26 15:45 ` Thomas Gleixner
@ 2007-06-27 16:35   ` Uwe Kleine-Koenig
  2007-06-29 22:33     ` Uwe Kleine-König
  0 siblings, 1 reply; 5+ messages in thread
From: Uwe Kleine-Koenig @ 2007-06-27 16:35 UTC (permalink / raw)
  To: Thomas Gleixner; +Cc: linux-kernel, Ingo Molnar

Hello,

Thomas Gleixner wrote:
> On Tue, 2007-06-26 at 17:00 +0200, Uwe Kleine-K??nig wrote:
> > If I enable NO_HZ, the system jerks (I hope this is an understandable
> > term ...).   E.g. 
> > 
> > 	# time find /sys
> > 	...
> > 	real    1m 19.52s
> > 	user    0m 0.18s
> > 	sys     0m 0.15s
> > 
> > on a freshly booted machine.  The output comes in several hunks with
> > pausing between them.  With no_hz=off, I get approx. the same.
> 
> it's nohz=off not no_hz=off
Currently I'm not sure, which I was really using.  I think it was the
right one, because dmesg changed.  But anyhow, I will retest if I made
it wrong.
 
> > First I wondered why set_next_event is called twice between two timer
> > interrupts most of the time.  I found out that the timer is programed
> > for the next tick in any case and if nothing needs the next tick, the
> > interval is enlarged.  I didn't spend time yet to check if it is
> > easier/faster to only program the timer once.
> 
> We optimize for the non-idle path, i.e. we keep the timer running as
> long as we are not idle. Once we go idle we reprogram it.
OK, sounds sane.
 
> I looked at the patch and as far as I can understand it, there is
> nothing obviously wrong about it.
What a pity.

> One remark: why did you expand the clocksource to be 64 bit? The generic
> code handles the 32 bit wrap already, so the expansion in your read
> routine is adding overhead. The counter will wrap every 24 seconds, so
> there is nothing to worry about.
OK, I thought it to be better to have 64bit + some overhead.  I will
change that.
 
> The behavior you are describing is might be related to some problem with
> the clocksource readout, as the reprogramming values are calculated from
> there. 
Any hints how I can debug that?

Currently I cannot retest, but I will dig into it again and rereport.

Thanks for your answer.

Best regards
Uwe

-- 
Uwe Kleine-Koenig

http://www.google.com/search?q=speed+of+light%3D

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Dynamic ticks make system jerking
  2007-06-27 16:35   ` Uwe Kleine-Koenig
@ 2007-06-29 22:33     ` Uwe Kleine-König
  2007-06-30 19:08       ` Ingo Molnar
  0 siblings, 1 reply; 5+ messages in thread
From: Uwe Kleine-König @ 2007-06-29 22:33 UTC (permalink / raw)
  To: Thomas Gleixner; +Cc: linux-kernel, Ingo Molnar

Hello,

Uwe Kleine-König wrote:
> > it's nohz=off not no_hz=off
> Currently I'm not sure, which I was really using.  I think it was the
> right one, because dmesg changed.  But anyhow, I will retest if I made
> it wrong.
OK, I was really using no_hz, and with nohz I got approx the same result
as with CONFIG_NO_HZ=n.  Uups.

> > > First I wondered why set_next_event is called twice between two timer
> > > interrupts most of the time.  I found out that the timer is programed
> > > for the next tick in any case and if nothing needs the next tick, the
> > > interval is enlarged.  I didn't spend time yet to check if it is
> > > easier/faster to only program the timer once.
> > 
> > We optimize for the non-idle path, i.e. we keep the timer running as
> > long as we are not idle. Once we go idle we reprogram it.
> OK, sounds sane.
Probably you understand that better, but your argument only convinced me
for a short time.  Is it really better to program at least once and in
the idle case a 2nd time instead of only once every time.  Moreover
if you program the timer late you can notice if the time to tick is
already over because the timer irq handling took to long (or CONFIG_HZ
is too large).

> > I looked at the patch and as far as I can understand it, there is
> > nothing obviously wrong about it.
> What a pity.
I found the problem, it had only indirectly to do with nohz.  I didn't
acknowledge the serial interrupt but as the timer and the serial need
the same acknowledgement the serial irq got his ack always when the
timer triggerd.  Up to now that delay didn't stick out as the delay was
< 10ms.

> > One remark: why did you expand the clocksource to be 64 bit? The generic
> > code handles the 32 bit wrap already, so the expansion in your read
> > routine is adding overhead. The counter will wrap every 24 seconds, so
> > there is nothing to worry about.
> OK, I thought it to be better to have 64bit + some overhead.  I will
> change that.
done.  (But I reserve the right to evaluate the 64bit case and check how
worse the overhead is :-)

Best regards
Uwe

-- 
Uwe Kleine-König

http://www.google.com/search?q=sin%28pi%2F2%29

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Dynamic ticks make system jerking
  2007-06-29 22:33     ` Uwe Kleine-König
@ 2007-06-30 19:08       ` Ingo Molnar
  0 siblings, 0 replies; 5+ messages in thread
From: Ingo Molnar @ 2007-06-30 19:08 UTC (permalink / raw)
  To: Uwe Kleine-König, Thomas Gleixner, linux-kernel


* Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de> wrote:

> I found the problem, it had only indirectly to do with nohz.  I didn't 
> acknowledge the serial interrupt but as the timer and the serial need 
> the same acknowledgement the serial irq got his ack always when the 
> timer triggerd.  Up to now that delay didn't stick out as the delay 
> was < 10ms.

yeah, that makes sense. Now you've probably got a better serial driver 
as a side-effect :-)

	Ingo

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2007-06-30 19:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-06-26 15:00 Dynamic ticks make system jerking Uwe Kleine-König
2007-06-26 15:45 ` Thomas Gleixner
2007-06-27 16:35   ` Uwe Kleine-Koenig
2007-06-29 22:33     ` Uwe Kleine-König
2007-06-30 19:08       ` Ingo Molnar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox