Я не сделал сравнительного теста, но я вижу несколько потенциальных улучшений.
Вы открываете и закрываете файл для каждого вызова к date
. Это - отходы: просто поместите перенаправление вокруг целого цикла.
while …; do …; done >"$file"
Вы выполняете отдельные вызовы к date
для каждой строки. Unix способен называть внешние программы быстро, но внутренний еще лучше. Дата GNU имеет опцию пакета: подайте его даты на стандартном входе и нем структурные распечатки программы их. Кроме того, для перечисления диапазона целых чисел использовать seq
, это, вероятно, будет быстрее, чем интерпретация цикла в оболочке.
seq -f @%12.0f $secBeg $secEnd | date -f - '+%Y-%m-%d %H:%M:%S' >"$file"
cnt=$(($secY2 + 1))
Вообще говоря, если Ваш сценарий оболочки является слишком медленным, попытайтесь выполнить внутренний цикл в специализированной утилите — здесь seq
и date
, но часто sed
или awk
. Если Вы не можете управлять этим, переключиться на более усовершенствованный язык сценариев, такой как Perl или Python (но специализированные утилиты обычно быстрее при установке их вариантам использования).
Существует много факторов, которые могли бы заставить часы программного обеспечения отставать или убегать. Отмечает время прихода на работу виртуальные серверы особенно подвержены целому классу этих проблем. 12 секунд в день довольно плохи, пока Вы не сталкиваетесь с виртуальными полями с часами, которые достигают на 180-200%-й скорости! Отмечает время прихода на работу ноутбуки, которые приостанавливают, может пострадать от хронометрирования проблем также.
Необходимо рассмотреть отбрасывание ntupdate
в пользу ntpd
. Имя пакета ntp
на Debian (и по-видимому Ubuntu также). Демон NTP сохраняет Ваше время в синхронизации намного больше заранее, чем задание крона, синхронизирующееся с одним или несколькими другими серверами NTP и сохраняющее Ваши часы намного более точный. Это - другая реализация того же протокола ntpdate
использование, кроме ntpd
контролирует время непрерывно.
Если Вы не хотите (очень маленькие) издержки ntpd
, Вы могли бы рассмотреть выполнение ntpdate
раз в час. Принятие Вы - 0,5 с от каждого часа, который должен быть достаточным.
Ответ на другую половину вопроса, на том, почему это происходит: часы Компьютерного оборудования известно неточны, поэтому в то время как дрейф 12 секунд за день необычен, это не действительно все что необычный.
(Это, вероятно, из-за распространенности использования сетевого времени, так, чтобы дрейф даже 12 секунд в день был незначительным раздражением по сравнению с тем, чем это было бы в часах - и таким образом компании-производители оборудования могут использовать дешевые микросхемы синхрогенератора. Физически, что происходит, вероятно, что осциллятор в Вашей микросхеме синхрогенератора не калибруется совершенно верно, таким образом, это работает немного-но-надежно медленный.)
Я подозреваю, что ntp не обновляют время Вашего сервера, потому что разница является слишком небольшой. У меня была подобная проблема, я видел ту же задержку каждый день, пока я не узнал, что быть небольшими ntp различия не обновит, пока определенный порог не будет присутствовать.
Проверьте Вас конфигурация на минимальный порог для синхронизации.
CONFIG_NO_HZ
включенный. – Alexios 16.01.2012, 17:33