2013-03-18 3 views
0

Я создаю проект для приложения удаленного мониторинга, состоящего из службы, которая будет размещаться на отдельных машинах. Задача службы состоит в том, чтобы собирать информацию об использовании ЦП, использовании памяти и т. Д. С использованием WMI. Служба выполняет сканирование каждые 15 секунд с помощью потоковой передачи. Теперь я хочу, чтобы службы на каждой машине выполнялись точно в одно и то же время. Напр. 8,15, 8,30, 8,45. Я написал простой логикс, который проверяет текущий второй счетчик и заставляет поток спящего режима для системы времени достигать времени, которое точно падает либо в x.15, x.30, x.45 и т. Д. Но реализация этого сама по себе не делает убедитесь, что стоимость, собранная службой через WMI для одного и того же процесса, будет в одно и то же время. Напр. Использование ЦП для машины 1 и ЦП. Использование для машины 2 необходимо собирать в одно и то же время, чтобы ее можно было сравнивать во время выполнения. То же самое относится и к другим процессам и метрическим значениям.Выполнение служб на нескольких машинах одновременно

Любая помощь будет оценена по достоинству.

+0

Простое синхронизация часов на нескольких машинах - сложная проблема. Существует причина, по которой большинство протоколов, включающих элемент времени (например, предотвращение повторных атак), допускают * некоторые * слабые времена, о которых сообщают различные задействованные машины. –

+0

На самом деле логика, которую я реализовал, дает мне желаемый результат, но решение не является надежным. Решение работает на том основании, что все будет работать нормально. :-( –

+1

См., Например, [Протокол сетевого времени] (http://en.wikipedia.org/wiki/Network_Time_Protocol): «Microsoft не гарантирует, что их реализация будет более точной, чем 2 секунды» –

ответ

0

Какова ваша терпимость к «точно в одно и то же время?» Через секунду? 10 миллисекунд?

Если ваши системы находятся в одной и той же локальной сети, и у вас небольшие задержки в сети, вы можете использовать ZeroMQ, чтобы настроить систему публикации подписей TCP/IP для запуска импульса каждые 15 секунд, что заставляет все системы делать снимок.

Если системы рассредоточены, то вы можете использовать что-то вроде этого, чтобы запросить сервер NTP: How to Query an NTP Server using C#?

0

Спасибо за помощь, На самом деле я получил эту работу. Используемая здесь логика (предложенная моей женой). У меня есть одна статическая коллекция, и есть 2-3 разных потока, каждый из которых извлекает другой набор значений с машины с помощью запросов WMI. Теперь этот сбор данных происходит через каждые 1 секунду (на данный момент) и вставляется в статическую коллекцию. Теперь есть другой поток, который получает записи из коллекции, которые были вставлены во время, секунды которых кратные 15. например. второй% 15 = 0. И теперь это решает проблему. После сбора записей из коллекции я удаляю все записи из коллекции, которые были собраны до текущего времени. Я не уверен, что это лучшее решение, но работает для меня.

Смежные вопросы