Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Нужно очень часто получать точное время, какой выбрать способ. Подскажите. / 16 сообщений из 16, страница 1 из 1
04.09.2012, 09:29
    #37942309
PlayerDN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
Здравствуйте.
В программе, собирающей инфу об интервалах работы приложений мне нужно получать точное время, каждый раз, при старте или остановке какого-либо процесса, в данный момент это делается при помощи запросов GETDATE() к SQL серверу (в него же записывается результат работы программы), но так как клиентов 1000+ админы жалуются, что такие запросы ДДОСят SQL. Вот пытаюсь придумать альтернативные варианты массового получения точного времени. Пока нарисовалось такое:

1. NTP. Запрашивать каждый раз время с него, но для этого надо поднимать сервер точного времени или брать с контроллеров домена. Но пока не ясно на сколько это пригрузит сервера и сеть. Плюс зависимость от этих самых серверов и сети;
2. Запрашивать время в момент старта программы из SQL, запускать таймер и в последующем точное время вычислять прибавляя значение таймера ко времени из SQL. Но тут возникают проблеммы связанные с тем, что таймеры под Win работают очень неточно, по крайней мере время, вычисляемое таким образом, за минуту уходит на 5-10 с, может это из-за режима отладки, но все равно доверия не вызывает;
3. Разово запрашивать время с SQL, затем вычислить разницу между временем сервера и ПК и в дальнейшем корректировать время ПК на эту разницу. В этом случае не понятно как бороться с переводом времени на ПК в момент работы программы, ведь изначальный дифф будет неверен.

Как поступить, пока не могу определиться. Если решать в лоб, то надо запрашивать либо по NTP или как-нить ещё, например, брать из домена. Но это прилично пригрузит сервера, а этого не хотелось бы. Логично было бы привязаться ко времени ПК, но как определять, что часы переводились?
...
Рейтинг: 0 / 0
04.09.2012, 16:08
    #37943067
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
В начале работы смотрите время на сервере, время на локальном компе. Определяете разность.
Потом каждый раз когда нужно время, берете время на локальном компе и имея разность, получаете серверное время, не нагружая его.
...
Рейтинг: 0 / 0
04.09.2012, 18:30
    #37943342
?
?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
PlayerDN3. Разово запрашивать время с SQL, затем вычислить разницу между временем сервера и ПК и в дальнейшем корректировать время ПК на эту разницу. В этом случае не понятно как бороться с переводом времени на ПК в момент работы программы, ведь изначальный дифф будет неверен.На GetTickCount() перевод времени ведь не влияет? Можно от этого как-то считать.
...
Рейтинг: 0 / 0
04.09.2012, 23:33
    #37943628
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
Странно вообще то, что "админы жалуются, что запросы DDOSят SQL".
В свое время, связка (>100 клиентов (WXP/C++) + MSSQL 2005 + DC W2k3 (замененная потом на WXP/W7 + MSSQL 2008 R2), windows-аутентификация) использовала проверку синхронизации при каждом запросе ... и никакой заметной нагрузки именно от этого вообще не наблюдалось... Может, оттого, что логика синхронизации выполнялась прямо на сервере, а не на станции?
Вот вы результаты вашей "программы, собирающей инфу об интервалах работы приложений" как организуете/храните?
...
Рейтинг: 0 / 0
05.09.2012, 17:23
    #37945221
PlayerDN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
S.G.В начале работы смотрите время на сервере, время на локальном компе. Определяете разность.
Потом каждый раз когда нужно время, берете время на локальном компе и имея разность, получаете серверное время, не нагружая его.

А что будет если произойдет изменение времени на локальном компе? У юзеров, к сожалению, есть права лок. админов ((
...
Рейтинг: 0 / 0
05.09.2012, 17:25
    #37945229
PlayerDN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
?PlayerDN3. Разово запрашивать время с SQL, затем вычислить разницу между временем сервера и ПК и в дальнейшем корректировать время ПК на эту разницу. В этом случае не понятно как бороться с переводом времени на ПК в момент работы программы, ведь изначальный дифф будет неверен.На GetTickCount() перевод времени ведь не влияет? Можно от этого как-то считать.

Мысль! Проверю насколько точно оно будет определяться при таком подходе.
Спасибо.
...
Рейтинг: 0 / 0
05.09.2012, 17:34
    #37945247
PlayerDN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
AndreTMСтранно вообще то, что "админы жалуются, что запросы DDOSят SQL".
В свое время, связка (>100 клиентов (WXP/C++) + MSSQL 2005 + DC W2k3 (замененная потом на WXP/W7 + MSSQL 2008 R2), windows-аутентификация) использовала проверку синхронизации при каждом запросе ... и никакой заметной нагрузки именно от этого вообще не наблюдалось... Может, оттого, что логика синхронизации выполнялась прямо на сервере, а не на станции?
Вот вы результаты вашей "программы, собирающей инфу об интервалах работы приложений" как организуете/храните?

Т.е. локальное время ПК отдавалось на сервер и там уже сравнивалось с серверным?

Результаты хранятся в таблице БД в таком виде: ИД записи, время старта и остановки процесса, название ПК, пользователь от чьего имени процесс был запущен, ну и детальная инфа о процессе (путь запуска, версия, компания-изготовитель и т.д.).
Время остановки проставляется в момент записи данных в БД.

Сейчас ещё хочу добавить буфер, т.е. если не удалось сохранить данные о процессе непосредственно после его остановки, складывать их в буфер и как только сервер станет доступным сливать их в него. Сейчас при проблемах с сетью или сервером данные теряются.
...
Рейтинг: 0 / 0
05.09.2012, 18:09
    #37945322
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
PlayerDNТ.е. локальное время ПК отдавалось на сервер и там уже сравнивалось с серверным?А что мешает просто вставлять время на сервере? Зачем присылать его (время) с клиента?
...
Рейтинг: 0 / 0
05.09.2012, 18:32
    #37945372
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
PlayerDNЗдравствуйте.
В программе, собирающей инфу об интервалах работы приложений мне нужно получать точное время, каждый раз, при старте или остановке какого-либо процесса, в данный момент это делается при помощи запросов GETDATE() к SQL серверу (в него же записывается результат работы программы), но так как клиентов 1000+ админы жалуются, что такие запросы ДДОСят SQL. Вот пытаюсь придумать альтернативные варианты массового получения точного времени.
Так не делается. Тебе надо запускать агента на на том сервере где делаешь мониторинг и фиксировать события
непосредственно там. А потом их логгировать и дальше гонять по логам свою аналитику.

По поводу NNTP. Я не знаю как он устроен но подозреваю что он корректирует время с учётом беготни
пакетов по сети. Либо делает больше измерений и усредняет точность. Тоесть тут два варианта.
Либо ты получаешь очень точное время с лагом. Либо неточное но быстро. Выбирай сам.
...
Рейтинг: 0 / 0
05.09.2012, 19:44
    #37945480
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
maytonПо поводу NNTP. Я не знаю как он устроен но подозреваю что он корректирует время с учётом беготни
пакетов по сети.На всякий случай напомню: NTP и NNTP это соврешенно разные вещи.
...
Рейтинг: 0 / 0
05.09.2012, 21:40
    #37945574
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
PlayerDNAndreTMМожет, оттого, что логика синхронизации выполнялась прямо на сервере, а не на станции?Т.е. локальное время ПК отдавалось на сервер и там уже сравнивалось с сервернымВремя "локального хоста" вообще не учитывалось, вообще-то... Сервер получал запрос, формировал ответ,.. время всегда было SQL-серверное. Синхронизация же времени определялась при аутентификации пользователей (ибо - win autentication) при обращении SQL-сервера к DC. Домен-контроллер (первичный) же использовал синхронизацию через NTP с time.nist.gov . Т.е. для хостов LAN источником "реального" времени была всего одна точка - DC, как и положено по дефолту...
...
Рейтинг: 0 / 0
13.11.2012, 11:17
    #38035864
PlayerDN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
Basil A. SidorovА что мешает просто вставлять время на сервере? Зачем присылать его (время) с клиента?
В записи лога используется два времени: время старта и время остановки.
Время остановки = время записи строки в БД.
Время старта проставляет клиент.
...
Рейтинг: 0 / 0
13.11.2012, 11:22
    #38035879
PlayerDN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
maytonТак не делается. Тебе надо запускать агента на на том сервере где делаешь мониторинг и фиксировать события
непосредственно там. А потом их логгировать и дальше гонять по логам свою аналитику.


Думал над таким вариантом, но не нашел преимуществ по сравнению с простой записью на SQL-сервер.
...
Рейтинг: 0 / 0
13.11.2012, 11:26
    #38035888
PlayerDN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
AndreTMВремя "локального хоста" вообще не учитывалось, вообще-то... Сервер получал запрос, формировал ответ,.. время всегда было SQL-серверное. Синхронизация же времени определялась при аутентификации пользователей (ибо - win autentication) при обращении SQL-сервера к DC. Домен-контроллер (первичный) же использовал синхронизацию через NTP с time.nist.gov . Т.е. для хостов LAN источником "реального" времени была всего одна точка - DC, как и положено по дефолту...

Как быть с изменением времени пользователем? Административный запрет?
...
Рейтинг: 0 / 0
13.11.2012, 11:33
    #38035904
PlayerDN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
Вобщем пока остановился на использовании ф-ции GetTickCount(), получило следующее:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
    class myDateTime
    {
        /// <summary>
        /// Начальное точное время
        /// </summary>
        DateTime dtCtrl;
        int tickCtrl, tickPrevValue, tickOverVal = 0;
        /// <summary>
        /// Теоретически, если в течении времеени 2*Int.MaxValue не будет вызвано св-во myDateTime.Now
        /// можем потерять одну иттерацию счетчика.
        /// Во избежание поставим таймер.
        /// </summary>
        System.Timers.Timer tmr;
        bool sync = false;


        public myDateTime(DateTime PrecisionTime)
        {
            dtCtrl = PrecisionTime;
            tickCtrl = Environment.TickCount;
            
            // Предыдущее значение тиков, нужно для контроля перехода счетчика через ноль
            tickPrevValue = tickCtrl;

            tmr = new System.Timers.Timer();
            tmr.AutoReset = true;
            tmr.Interval = int.MaxValue / 2;
            tmr.Elapsed += new System.Timers.ElapsedEventHandler(tmr_Elapsed);
        }

        void tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            sync = true;
            DateTime dt = this.Now;
            sync = false;
        }

        DateTime Now
        {
            get
            {
                DateTime ret;
                int ticks;

                tmr.Stop();

                while (sync) Thread.Sleep(10);

                ticks = Environment.TickCount;

                // Если прозошел переход через ноль корректируем переменные
                if (ticks < tickPrevValue)
                {
                    tickOverVal++; // Количество переходов через ноль
                    tickCtrl = 0; // Начальное значенеи тиков
                }
                tickPrevValue = ticks;

                // Добавляем к начальной точной дате количество переходов через 0
                ret = dtCtrl.AddMilliseconds(tickOverVal * int.MaxValue);
                // Добавляем кол-во тиков
                ret = ret.AddMilliseconds(ticks - tickCtrl);

                tmr.Start();

                return ret;
            }
        }
    }


Покритикуйте, пожалуйста.
...
Рейтинг: 0 / 0
15.11.2012, 14:04
    #38039743
ДохтаР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
maytonPlayerDNЗдравствуйте.
В программе, собирающей инфу об интервалах работы приложений мне нужно получать точное время, каждый раз, при старте или остановке какого-либо процесса, в данный момент это делается при помощи запросов GETDATE() к SQL серверу (в него же записывается результат работы программы), но так как клиентов 1000+ админы жалуются, что такие запросы ДДОСят SQL. Вот пытаюсь придумать альтернативные варианты массового получения точного времени.
Так не делается. Тебе надо запускать агента на на том сервере где делаешь мониторинг и фиксировать события
непосредственно там. А потом их логгировать и дальше гонять по логам свою аналитику.

По поводу NNTP. Я не знаю как он устроен но подозреваю что он корректирует время с учётом беготни
пакетов по сети. Либо делает больше измерений и усредняет точность. Тоесть тут два варианта.
Либо ты получаешь очень точное время с лагом. Либо неточное но быстро. Выбирай сам.

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

Точность времени понятие растяжимое ,

2 TC, сколько точности нужно ?

Если вы синхронизируете время с SQL ,
то синхнонизация машины с NTP сервером раз в пол часа - эталон точности на эти пол часа.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Нужно очень часто получать точное время, какой выбрать способ. Подскажите. / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]