Skip to content

Cuidado con la clase WMI MicrosoftDNS_Zone

Cuando estaba desarrollando la funcionalidad de gestión manual de registros de DNS en Domitienda me encontré con un problema bastante importante de rendimiento en la clase MicrosoftDNS_Zone de WMI. Básicamente, al utilizarla se disparaban dos procesos hasta copar el 100% de la CPU: El proceso del servidor de DNS de Microsoft (dns.exe) y el provider de WMI de la máquina (wmiprvse.exe).

Siempre he tenido claro que las consultas por WMI son tirando a lentas y que hay que restringir resultados todo lo posible (sin llegar a desnaturalizar el resultado devuelto). Sin embargo, en este caso, cualquier enumeración sobre esta clase provocaba los efectos ya descritos, todo sobre un Windows 2003 Server correctamente actualizado (aunque ciertamente, soportando muchas zonas).

No he llegado a descubrir a qué se debe semejante problema (que podía dejar la máquina colgada durante 50 segundos). Lo que he tenido claro es que al menos en el servidor en cuestión era necesario evitar comprobaciones de, por ejemplo, existencia de una zona concreta (es más “barato” crear la zona y tratar la excepción en caso de que ya exista). También, un modo de paliar esa sensación de cuelgue extremo es crear un provider de WMI aislado solamente para el servidor de DNS. De este modo, el resto de operaciones esperando para realizar alguna operación mediante WMI pueden usar el provider genérico. El planificador de tareas de Windows 2003 ya se encarga de repartir el tiempo lo mejor que puede entre ambos, y los resultados mejoran bastante (pese a que la CPU se siga pasando al 100% más de lo que toca).

En el blog de Jane Lewis puede leerse sobre esta técnica. Traduzco aquí para futura referencia:

Aislar WMIPRVSE.EXE en una instancia privada para el servidor de DNS de Microsoft

  1. Ejecutar wbemtest.exe.
  2. Click sobre connect y luego root\microsoftdns en el namespace.
  3. Enum classes
  4. Recursive y click en OK
  5. Seleccionar __Win32Provider de la lista de clases y hacer doble click.
  6. Click en “Instances”.
  7. Seleccionar la instancia y doble click.
  8. Seleccionar “HostingModel” y hacer doble click.
  9. Cambiar el valor de “NetworkServiceHost” a“NetworkServiceHost:DNSProvHost” (Sin las comillas)
  10. Guardar propiedad
  11. Guardar el objeto
  12. Cerrar wbemtest.exe.

Como siempre gracias al autor,  Jane en este caso, por esta información.

Si tenéis cualquier información y queréis compartirla no dudéis en poneros en contacto.

Categories: General.

Comment Feed

No Responses (yet)



Some HTML is OK

or, reply to this post via trackback.