Почему часы Ubuntu становятся медленнее или быстрее?

16

Часы Ubuntu выключены примерно на полчаса:

Ubuntu Time & Date v. Официальное время США

Где я могу начать устранять неисправности?

Якобы он устанавливается "автоматически из Интернета". Как я могу проверить, что «Интернет» знает, который час?

Детали

У Ubuntu было достаточно времени для общения с Интернетом:

$ date; uptime
Fri May 18 05:56:00 PDT 2012
 05:56:00 up 12 days, 10:48,  2 users,  load average: 0.61, 0.96, 1.15

На этот раз сервер времени, который я нашел с помощью веб-поиска, похоже, знает точное время:

$ date; ntpdate -q north-america.pool.ntp.org
Fri May 18 05:56:09 PDT 2012
server 208.38.65.37, stratum 2, offset 1752.625337, delay 0.10558
server 46.166.138.172, stratum 2, offset 1752.648597, delay 0.10629
server 205.189.158.228, stratum 3, offset 1752.672466, delay 0.11829
18 May 05:56:18 ntpdate[29752]: step time server 208.38.65.37 offset 1752.625337 sec

Там нет никаких сообщений об ошибках, связанных с NTP:

$ grep -ic ntp /var/log/syslog
0

После перезагрузки время было автоматически скорректировано, и в нем появилось следующее /var/log/syslog:

May 18 17:58:12 aux ntpdate[1891]: step time server 91.189.94.4 offset 1838.497277 sec

Журнал смещения, о котором сообщает ntpdate, показывает, что часы смещаются примерно на 9 секунд каждый час:

$ while true; do ntpdate-debian -q | tail -n 1 >> 'drift.log'; sleep 16m; done
^C
$ r -e '
    attach(read.table("drift.log", header=FALSE))
    clock <- as.POSIXct(paste(V1, V2, V3), format="%d %b %H:%M:%S")
    fit <- lm(V10~clock)
    png("drift.png")
    plot(clock, V10, xlab="Clock time", ylab="Time server offset (s)")
    abline(fit)
    mtext(sprintf("Drift rate: %.2f s/hr", fit$coefficients[[2]]*3600))
'

Часы время v. Смещение сервера времени

ændrük
источник
Справочная информация: NTP является отличным инструментом для поддержания точного времени . Но требуется определенное время (несколько минут или даже часов), чтобы добраться до текущего времени из-за неправильного времени. Это связано с ntp-серверами (по вашему выбору) и вашей интернет-задержкой к ним. @Floyd обрисовал в общих чертах ярлык, чтобы быстро заставить правильное время. Но лучшее время (и использование ntp ) требует тщательного выбора ntp-серверов.
Давид6
Моя машина делает это ... сводит меня с ума ... Я должен откатывать время на 20 минут каждую неделю ...
TheXed
Первое, что я бы попробовал сделать, это заменить батарею на материнской плате ....
TheXed

Ответы:

17

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

Он не только устанавливает время, но и непрерывно регулирует, как ваш компьютер хранит время, так что его время не только точно в один момент времени, но и близко к реальному времени (в течение десятков миллисекунд, а не десятков минут) , Он регулирует как фазу (время), так и частоту (как быстро «тикают» часы). NTP никогда не заставляет часы бежать назад. Чтобы определить, как быстро тикают часы после перезагрузки, может потребоваться много времени, поэтому ntp отслеживает дрейф в файле /var/lib/ntp/ntp.drift. Так как вы не запускаете ntp, ничего этого не происходит.

NTP не так популярен, как когда-то, потому что спящие ноутбуки и рабочие столы, а виртуальные машины иногда не позволяют ему работать. Он предназначен для запуска время от времени по собственному расписанию на компьютере, который работает постоянно, и в реальном мире, где время непрерывно. Вероятно, поэтому он не установлен по умолчанию на современной рабочей станции. [Для Vmware, посмотрите это]

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

По какой-то причине фондовый ntpdate не всегда запускается. Вместо этого используйте ntpdate-debian . Синтаксис для for.mer выглядит примерно так: ntpdate ntp.ubuntu.com , для последнего - ntpdate-debian

При отсутствии одной из этих вещей ntp - лучший способ сэкономить время.

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

Большинство компьютерных таймеров управляются кварцевым генератором на его интегральных схемах. Несмотря на кристаллы, они работают быстрее и медленнее в зависимости от окружающей среды, в основном от температуры. Если у вас не установлено какое-то программное обеспечение для синхронизации времени, о котором мы не знаем, я бы сказал, что часы вашей системы не работают.

Если вы будете запускать ntp в течение дня или двух, он будет хранить информацию в /var/lib/ntp/ntp.drift, которая будет указывать, насколько сильно он должен будет отрегулировать скорость, с которой время вашей операционной системы увеличивается для каждого прерывания, чтобы сопоставьте частоту аппаратных часов с реальным временем в интернете. Сохранение файла таким же и просто запуск и остановка ntp через минуту после этого (при условии, что вы оставите файл /var/lib/ntp/ntp.drift без изменений) может многое исправить, если после установки ntp смещения тактовой частоты остается после NTP заканчивается. Я не уверен в этой детали.

Я подозреваю, что значение, которое ntp будет хранить в /var/lib/ntp/ntp.drift, сильно отличается от моего.

Однако, если эта машина постоянно работает, то лучше всего установить ntp и позволить ему делать свое дело. Посмотрите другие ответы для получения подробной информации о том, как правильно определить время до его начала. Я запускаю ntp на моем рабочем столе и ntpdate на моем ноутбуке.

Интересная возможная альтернатива, adjtimex, упоминается в этом ответе nealmcb.

Если ваша система не работает постоянно, запуск ntpdate во время загрузки кажется хорошим вариантом.

Предупреждение, что некоторые программы могут испортиться, если время компьютеров уходит в прошлое. Запуск ntpdate после загрузки может привести к этому.

Одна проблема, это может быть проблемой: насколько я помню, ntp ожидает, что время не будет слишком далеко. Если это так, пытаясь действовать консервативно, ntp вообще не будет корректировать время. Если вы находитесь в такой ситуации, имеет смысл сделать и то и другое - запустите ntpdate при загрузке, чтобы инициализировать время в нужное время, а затем позвольте запуску ntp, чтобы он работал, чтобы обеспечить точное хронометраж. В частности, неисправная батарея материнской платы может вызвать эту ошибку, как и загрузка компьютера, который был выключен в течение длительного времени.

Джон С. Грубер
источник
Отличное объяснение, Джон! Только одна маленькая вещь - дата / время на большинстве материнских плат поддерживается отдельным RTC (часами реального времени), который использует свой собственный кристалл 32,768 кГц (потому что деление этой частоты на 2 ^ 15 дает вам ровно одну секунду) и FSB Тактовая частота, которая обычно составляет 100+ МГц, не имеет ничего общего с сохранением даты - в таком случае перегрузка / разгон может испортить ее - вместо этого обычно это дрейф кристаллов в модуле / схеме RTC. Можете ли вы найти эту проблему и ответить на комментарий и / или отредактировать свой ответ, чтобы отразить это?
Иш
Я сделаю оба! Я убрал упоминание о разгоне, поскольку я думаю, что это невероятно, как я уже сказал. Однако RTC используется только для установки времени во время загрузки. Как упоминается в вашем комментарии, с точностью до 1 секунды. На man rtcстранице написано: «RTC не следует путать с системными часами, которые являются программными часами, поддерживаемыми ядром и используемыми для реализации gettimeofday (2) ...» Не знаю, связаны ли системные часы с часами FSB , Если посмотреть на конфигурацию ядра, в последнем точном ядре Ubuntu i386 системные часы обновляются с частотой 250 Гц. Спасибо за комментарий!
Джон С. Грубер
@izx На моем ноутбуке ядро ​​использует HPET в качестве источника синхронизации. Это настраивается. Википедия говорит, что это часть функции южного моста. Я не знаю, что это говорит о его отношениях с ФСБ, но я понимаю, что ФСБ является частью северного моста.
Джон С. Грубер
Спасибо, Джон и @izx. Я в восторге от полноты этого. Изкс, я надеюсь, ты не примешь это лично, потому что я пометил это как принятое. Я думаю, что это будет лучше читать для будущих посетителей.
ændrük
@ ændrük: никаких проблем, как вы можете видеть, я очень ценил тщательность Джона.
иш
12

- Обычно время синхронизируется только один раз при каждой загрузке или пробуждении от сна

Таким образом, проблема заключается либо в том, что сервер времени Ubuntu по умолчанию (что это?) Имеет неправильное время, либо Ubuntu не устанавливает время автоматически из Интернета.

Нет, сервер времени в Ubuntu работает правильно, и он автоматически устанавливает время с него.

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

- Установите почасовую cronработу для синхронизации, если вы не часто перезагружаетесь, или ваш сервер / рабочий стол никогда не засыпает

Лучше всего настроить cron-задание, я бы сказал, ежечасно, если вы хотите сверхточное время. Самый простой способ сделать это:

  • sudo editor /etc/cron.hourly/ntpsync

Добавьте следующие строки:

#! / Bin / Баш

ntpdate ntp.ubuntu.com # или ваш выбор сервера
  • сохранить, выйти и sudo chmod +x /etc/cron.hourly/ntpsync

Вы можете вставить это /etc/cron.dailyвместо этого, если хотите, один раз в день.

иш
источник
Пятно на. Я принимаю это за правильный ответ на мой вопрос о том, почему часы неправильные, но я скептически отношусь к этому обходному пути. Мне нужно узнать немного больше об этом, прежде чем я решу, какое действие предпринять.
rndrük
Если вы установили сервер по вашему выбору в файле ntp.conf, вам нужно переопределить его здесь?
Снексе
6

Это может произойти, если вы установили демон времени ntp, а время на вашем компьютере слишком далеко для быстрого исправления.

Чтобы исправить это, откройте терминал и сделайте

  sudo service ntp stop
  sudo ntpdate swisstime.ethz.ch
  date
  sudo service ntp start

Что это делает:

  1. Stop ntp daemon
  2. Установить часы
  3. Время теперь должно быть правильным
  4. перезапустить демон ntp

Если у вас не установлен ntp, сделайте это с

  sudo apt-get install update

Обновление: использование ntpdate в задании cron, как было рекомендовано здесь, приводит к незначительным проблемам.

Ntpdate заставит время «прыгать» каждый час или около того. Использование ntp позволяет избежать этой проблемы, потому что оно будет регулировать время, наклоняя часы. Кроме того, хотя выбор ntp-сервера в окрестности дает еще более высокую точность, в этом нет необходимости. Файл конфигурации ntp по умолчанию содержит несколько серверов, и сервер автоматически компенсирует любые задержки.

Итог: - используйте ntp - если далеко, выключите ntp, запустите ntpdate один раз и перезапустите ntp.

Floyd
источник
/etc/init.d/ntpне существует Это довольно свежая установка Ubuntu 12.04, и я специально не изменил ничего, связанного со временем.
Ондрюк,
Тогда я рекомендую установить его.
Флойд
Насколько это возможно, я предпочитаю не вмешиваться в общесистемную конфигурацию и сервисы. Если этот файл не установлен по умолчанию, почему он должен быть необходим для работы настроек времени и даты по умолчанию?
rndrük
1
Правильно ли время после перезагрузки? Я подозреваю, что обновление часов просто запускает ntpdate один раз. В некоторых системах проблема заключается в том, что системные часы, поддерживаемые Linux, работают слишком быстро. У меня было это в частности с системами, работающими как виртуальные машины.
Флойд
1
Если эта проблема не устраняется после перезагрузки или выключения, возможно, ваша ячейка CMOS обесточена в MOBO.
Atenz
1

У меня была похожая проблема, и она была вызвана чем-то в брандмауэре. В конце я добавил почасовое задание cron, но добавил -uаргумент, ntpdateчтобы заставить его использовать нестандартный порт.

Моя проблема была вызвана тем, что Ubuntu на самом деле не проверяла, ntpdateработает ли она, а автоматически предполагала, что она будет работать.

Axel
источник