| Summary: | CLOCK_PROCESS_CPUTIME_ID is unnecessarily inaccurate | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Product: | Base System | Reporter: | Colin Percival <cperciva> | ||||||||
| Component: | kern | Assignee: | freebsd-bugs (Nobody) <bugs> | ||||||||
| Status: | Closed FIXED | ||||||||||
| Severity: | Affects Only Me | ||||||||||
| Priority: | --- | ||||||||||
| Version: | CURRENT | ||||||||||
| Hardware: | Any | ||||||||||
| OS: | Any | ||||||||||
| Attachments: |
|
||||||||||
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.
Created attachment 194477 [details]
Revised based on feedback from kib
That was weird, let's try uploading the revised patch again... That was weird, let's try uploading the revised patch again... Created attachment 194478 [details]
Revised based on feedback from kib (2nd try to attach this...)
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 |
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.