Soru Linux clock_gettime (CLOCK_MONOTONIC) garip olmayan monotonik davranış


Millet, benim uygulamasında kullanıyorum clock_gettime(CLOCK_MONOTONIC) çerçeveler arasındaki delta süresini ölçmek için (gamedev'de tipik bir yaklaşım) ve zaman zaman garip bir davranışla karşı karşıyayım clock_gettime(..) - iade edilen değerler bazen monotonik değildir (yani önceki zaman) daha büyük şimdiki zamandan).

Şu anda, böyle bir paradoks gerçekleşirse, sadece mevcut çerçeveyi atlayıp bir sonraki işlemeye başlarım.

Soru şu ki bu nasıl mümkün olabilir? Linux POSIX uygulamasında bir hata mı clock_gettime? Ubuntu Server Edition 10.04 (kernel 2.6.32-24, x86_64), gcc-4.4.3 kullanıyorum.


25
2017-09-07 09:11


Menşei


Sanallaştırılmış bir ortamda herhangi bir şansla mı koşuyorsunuz? - caf
Hayır, sanallaştırma dahil değil - pachanga


Cevaplar:


man clock_gettime diyor:

CLOCK_MONOTONIC_RAW (Linux 2.6.28'den beri; Linux'a özel)

CLOCK_MONOTONIC'e benzer, ancak NTP ayarlarına tabi olmayan bir donanım tabanlı zamana erişim sağlar.

Dan beri CLOCK_MONOTONIC_RAW NTP ayarlarının konusu değil, sanırım CLOCK_MONOTONIC olabilirdi.

Redhat Enterprise 5.0 ile 2.6.18 kernel ve bazı özel Itanium işlemci ile benzer problemler yaşadık. Aynı işletim sisteminde başka bir işlemci ile çoğalamadık. RHEL 5.3'te biraz daha yeni çekirdek ve bazı Redhat yamaları ile sabitlenmiştir.


22
2017-09-07 09:23



Bahşiş için teşekkürler. Benim için başka bir ders - asla asla en güvenilir kütüphanelere bile güvenme :) - pachanga
Bir süre için çekirdek saat fonksiyonlarında çalıştım. Onun yolu sözde Çalışmak, MONOTONIC saatinin asla geriye gitmemesidir. Bu tür bir tanım gereğidir. - Edward Falk
Pratikte, MONOTONIC REALTIME'den bir ofset olarak uygulanır. Gerçek zamanlı saat ayarlandığında veya sistem uyurken, bu ofset ayarlanır. Yanlış koşullar altında, ofset yanlış hesaplanabilir ve bu da MONOTONIC saatin bir geriye doğru atlayabilmesiyle sonuçlanabilir. - Edward Falk
OP, hataların ne kadar büyük olduğunu söylemedi, ancak bu benim deneyimim: Çoğu donanımdaki yerleşik gerçek zamanlı saat, en yakın saniyeye yalnızca zaman sağlarken, Linux en yakın mikrosaniye veya nanosaniyeye dahili olarak zaman harcıyor. Linux uyumaya ve uyanmaya başladığında bu sorunları çözmeye çalışır, ancak mantık oldukça sarsılmaz ve ben onu anlamıyorum. NTP ayarlamaları, kullanıcı zaman ayarlamaları ve başka kim bilir, ve kaos için bir reçete var. Alt satır, MONTONIC'in bazen geriye gittiğine gerçekten şaşırmadım. - Edward Falk
CLOCK_MONOTONIC, geriye (veya ileriye) atlamak zorunda değildir; eğer yaparsa, bu bir hatadır. CLOCK_MONOTONIC_RAW değilken, NTP daemon tarafından ince ayarlara (milyonda 500 parçaya benziyor) tabidir. Benim anlayışım, "ham" monotonik saatin% 100 doğru olmayabileceğidir, bu yüzden NTP arka planı onu hızlandırabilir ya da zamanın gerçek geçişiyle eşleşmesi için yavaş yavaş hızlandırabilir. Saniyede N kez şeyler yapmak istiyorsanız, ham olmayan saat muhtemelen daha doğrudur. - fadden


Bir örneği gibi görünüyor

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

Görmek İşte bir yama için. Bu 2.6.32.19'a dahil edildi, ancak Debian ekibi (?) Tarafından geri alınmamış olabilir. Kontrol etmelisin.


21
2017-09-07 09:29





Deneyin CLOCK_MONOTONIC_RAW.


6
2017-09-07 09:15





Elbette bana bir böcek gibi geliyor. Belki de bunu rapor etmelisiniz Ubuntu'nun hata izleyicisi.


4
2017-09-07 09:16



Hata izleyicileri iyi ve hatalar gönderiyorlar (herkesin yapması gereken), ancak bunlar popüler değil çünkü programcılar ŞİMDİ düzeltmeleri istiyor. Genel olarak, bir projenin çoğunu kodlamayı bitirdikten sonra, akış yukarı hatalar sabitlenmez ve yine de uzun zamandır üst akıştaki lib'leri yükseltmeyen kişileri desteklemeniz gerekir. :( - Matt Joiner
Çok üzgün, çok doğru ... - pachanga


Bu bir linux hatası. Monotonik bir saatte hiçbir atama, geri gitmesini sağlayabilir. Çok eski bir çekirdek ve çok eski bir dağıtım kullanıyorsunuz.

Düzenleme: Çerçeveyi atlamanız gerektiğinden emin misiniz? Saat_gettime'ı tekrar ararsanız, ne olur?


-1
2018-03-16 15:24