Удаленный запрос 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, каждый в том же домене, что и мой локальный компьютер.
Ответы
Ответ 1
Возможно, это ускорит все, используя CIM вместо WMI.
Здесь вы можете найти сравнение производительности: http://community.spiceworks.com/topic/332657-powershell-cmdlet-performance-get-wmiobject-vs-get-ciminstance
Конечно, вы также можете получить конкретный CimInstance в С#:
https://msdn.microsoft.com/en-us/library/dn313201(v=vs.85).aspx
Ответ 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
Вы можете попробовать две вещи, чтобы проверить, хорошо ли это работает для вашего.