Удаленный запрос WMI медленный

Я работаю над программой, которая запрашивает три разных сервера, чтобы получить информацию о процессоре и LogicalDisk.

Каждый запрос сервера возвращает значения в течение 6-15 секунд (в зависимости от сервера). Таким образом, для получения всех моих значений требуется всего 31 секунда (15 секунд для первого сервера, 6 для второго и 10 для третьего).

Я попытался выполнить несколько потоков каждого запроса, это сократило время выполнения на 1 секунду для каждого сервера, поэтому я не думаю, что это решение.

Я также пытался запускать запросы напрямую с powershell на серверах:

  • Первый сервер: потребовалось 10 секунд (вместо 15) для получения информации

  • Второй сервер: потребовалось 10 секунд (например, когда я делаю это дистанционно) для получения информации

  • Третий сервер) потребовалось ~ 1 секунду (вместо 6)

Вот мои запросы:

SELECT LoadPercentage From WIN32_Processor

SELECT Size, FreeSpace From WIN32_LogicalDisk

Мой вопрос: есть ли что-то на моих серверах, чтобы сделать запросы проще? Я уже пытался отключить брандмауэр и антивирус.

PS: Я запрашиваю сервер Windows 2003 R2, сервер Win XP pro и Win 7, каждый в том же домене, что и мой локальный компьютер.

Ответы

Ответ 2

Попробуйте выполнить локальный запрос, чтобы выяснить проблему с производительностью. если он все еще медленный, расследуйте ваш запрос.

Я не знаю, что такое ваши спецификации проекта, но я бы подошел к этому так: 1) создать консольное приложение, которое запрашивает 2) планировать его на серверах при запуске каждые 10-15 минут 3) пропустите MSMQ или войдите в базу данных или веб-службу. 4) консольное приложение должно быть развернуто как clickonce, так что у вас есть одна точка для обновления, если вам нужны дополнительные счетчики производительности.

Ответ 3

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

В прошлом я испытал, что запросы к WIN32_Processor могут быть медленными в некоторых версиях Windows. Если это так, возможно, вы можете получить требуемую информацию от других (надеюсь, более гибких) объектов, таких как Win32_PerfFormattedData_Counters_ProcessorInformation:

SELECT PercentProcessorTime FROM Win32_PerfFormattedData_Counters_ProcessorInformation

Ответ 4

Посмотрите на флаг WBEM_FLAG_RETURN_IMMEDIATE для своего языка. При использовании Scriptomatic (большой графический интерфейс VBScript от MS для создания WMI-вызовов) эта опция автоматически добавляется как часть параметров. 48 означает WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY. Пример VBScript:

objWMIService.ExecQuery ("Select * from Win32_NetworkConnection",,48)

https://msdn.microsoft.com/en-us/library/aa390880(v=vs.85).aspx

Ответ 5

Вы можете попробовать две вещи, чтобы проверить, хорошо ли это работает для вашего.

  • Попробуйте пойти с PowerShell script. http://www.powershellpro.com/powershell-tutorial-introduction/powershell-scripting-with-wmi/

  • или вы можете использовать инструмент, доступный в Windows - с именем wbemtest. Если вы не запрашиваете выше WQL с любого языка программирования, вы должны попробовать более двух вариантов.