[concurrency-interest] tsc register

David Holmes davidcholmes at aapt.net.au
Thu Jan 12 16:39:26 EST 2012


Mohan Radhakrishnan writes:
> This CR http://cr.openjdk.java.net/~johnc/7117303/webrev.0/ is 
> quite recent.

Yes but I don't see the relevance. As it says there the VM code was assuming a monotonic time source but was using os::javaTimeMillis which is most definitely not monotonic.

David
-----
 
> Mohan
> 
> On Thu, Jan 12, 2012 at 10:28 AM, David Holmes 
> <davidcholmes at aapt.net.au> wrote:
> > Hotspot uses the available OS high-resolution nominally monotonic time
> > source if it exists, else it falls back to a time-of-day source 
> (which is
> > not monotonic). It should be very rare (ie only really old 
> systems) to not
> > have a monotonic timesource available.
> >
> > Solaris had a number of bugs in this area (because unlike the other OSes
> > that dropped use of the TSC due to its instability, Solaris 
> decided to force
> > it to be stable and synchronized - and occasionally they 
> failed) and so a
> > guard was added to ensure it was actually monotonic.
> >
> > On Windows if the TSC is being used without using the external
> > utilities/drivers to sync it then QueryPerformanceCounter can be
> > non-monotonic. Similarly on Linux if you set your clocksource to be TSC
> > instead of HPET (and the TSC is not synchronized) then 
> CLOCK_MONOTONIC can
> > also exhibit non-monotonic behaviour.
> >
> > See bug 6458294 for some info. Sadly, back in November 2006 I 
> reported that
> > we would add the guard logic on all platforms, but it never happened.
> >
> > All-in-all clocks/counters/timers are a general mess.
> >
> > David
> >
> > -----Original Message-----
> > From: concurrency-interest-bounces at cs.oswego.edu
> > [mailto:concurrency-interest-bounces at cs.oswego.edu]On Behalf Of 
> Dr Heinz M.
> > Kabutz
> > Sent: Wednesday, 11 January 2012 8:33 AM
> > To: dholmes at ieee.org
> > Cc: Concurrency-interest at cs.oswego.edu
> > Subject: Re: [concurrency-interest] tsc register
> >
> > What is interesting is that we have had reports of System.nanoTime()
> > sometimes counting backwards.  Has nanoTime() always been 
> monotonic?  If so,
> > I need to follow up on the claims.  I've heard it from two 
> sources, but it
> > might just be hearsay.
> >
> > Regards
> >
> > Heinz
> > --
> > Dr Heinz M. Kabutz (PhD CompSci)
> > Author of "The Java(tm) Specialists' Newsletter"
> > Sun Java Champion
> > IEEE Certified Software Development Professional
> > http://www.javaspecialists.eu
> > Tel: +30 69 72 850 460
> > Skype: kabutz
> >
> >
> >
> > On 1/11/12 12:14 AM, David Holmes wrote:
> >
> > Correct. Hotspot uses/relies-on the high-resolution monotonic 
> time source of
> > the OS, else falls back to plain time-of-day. It never uses the TSC
> > directly.
> >
> > David Holmes
> >
> > -----Original Message-----
> > From: concurrency-interest-bounces at cs.oswego.edu
> > [mailto:concurrency-interest-bounces at cs.oswego.edu]On Behalf Of Vitaly
> > Davidovich
> > Sent: Wednesday, 11 January 2012 2:28 AM
> > To: Nathan Reynolds
> > Cc: Concurrency-interest at cs.oswego.edu
> > Subject: Re: [concurrency-interest] tsc register
> >
> > I thought JVM (hotspot at least) uses the os monotonic clock source (if
> > present) rather than reading tsc directly and then doing its own
> > adjustments?
> >
> > On Jan 10, 2012 11:24 AM, "Nathan Reynolds" <nathan.reynolds at oracle.com>
> > wrote:
> >>
> >> The tsc register on older processors did not increment at the 
> same rate.
> >> If a core slept or slowed down then the tsc register would 
> stop or slow down
> >> its increments.  More modern processors guarantee that tsc register
> >> increments at a fixed frequency.  If you are working on Linux, 
> cpuinfo (?)
> >> could report the const_tsc flag.  This means that the processor and OS
> >> recognize that this feature is on the processor.
> >>
> >> The tsc register is not synchronized across sockets.  This is something
> >> Oracle has asked Intel to enhance many times.  It is a very difficult
> >> problem to solve.  However, more modern Linux kernels will (?) 
> synchronize
> >> the tsc register at startup so that it is impossible to read the tsc
> >> register on two different cores and see that the 2ⁿᵈ value is 
> smaller.  This
> >> does not mean that the tsc register is synchronized.  It only 
> means that two
> >> threads running on different cores will hopefully never see 
> the tsc "move
> >> backwards".
> >>
> >> There is no guarantee that once the tsc register is synchronized across
> >> sockets that it will remain so.  Some processors are hot 
> swappable.  The
> >> newly added processor is not going to have the correct tsc 
> register value.
> >> Furthermore, the OS is free to reset the tsc value at any time.
> >>
> >> If I understand correctly, the HotSpot JVM will guarantee that
> >> System.nanoTime() never moves backwards.  It reads the tsc 
> register with
> >> each call (?).  It the compares the read value with the last 
> read value.  If
> >> the read value is < the last read value, then the last read value is
> >> returned.  If the read value is > the last read value, then 
> the last read
> >> value is updated and the read value is returned.  Updating the 
> last read
> >> value requires a CAS.  This CAS can lead to scalability bottlenecks if
> >> System.nanoTime() is called too frequently.  I am not sure if a better
> >> algorithm has been devised to fix this CAS contention.  I kind 
> of remember
> >> it being talked about.
> >>
> >> I think the JVMs will default to more stable clock sources with worse
> >> resolution for nanoTime() if tsc is not behaving well.
> >>
> >> Nathan Reynolds | Consulting Member of Technical Staff | 602.333.9091
> >> Oracle PSR Engineering | Server Technology
> >>
> >> On 1/10/2012 5:03 AM, Dr Heinz M. Kabutz wrote:
> >>
> >> Only if you use System.nanoTime().  Time difference might even be
> >> negative if the thread is swapped between different cores.
> >>
> >> On 10/01/2012, Mohan Radhakrishnan 
> <radhakrishnan.mohan at gmail.com> wrote:
> >>
> >>
> >> Hi,
> >>
> >> One more question from the novice and for the novice.
> >>
> >> I see these points in Dr. click's PPT. Can I know why ? I ask this
> >> here because it seems to
> >> involve multiple cores. Maybe the jvm forums are better suited 
> for this.
> >> Does this mean that we get wrong time values if threads run on
> >> different cores ?
> >>
> >> But cannot use, e.g. X86's "tsc" register
> >> ? Value not coherent across CPUs
> >> ? Not consistent, e.g. slow ticking in low-power mode
> >> ? Monotonic per CPU – but not per-thread
> >>
> >> Thanks,
> >> Mohan
> >>
> >> _______________________________________________
> >> Concurrency-interest mailing list
> >> Concurrency-interest at cs.oswego.edu
> >> http://cs.oswego.edu/mailman/listinfo/concurrency-interest
> >>
> >>
> >>
> >>
> >> _______________________________________________
> >> Concurrency-interest mailing list
> >> Concurrency-interest at cs.oswego.edu
> >> http://cs.oswego.edu/mailman/listinfo/concurrency-interest
> >>
> > ________________________________
> > _______________________________________________
> > Concurrency-interest mailing list
> > Concurrency-interest at cs.oswego.edu
> > http://cs.oswego.edu/mailman/listinfo/concurrency-interest
> >
> >
> >
> > _______________________________________________
> > Concurrency-interest mailing list
> > Concurrency-interest at cs.oswego.edu
> > http://cs.oswego.edu/mailman/listinfo/concurrency-interest
> >
> 
> _______________________________________________
> Concurrency-interest mailing list
> Concurrency-interest at cs.oswego.edu
> http://cs.oswego.edu/mailman/listinfo/concurrency-interest
> 




More information about the Concurrency-interest mailing list