Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 Oct 2005 16:47:29 +0200
From:      "Poul-Henning Kamp" <phk@phk.freebsd.dk>
To:        Bruce Evans <bde@zeta.org.au>
Cc:        cvs-src@FreeBSD.org, src-committers@FreeBSD.org, Andre Oppermann <andre@FreeBSD.org>, cvs-all@FreeBSD.org
Subject:   Re: Timekeeping [Was: Re: cvs commit: src/usr.bin/vmstat vmstat.c src/usr.bin/w w.c] 
Message-ID:  <30613.1129906049@critter.freebsd.dk>
In-Reply-To: Your message of "Sat, 22 Oct 2005 00:23:03 %2B1000." <20051021230751.Q5110@delplex.bde.org> 

next in thread | previous in thread | raw e-mail | index | archive | help
In message <20051021230751.Q5110@delplex.bde.org>, Bruce Evans writes:
>On Thu, 20 Oct 2005, Poul-Henning Kamp wrote:

>> ...
>> If people do stupid things like use hard steps (*settime*()) to
>> correct rate problems, then they get what they deserve, including
>> potentially backwards jumps in time, but the integral over time of
>> all steps apart from the first one amounts to a rate correction.
>
>Using *settime*() isn't stupid.

Using it more than once per boot is stupid, and abundantly makes
it clear that precise timekeeping is not what you are attempting.

>> In summary:  CLOCK_MONOTONIC is our best estimate of how many SI
>> seconds the system have been runing [3].
>
>Actual testing shows that CLOCK_MONOTONIC, or possibly CLOCK_REALTIME
>less the boot time, gives a very bad estimate of how long the system has
>been running.  The difference between these clocks was about 500 seconds
>on all systems tested:
>
>% sledge:
>%  1:03PM  up 22:45, 1 user, load averages: 0.23, 0.08, 0.02
>% uptime 1 81900
>% uptime 2 82887

Works fine for me:

	sledge phk> cat > a.c
	#include <stdio.h>
	#include <sys/time.h>
	
	int
	main(int argc __unused, char **argv __unused)
	{
		struct timeval boottime;
		struct timespec up, utc;
		size_t s;

		s = sizeof boottime;
		sysctlbyname("kern.boottime", &boottime, &s, NULL, 0);
		printf("Boottime\t%ld.%06d\n",
		    boottime.tv_sec, boottime.tv_usec);
		clock_gettime(CLOCK_MONOTONIC, &up);
		printf("Uptime\t\t%ld.%09d\n", up.tv_sec, up.tv_nsec);
		clock_gettime(CLOCK_REALTIME, &utc);
		printf("UTC\t\t%ld.%09d\n", utc.tv_sec, utc.tv_nsec);
		return(0);
	}
	^D
	sledge phk> make a
	cc -O2 -fno-strict-aliasing -pipe   a.c  -o a
	sledge phk> ./a
	Boottime        1129904420.816916
	Uptime          1317.689747507
	UTC             1129905738.506671500
	sledge phk> bc
	[...]
	1129904420.816916+1317.689747507
	1129905738.506663507

Mind you, there is no way the above cannot work because that is how
the math in the kernel works.

>Not given, and not true.  After syncing with an accurate external clock
>by a step, we know the real time very accurately.  Normally we sync
>soon after booting.  Then we know the boot time very accurately (it
>is the current real time less CLOCK_MONOTONIC).  Then if we resync
>with the external clock later using a step, we again know the real
>time very accurately, [...]

But have resigned ourselves to not caring about the actual length
of seconds and therefore, presumably, having no serious interest
in timekeeping quality.

-- 
Poul-Henning Kamp       | UNIX since Zilog Zeus 3.20
phk@FreeBSD.ORG         | TCP/IP since RFC 956
FreeBSD committer       | BSD since 4.3-tahoe    
Never attribute to malice what can adequately be explained by incompetence.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?30613.1129906049>