Проблема понимания clock_gettime

#linux #time #clock #system-calls

#linux #время #часы #системные вызовы

Вопрос:

У меня возникли трудности с различными часами, к которым может быть получен доступ clock_gettime . Особенно меня интересует:

  • CLOCK_REALTIME
  • CLOCK_PROCESS_CPUTIME_ID
  • CLOCK_THREAD_COUTIME_ID

Я прочитал manpage, но это мне не очень помогло. Я использую clock_gettime для генерации временных меток для моего профилировщика, когда он отправляет собранные данные через сокет. Я заметил следующие различия:

  • CLOCK_REALTIME

События, которые я получаю от моего профилировщика с помощью этих часов, иногда располагаются в неправильном порядке. Временные метки начинаются с более высокого значения, хотя и не намного выше. Часто первыми появляются последние сообщения (с более высокой временной меткой), а позже временные метки с меньшим значением.

  • CLOCK_PROCESS_CPUTIME_ID
  • CLOCK_THREAD_COUTIME_ID

Я не нашел разницы на обоих часах, хотя они начинаются с меньшего значения и всегда правильно упорядочены.

Я не могу объяснить это поведение.

Ответ №1:

Вероятно, в вашем системном источнике часов установлено значение TSC вместо HPET.

В современных многоядерных системах в целом HPET — это более новая система, которая является более точной и последовательной, а TSC — более старая система, которая обладает большей производительностью.

На openSUSE вы можете узнать, каков ваш текущий clocksource, с помощью

cat /sys/devices/system/clocksource/clocksource0/current_clocksource

Чтобы настроить источник синхронизации на HPET в openSUSE, выполните

echo 'hpet' > /sys/devices/system/clocksource/clocksource0/current_clocksource

Дальнейшее чтение:

http://en.wikipedia.org/wiki/HPET

http://en.wikipedia.org/wiki/Time_Stamp_Counter

Ответ №2:

  • CLOCK_REALTIME предоставляет вам доступ к часам реального времени, то есть к тем, которые хранят текущую дату и время.
  • CLOCK_MONOTONIC предоставляет вам доступ к часам, которые никогда не возвращаются назад во времени, вам, вероятно, следует использовать это вместо CLOCK_REALTIME .
  • CLOCK_PROCESS_CPUTIME_ID предоставляет вам доступ к часам, специфичным для текущего процесса, предоставляя вам время процессора процесса (время, затраченное процессором на выполнение этого конкретного процесса).
  • CLOCK_THREAD_CPUTIME_ID предоставляет вам доступ к часам, специфичным для текущего потока, предоставляя вам время процессора процесса (время, затраченное процессором на выполнение этого конкретного потока).

Комментарии:

1. Могу ли я предположить, что CLOCK_REALTIME сброшен? Это единственное объяснение, которое у меня есть для неправильного порядка, который я получаю с этими часами.

2. В Linux CLOCK_REALTIME и CLOCK_MONOTONIC оба подвержены разрывам из-за настройки системного времени, например, с помощью ntpd. Используйте CLOCK_MONOTONIC_RAW, чтобы получить таймер, который на самом деле гарантированно не пойдет назад во времени.

3. @BDatRivenhill 1 полезно для устранения моей проблемы с истекшим временем