c# - Consulta WMI remota lenta
(5)
Estoy trabajando en un programa que consulta tres servidores diferentes para obtener información de CPU y LogicalDisk.
Cada servidor que pregunto me devuelve los valores en 6 a 15 segundos (dependiendo del servidor). Por lo tanto, toma un total de 31 segundos para obtener todos mis valores (15 segundos para el primer servidor, 6 para el segundo y 10 para el tercero).
Intenté multiprocilar cada consulta, redujo el tiempo de ejecución de 1 segundo para cada servidor, por lo que no creo que sea la solución.
También intenté ejecutar consultas directamente con powershell en servidores:
Primer servidor: tardó 10 segundos (en lugar de 15) en recuperar información
Segundo servidor: tardó 10 segundos (como cuando lo hago de forma remota) para recuperar información
Tercer servidor) tomó ~ 1 segundo (en lugar de 6)
Aquí están mis consultas:
SELECT LoadPercentage From WIN32_Processor
SELECT Size, FreeSpace From WIN32_LogicalDisk
Mi pregunta es: ¿hay algo que hacer en mis servidores para facilitar las consultas? Ya intenté desactivar el firewall y el antivirus.
PD: Estoy consultando el servidor Windows 2003 R2, Win XP pro y el servidor Win 7, cada uno en el mismo dominio que mi computadora local.
Dado que enumeró dos consultas diferentes, sería interesante saber si ambas son lentas o solo una.
En el pasado he experimentado que las consultas al procesador WIN32 pueden ser lentas en algunas versiones de Windows. Si ese es el caso, tal vez pueda obtener la información requerida de otros objetos (con suerte más receptivos) como Win32_PerfFormattedData_Counters_ProcessorInformation:
SELECT PercentProcessorTime FROM Win32_PerfFormattedData_Counters_ProcessorInformation
Intente consultar localmente para investigar el problema de rendimiento. Si sigue siendo lento, investigue su consulta.
No sé cuáles son las especificaciones de su proyecto, pero lo abordaría de esta manera: 1) crear una aplicación de consola que haga las consultas 2) programarla en los servidores al inicio cada 10-15 minutos 3) empujar a través de MSMQ o iniciar sesión en un Base de datos o servicio web. 4) la aplicación de la consola debe implementarse como clic una vez para que tenga un solo punto para actualizar en caso de que necesite contadores de rendimiento adicionales.
Mire el indicador WBEM_FLAG_RETURN_IMMEDIATE para su idioma. Cuando se usa Scriptomatic (GUI de VBScript de MS para realizar llamadas WMI), esta opción se agrega automáticamente como parte de las opciones. El 48 significa WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY. Ejemplo de VBScript:
objWMIService.ExecQuery ("Select * from Win32_NetworkConnection",,48)
https://msdn.microsoft.com/en-us/library/aa390880(v=vs.85).aspx
Puedes probar dos cosas solo para comprobar si funciona bien para tu.
Trate de ir con el script de PowerShell. http://www.powershellpro.com/powershell-tutorial-introduction/powershell-scripting-with-wmi/
o puede usar la herramienta disponible en Windows, llamada wbemtest . Si no está consultando por encima de WQL desde cualquier lenguaje de programación, debería probar por encima de las dos opciones.
Tal vez podría acelerar todo el proceso utilizando CIM en lugar de WMI.
Aquí puede encontrar una comparación de rendimiento: http://community.spiceworks.com/topic/332657-powershell-cmdlet-performance-get-wmiobject-vs-get-ciminstance
Por supuesto, también puede obtener una CimInstance específica en C #: https://msdn.microsoft.com/en-us/library/dn313201(v=vs.85).aspx