Linux clock_gettime (CLOCK_MONOTONIC) странное немонотонное поведение - PullRequest
27 голосов
/ 07 сентября 2010

Люди, в моем приложении я использую clock_gettime(CLOCK_MONOTONIC) для измерения времени разницы между кадрами (типичный подход в gamedev), и время от времени я сталкиваюсь со странным поведением clock_gettime(..) - возвращаемых значенийиногда не монотонны (т. е. прежнее время больше текущего времени).

В настоящее время, если такой парадокс возникает, я просто пропускаю текущий кадр и начинаю обработку следующего.

Вопрос в том, как это вообще возможно?Это ошибка в реализации Linux POSIX clock_gettime?Я использую Ubuntu Server Edition 10.04 (ядро 2.6.32-24, x86_64), gcc-4.4.3.

Ответы [ 5 ]

22 голосов
/ 07 сентября 2010

man clock_gettime говорит:

CLOCK_MONOTONIC_RAW (начиная с Linux 2.6.28; для Linux)

Аналогично CLOCK_MONOTONIC, но обеспечивает доступНеобработанное аппаратное время, которое не подлежит настройкам NTP.

Поскольку CLOCK_MONOTONIC_RAW не подлежит настройкам NTP, я думаю, CLOCK_MONOTONIC может быть.

У нас были аналогичныепроблемы с Redhat Enterprise 5.0 с ядром 2.6.18 и некоторым конкретным процессором Itanium.Мы не могли воспроизвести его с другим процессором в той же ОС.Это было исправлено в RHEL 5.3 с немного более новым ядром и некоторыми исправлениями Redhat.

21 голосов
/ 07 сентября 2010

выглядит как экземпляр

commit 0696b711e4be45fa104c12329f617beb29c03f78
Author: Lin Ming <ming.m.lin@intel.com>
Date:   Tue Nov 17 13:49:50 2009 +0800

timekeeping: Fix clock_gettime vsyscall time warp

Since commit 0a544198 "timekeeping: Move NTP adjusted clock
multiplier to struct timekeeper" the clock multiplier of vsyscall is updated with
the unmodified clock multiplier of the clock source and not with the
NTP adjusted multiplier of the timekeeper.

This causes user space observerable time warps:
new CLOCK-warp maximum: 120 nsecs,  00000025c337c537 -> 00000025c337c4bf

См. здесь для патча. Это включено в 2.6.32.19, но, возможно, не было перенесено командой Debian (?) Вы должны проверить это.

6 голосов
/ 07 сентября 2010

Попробуйте CLOCK_MONOTONIC_RAW.

4 голосов
/ 07 сентября 2010

Конечно, звучит как ошибка для меня. Возможно, вы должны сообщить об этом в Баг-трекер Ubuntu .

0 голосов
/ 16 марта 2013

Это ошибка Linux. Никакая регулировка в монотонных часах не может заставить их вернуться назад. Вы используете очень старое ядро ​​и очень старый дистрибутив.

Редактировать: вы уверены, что вам нужно пропустить кадр? Если вы снова вызовете clock_gettime, что произойдет?

...