Назад | Перейти на главную страницу

Часы Linux теряют 10 минут каждую неделю

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

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

Результат uname: Linux unis-monitor 2.6.32-5-686 # 1 SMP Mon Feb 25 01:04:36 UTC 2013 i686 GNU / Linux

Сообщение кошки:

cat messages
Jul 14 06:25:06 unis-monitor rsyslogd: [origin software="rsyslogd" swVersion="4.6.4" x-pid="882" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.
Jul 15 06:25:05 unis-monitor rsyslogd: [origin software="rsyslogd" swVersion="4.6.4" x-pid="882" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.

Системный журнал кошек

cat syslog
Jul 15 06:25:05 unis-monitor rsyslogd: [origin software="rsyslogd" swVersion="4.6.4" x-pid="882" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.
Jul 15 06:39:01 unis-monitor /USR/SBIN/CRON[15272]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)
Jul 15 07:09:01 unis-monitor /USR/SBIN/CRON[15465]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)
Jul 15 07:17:01 unis-monitor /USR/SBIN/CRON[15521]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jul 15 07:39:01 unis-monitor /USR/SBIN/CRON[15662]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)
Jul 15 08:09:01 unis-monitor /USR/SBIN/CRON[15855]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)
Jul 15 08:17:01 unis-monitor /USR/SBIN/CRON[15911]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jul 15 08:39:01 unis-monitor /USR/SBIN/CRON[16052]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)
Jul 15 09:09:01 unis-monitor /USR/SBIN/CRON[16273]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)

Итак, если вы знаете, где искать или что я могу использовать для отслеживания изменения даты?

Вот еще немного информации: сервер - это виртуальный сервер, размещенный на HyperV на сервере win 2012. Не знаю, меняет ли это что-нибудь, видел, что на других серверах этой проблемы нет ...

NTP не лишний компонент.

Это единственный разумный способ поддерживать системные часы в соответствии с атомным источником времени.

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

В своих тестах я обнаружил, что Часы виртуальной машины Hyper-V очень ненадежны и часто имеют отклонение часов выше 500 ppm. Этого достаточно, чтобы вызвать сбой даже ntpd. Мне пришлось перейти на использование хрония в этих виртуальных машинах для обеспечения достаточно точных настенных часов; для этого сценария по умолчанию используется значение 1000 ppm и может быть отрегулирован еще дальше если необходимо.

Я больше не рассматриваю Hyper-V всерьез для любого приложения, в котором хронометраж особенно важен.

HyperV - это болезнь, NTPd это лекарство.

Где искать или что можно использовать для отслеживания изменения даты?

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

На самом деле я не знаю, можете ли вы настроить NTPd для запуска (и дать вам вышеупомянутые показатели), но не для фактической настройки системных часов. Другой и менее эффективный способ - периодически (cron?) Запускать ntpdate -q против набора эталонных серверов NTPd и контролировать его вывод, который даст вам разницу между вашими часами и эталоном, не касаясь фактически локальных часов. Результат будет таким:

$ ntpdate -q $YOUR_TLD.pool.ntp.org
[... list of queried servers ...]
17 Jul 12:14:11 ntpdate[42868]: adjust time server 109.168.106.59 offset -0.002517 sec

Вы можете отфильтровать последнее число и построить график, чтобы получить хорошее представление о том, сколько и когда ваши часы прыгают:

$ OFFSET=$( ntpdate -q $YOUR_TLD.pool.ntp.org | grep adjust | awk '{ print $10 }' )
$ echo $OFFSET
0.002970

Смещение часов в Linux vm, работающем в Hyper-V, очень распространено если у вас не установлены и не включены нужные компоненты интеграции. Hyper-V настроит аппаратные часы любой виртуальной машины, которую он запускает, но Linux по умолчанию не полагается на аппаратные часы после загрузки системы. Компоненты интеграции дают ядру подсказки о реальном времени и устраняют эту проблему.

Если компоненты интеграции не подходят для вашего дистрибутива, правильным решением является установка чего-то вроде ntpd и синхронизации с хостом Hyper-V или локальным пулом часов.

«Проблема» в том, что вы используете версию Linux, которая не поддерживает подключаемую инфраструктуру источника времени. Некоторые дистрибутивы поддерживают его, но обычно только в своих 64-битных ОС, а не в 32-битных.

Как уже упоминалось, службы Integration Services позволяют синхронизировать часы, но только если поддерживается PTSI. В большинстве дистрибутивов, поддерживающих PTSI, уже есть источник HV. Посмотрите, есть ли adjtimex порт / пакет, доступный для вашего дистрибутива.

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