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

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

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

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

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

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

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

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

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


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

Как быть с изменением времени пользователем? Административный запрет?
...
Рейтинг: 0 / 0
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
    #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
Нужно очень часто получать точное время, какой выбрать способ. Подскажите.
    #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]