Linux clock_gettime (CLOCK_MONOTONIC) странное немонотонное поведение
В моем приложении я использую clock_gettime(CLOCK_MONOTONIC)
для измерения дельта-времени между кадрами (типичный подход в гамедеве), и время от времени я сталкиваюсь с странным поведением clock_gettime(..)
- возвращаемых значений иногда не монотонны (т.е. время больше, чем текущее время).
В настоящее время, если такой парадокс случается, я просто пропускаю текущий кадр и начинаю обрабатывать следующий.
Вопрос в том, как это вообще возможно? Является ли это ошибкой в реализации Linux POSIX clock_gettime
? Я использую Ubuntu Server Edition 10.04 (ядро 2.6.32-24, x86_64), gcc-4.4.3.
Ответы
Ответ 1
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.
Ответ 2
Похож на экземпляр
commit 0696b711e4be45fa104c12329f617beb29c03f78
Author: Lin Ming <[email protected]>
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 (?). Вы должны проверить это.
Ответ 3
Попробуйте CLOCK_MONOTONIC_RAW
.
Ответ 4
Конечно, звучит как ошибка. Возможно, вы должны сообщить об этом в Ubuntu bug tracker.
Ответ 5
Это ошибка Linux. Никакая настройка в монотонных часах не заставит ее вернуться назад. Вы используете очень старое ядро и очень старый дистрибутив.
Изменить: вы уверены, что вам нужно пропустить рамку? Если вы снова вызове clock_gettime, что произойдет?