On 12/01/2016, Erwan Velu wrote: > Hi folks, Hello! > When reading the code I noticed that ceph_clock_now() is mostly used to compute a local difference of time. > I do see you are using "clock_gettime(CLOCK_REALTIME, &tp)" but was wondering if CLOCK_MONOTONIC_RAW isn't more accurate. > > I mean if the local system time is readujsted by NTP (or similar) some computation could be wrong leading to some possible mis-interpretation or wrong scheduling. I have done some work starting in that direction currently in master. In common/ceph_time.h I define coarse and fine versions of the real clock and monotonic clock and I've switched the osdc subsystem over to use them. We use the std::chrono C++ time library, but we define our own clocks (so we can pick the right one for performance/resolution tradeoffs) and an in-memory timespan representation (so not every function taking a duration has to be a template.) The real_clock and mono_clock classes correspond to CLOCK_REALTIME and CLOCK_MONOTONIC, and coarse_real_clock and coarse_mono_clock correspond to CLOCK_REALTIME_COARSE and CLOCK_MONOTONIC_COARSE. If you require millisecond resolution but nothing finer, you should prefer the coarse variants. The std::chrono library lets us integrate with other C++ libraries (and use the standard concurrency features) and has the advantage of stronger typing; we can't use a duration where a time point is required or subtract a monotonic time point from a real time point. As I understand it, CLOCK_MONOTONIC_RAW is generally the wrong choice. The raw hardware clock is prone to drift, and NTP synchronization (or other corrective) makes the elapsed time measurements more accurate. However, I am not a Time Lord. If someone knows better, please correct me here. One concern with monotonic clocks, even for elapsed time, is that their epoch is unspecified. You cannot send a monotonic time over the network to another machine nor can you save it to a file and re-read it later. Anything to be serialized must be a real time. This is unfortunate. If I were a Time Lord I'd travel back in time and make the POSIX committee adopt CLOCK_UTC and CLOCK_TAI so we could have serializable monotonic time values. > I could work on a PR is you find this interesting. I find it interesting. If you want to change more subsystems to use ceph_time and use monotonic and coarse clocks in appropriate places I think that would be wonderful. It might be worthwhile to focus on the places where we use double to represent a time value. Please read through ceph_time.h and osdc to get a feel for it. If you think it could use improvement, I'd be happy to hear your ideas. Thank you. -- Senior Software Engineer Red Hat Storage, Ann Arbor, MI, US IRC: Aemerson@{RedHat, OFTC, Freenode} 0x80F7544B90EDBFB9 E707 86BA 0C1B 62CC 152C 7C12 80F7 544B 90ED BFB9
Attachment:
signature.asc
Description: PGP signature