Bug 228669

Summary: CLOCK_PROCESS_CPUTIME_ID is unnecessarily inaccurate
Product: Base System Reporter: Colin Percival <cperciva>
Component: kernAssignee: freebsd-bugs (Nobody) <bugs>
Status: Closed FIXED    
Severity: Affects Only Me    
Priority: ---    
Version: CURRENT   
Hardware: Any   
OS: Any   
Attachments:
Description Flags
Proposed fix
none
Revised based on feedback from kib
none
Revised based on feedback from kib (2nd try to attach this...) none

Description Colin Percival freebsd_committer freebsd_triage 2018-06-02 06:21:43 UTC
clock_gettime(CLOCK_PROCESS_CPUTIME_ID) is far less accurate than clock_gettime(CLOCK_PROF), even though it seems that they should theoretically measure the same thing:

     CLOCK_PROF
             Increments when the CPU is running in user or kernel mode.
     CLOCK_PROCESS_CPUTIME_ID
             Returns the execution time of the calling process.

It looks like this is due to CLOCK_PROF (aka. calcru) adding time from the current time slice, while CLOCK_PROCESS_CPUTIME_ID (aka. get_process_cputime aka rufetch) does not.

Since CLOCK_PROCESS_CPUTIME_ID is the version mandated by POSIX, it would be nice if it were at least as accurate as the historical BSD profiling clock ID.
Comment 1 Colin Percival freebsd_committer freebsd_triage 2018-06-22 09:33:28 UTC
Created attachment 194476 [details]
Proposed fix

This patch adds the used portion of the current thread's time slice, if the current thread belongs to the process for which the cputime clock is being measured.
Comment 2 Colin Percival freebsd_committer freebsd_triage 2018-06-22 10:00:18 UTC
Created attachment 194477 [details]
Revised based on feedback from kib
Comment 3 Colin Percival freebsd_committer freebsd_triage 2018-06-22 10:02:24 UTC
That was weird, let's try uploading the revised patch again...
Comment 4 Colin Percival freebsd_committer freebsd_triage 2018-06-22 10:02:25 UTC
That was weird, let's try uploading the revised patch again...
Comment 5 Colin Percival freebsd_committer freebsd_triage 2018-06-22 10:03:44 UTC
Created attachment 194478 [details]
Revised based on feedback from kib (2nd try to attach this...)
Comment 6 commit-hook freebsd_committer freebsd_triage 2018-06-22 10:23:46 UTC
A commit references this bug:

Author: cperciva
Date: Fri Jun 22 10:23:32 UTC 2018
New revision: 335553
URL: https://svnweb.freebsd.org/changeset/base/335553

Log:
  Improve the accuracy of the POSIX "process CPU-time" clocks by adding the
  used portion of the current thread's time slice if the current thread
  belongs to the process being queried (i.e., if clock_gettime is invoked
  with a clock ID of CLOCK_PROCESS_CPUTIME_ID or the value provided by
  passing getpid(2) to clock_getcpuclockid(3)).

  The CLOCK_VIRTUAL and CLOCK_PROF timers already make this adjustment via
  long-standing code in calcru(), but since those timers are not specified
  by POSIX it seems useful to add it here so that the higher accuracy is
  available to code which aims to be portable.

  PR:		228669
  Reported by:	Graham Percival
  Reviewed by:	kib
  MFC after:	1 week

Changes:
  head/sys/kern/kern_time.c