Часы одного из моих 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
команда и изменение переменных загрузки ядра - этого следует избегать.