OpenVZ Forum


Home » International » Russian » 2.6.18, RTC и ntpd
Re: 2.6.18, RTC и ntpd [message #33630 is a reply to message #33579] Mon, 27 October 2008 07:37 Go to previous messageGo to previous message
maratrus is currently offline  maratrus
Messages: 1495
Registered: August 2007
Location: Moscow
Senior Member
Здравствуйте еще раз,

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

Quote:


Подберу их так, что разница времен практически не меняется и в пределах нескольких микросекунд на протяжении минимум получаса.


Так как раз в 11 минут происходит синхронизация rtc и system clock, то достаточно следить, чтобы часы не разбегались в течение одиннадцати минут.

Quote:


Однако стоит перезагрузитьтся, и получаем уход минимум в 50 микросекунд за секунду


То есть у Вас проблема не во всяких там алгоритмах adjusting'а, а в том, что rtc и системные часы идут с разной скоростью?

Quote:


Как-будто в ядре для расчета времени используется не инициализированная переменная.


Вот, что я нарыл.
Текущее время и дата хранятся в переменной xtime типа
struct timespec xtime __attribute__ ((aligned (16)));

Инициализация происходит в функции time_init() (привожу выдержки из i386 архитектуры)
#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
void __init time_init(void)
{
...
//Количество секунд, прошедших с 01.01.1970,
//берется информация из rtc
xtime.tv_sec = get_cmos_time();
//Количество наносекунд, прошедших с начала текущей секунды
//INITIAL_JIFFIES - это изначальное значение jiffies (его делают
"отрицательным")
//!!Это место мне не очень понятно
// cказано, что tv_nsec выбирают таким образом, чтобы первое переполнение jiffies попало на границу секунды, 
//но с таким значение, как выбрано, этого не происходит. Попробую выяснить.
xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
...
}

То есть, например, в этом месте количество tv_nsec ставится независимо от rtc.

Quote:


Оказывется, теперь в Linux возможны разные источники для системного времени



Ага, у каждого есть свой рейтинг, насколько я понял, выбор должен происходить по рейтингу либо по имени, которое, например, может придти из sysfs или commandline.
Выбор происходит в функции:
static struct clocksource *select_clocksource(void)

Она просто смотрит на список доступных таймеров, если встретила таймер по требуемому имени, то его выбирает, иначе действует по рейтингу. Я выписал рейтинги:

jiffies = 0
pit = 110
acpi_pm = 200
hpet = 250
tsc = 300

Пока я не очень понимаю, когда и кто у Вас на машине выбрал acpi_pm вместо tsc.
Надо внимательнее присмотреться либо к коду ядра, либо к init скриптам на машине.

Надеюсь, что-нибудь из вышесказанного поможет.

 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: Боремся со спамом на VE: проблемы с iptables
Next Topic: Нужна помошь в настроке сети в двумя интерфейсами.
Goto Forum:
  


Current Time: Fri Jul 26 00:20:15 GMT 2024

Total time taken to generate the page: 0.03284 seconds