Erwin.Ried.cl / Documentos / Windows /
Batallando contra las fuerzas del "polling"

Incansablemente, el malvado "polling" existe con casi cualquier servicio residente de tu equipo, consumiendo y ralentizando cada pequeña operación. Hasta el momento tu única solución era esperar versión tras versión que la empresa desarrolladora corrija su ineficiente código. Mete mano y como nunca antes, dobla el brazo de ese ineficaz código (02/02/2008 04:46 PM)


El concepto de "polling" hace referencia a la incesante actividad que algunas aplicaciones mantienen mientras se encuentran residentes. En sistemas operativos antiguos, anteriores a Windows 2000 muchas veces era necesario, el desarrollador contaba con muy pocas herramientas para monitorear actividad del sistema y por ejemplo saber cuándo se actualizaba un archivo, un registro u otro recurso, sólo era posible haciendo una constante consulta del mismo.

En la actualidad, es posible, incluso de manera muy sencilla, añadir "ganchos" que nos informarán sobre cambios en los recursos sin necesidad de crear ese improductivo "monitoreo". Un ejemplo de esto es el componente FileSystemWatcher de Visual Studio el cual nos permite añadir un gancho (hook) al sistema de ficheros NTFS el cual gatillará en un evento según los archivos o directorios que estemos monitoreando sin crear ningún evento adicional de comprobaciones constantes.

Mi idea en este artículo es mostrar cómo, usando técnicas ya conocidas en documentos anteriores, "limpiar" nuestro sistema e incluso crear un verdadero estado de reposo de Windows.

Importante
Windows Vista tiene la particularidad de tener una infinidad de servicios constantemente corriendo y en este caso podría ser algo más complicado detectar cuáles son realmente eventos descartables y cuáles no, lo que dificultaría un poco la tarea.

Todo el transcurso del documento ocurrirá en una máquina con Windows XP, aunque la solución es válida también para Vista, con pequeñas excepciones.



1. Un vistazo previo al sistema

El polling está presente en miles de programas y servicios, de disco, registro y red por lo que sería sencillamente imposible poder dar una solución universal. Así este documento sólo se centrará en quitar el polling del registro de mi equipo portátil, corriendo sobre Windows XP Home y con varios años de aplicaciones pero en general bastante limpio.

Primero necesitamos el infaltable Regmon o en su defecto el hermano mayor Process Monitor (aunque sinceramente el primero es suficiente para este artículo). Veamos que consultas se hacen al registro en mi equipo en reposo:



Cada aproximadamente un segundo se hace una seguidilla de consultas al registro, originadas por dos aplicaciones. Nuestro objetivo entonces será lograr el "reposo casi absoluto" del sistema eliminando esas consultas.


2. Primer enemigo, "winlogon.exe"

¿Por qué "winlogon.exe" está consultando un registro llamado "KaspeskyLab" constantemente como vimos anteriormente?

Raro.

Les revelaré la verdad, KasperskyLab es una llave de registro del antivirus que tengo instalado KAV, y el porqué winlogon está consultando esa llave es por algo llamado "Winlogon Notification" que les permite a los desarrolladores colgar una librería DLL al proceso que controla funciones como la protección del inicio por medio de CTRL+ALT+SUPR, el bloqueo de la sesión en el protector de pantalla y otras funciones base del equipo.

Importante
La versión de KAV utilizada aquí es la 6, Kaspersky Antivirus 6.0. La versión de prueba disponible en el sitio.

Sin embargo luego de probar la versión 7 del mismo producto, descubrí que aunque no produce este problema, genera (al parecer no al momento de la instalación) otro problema de Polling, en este caso de disco:



Si lo notan bien, está consultando constantemente un archivo o directorio no existente. En este caso muchas veces más por segundo que en el problema con Winlogon, generando la clásica actividad de disco "fantasma" que suele molestar bastante.

Informé hace una semana de este problema a la empresa desarrolladora (claramente sin ninguna respuesta hasta el momento de la publicación de este documento).


De esta forma, winlogon nos ofrece un par de eventos que se gatillarán en ciertas acciones, así podemos buscar la entrada del antivirus, la que cuelga la librería que produce este polling de registro:



Como se aprecia en la imagen, en este caso la librería es klogon.dll y si se dan cuenta, por ejemplo cuando winlogon dice "¡hey!, ¡klogon!, voy a iniciar sesión" (Logon), klogon ejecutará "WLEventStop". De la misma forma, cuando winlogon le dice "¡psst!, ¡klogon!, ahora voy a cerrar sesión" (Logoff), klogon ejecutará "WLEventStart" (función que klogon tiene en su código al igual que la de detención).

Pero que cosa más extraña dirás tú, ¿Por qué al iniciar sesión (cargar el entorno de usuario) se está "deteniendo" algo y al cerrar sesión se está iniciando algo?

¡Pues porque deseamos trabajar fuera de la sesión!, en efecto, el antivirus Kaspersky tiene una opción para mostrar un "logo" en la pantalla de inicio de sesión:



Recapitulemos: es decir que klogon, colgado de winlogon está todo el santo día revisando una clave de registro, la que define si en la ventana de inicio de sesión mostrará o no un logotipo del antivirus en una esquina. ¡Todo el día, a cada segundo, consultando seis veces ese mismo registro para una función estética!, ¿no es creíble tanta incompetencia cierto?, pero es así, los desarrolladores de uno de los mejores antivirus con una solución de esta calaña, lamentable.

Ok, ok, todo bien, los desarrolladores de KAV son torpes Sr. Einstein. ¿Cómo se podría haber solucionado según UD?

No es lo que quería decir, sólo era para destacar la incompetencia que hay en pequeños pero importantes detalles, más aun cuando no vemos lo que hay "under the hood" y lo que es visible nos demuestra ese exceso de desperdicio de recursos nos lleva a cuestionarnos la situación.

La solución limpia hubiera sido que el mismo klogon hubiera preguntado sólo cuando era necesario cargar ese logotipo y no constantemente, es decir luego de que winlogon notificase del cierre de sesión, se consulte el registro, una vez.


¿Cómo solucionamos este problema en el equipo?, simple, removiendo la notificación de winlogon. Aquí puedes elegir entre mostrar el logotipo de KAV en la pantalla de inicio de sesión o desperdiciar 518400 consultas al registro por día, en claro desmedro del tiempo de respuesta de tu equipo. Autoruns nos simplifica la tarea, aunque también pudo haber sido ejecutada de forma manual, eliminando la clave de "klogon" en el registro (incluso desde la clave que nos señala Autoruns):



En este momento, reiniciamos y observamos los cambios en nuestro equipo en "reposo":




3. Enemigo final, "vmware-authd.exe"

Como vimos anteriormente, este proceso continuamente está consultando una clave llamada "Disable performance counters". Pero, ¿por qué hace esto?

El archivo en cuestión es un servicio de licencias para VMWare Workstation, un conocido programa de virtualización (máquinas virtuales). El sistema operativo Windows lleva un registro de contadores de eventos que ocurran y en general, esta es una información bastante valiosa para administradores de sistema. De hecho, Windows Vista analiza la información de estos contadores y nos ayuda a diagnosticar problemas del sistema sin conocer mucho el trasfondo de los mismos:



El detalle de todo esto es que la duda aún se mantiene, ¿por qué este servicio está consultando constantemente un registro del que podría simplemente colgar un evento y ahorrarnos millares de accesos al registro?

Hay varias soluciones a este "problema", la primera es simplemente finalizar el proceso (aunque claramente, volverá al reiniciar el equipo). La segunda será establecer el inicio del servicio en "demanda", es decir en modo manual:



El problema de la segunda solución es que algunas veces las aplicaciones esperan que un servicio que instalaron anteriormente esté siempre respondiendo y en vez de iniciarlo generan un error, produciendo molestias al usuario. También, aunque el servicio sea iniciado en demanda, el problema de las consultas innecesarias se mantendría hasta un apagado del equipo.

En este caso, esas soluciones no son un reto, sin embargo editar el ejecutable del servicio para corregir y eliminar esas consultas de raíz, sí que lo es.


4. Un retoque bajo el capó del servicio

Nota
Las correcciones de los problemas que se enumeran a continuación no pueden ser publicadas en forma de un archivo modificado o instalador, pues así se violaría el acuerdo de licencia de los posibles productos afectados por los cambios. Sin embargo, mi idea es mostrar las formas en que podrían ser reparadas, en forma de conocimiento computacional general.


Abrimos el Ollydbg y lo adjuntamos al proceso del servicio en cuestión:



Buscamos la referencia de sus constantes consultas al registro, simplemente usamos el buscador de referencias a cadenas de texto:



Un detalle interesante es que la respuesta del sistema es que no se encontró el registro consultado:



Por experimentar, podríamos crear una clave:



Sólo para darnos cuenta que sin importar lo que exista, este servicio nunca cesará sus inútiles consultas:




5. ...Ahora no está, ¡ahora sí está!

Como en un rato jugando con Ollydbg no pude encontrar una solución sencilla, comencé a depurar el proceso con el debugger de Visual Studio, que precisamente funcionó mucho mejor para esta tarea.

Ahora fue fácil encontrar rápidamente la llamada que gatillaba todas las consultas al registro, la cual afortunadamente tenía un salto condicional sobre ella:



Con lo poco que trasciende el valor del registro (como lo comprobamos anteriormente) lo más trivial fue cambiar ese salto condicional por uno incondicional:



Detenemos el servicio, guardamos la pequeña modificación y volvemos a iniciarlo sólo para comprobar con satisfacción que ahora el equipo ahora está en un reposo absoluto y en consiguiente, el polling ha sido derrotado exitosamente. Lamentablemente, el villano escapa, débil, pero aún con vida, para volver fortalecido con cada siguiente versión de cualquier aplicación pobremente programada, a ralentizar nuestro equipo.

Resumiendo, la segunda parte de la solución se trata de modificar un byte del ejecutable como se muestra a continuación:




6. Conclusiones

Un poco de la lógica de siempre y los pequeños problemas fueron corregidos satisfactoriamente. La invitación queda abierta para que revises tu equipo, busques estos forados por donde se cuela tu performance y los elimines.

Nota mental
No usar KAV como antivirus, o por lo menos esperar a que la empresa haga un producto completamente depurado. Hasta el momento estoy probando Bitdefender 2008 y puedo comprobar lo poco optimizado que estaba el producto de Kaspersky. (Incluso cuando yo tiendo a desactivar todas las funciones extras molestas y opciones contextuales, para dejar sólo el monitor de archivos en tiempo real)


Como anécdota positiva queda el pequeño artículo en Wikipedia que escribí en conjunto con el presente documento pues no existía en nuestra lengua.

Haga clic sobre una de las estrellas para calificar este artículo.

Opiniones y comentarios (Escribir un nuevo comentario)
Que es una computadora ?
Escrito por Milla (28/07/2009 01:45 PM)
uhmm..
Escrito por Erwin Ried (29/07/2009 02:32 PM)
Erwin, soy manolo, de España, buen artículo, me ha gustado tanto tu web que, pensé: ¿por qué no hacerme yo una? y mi dirección es: http://spamvshombre.blogspot.com Es sobre informática :)
Escrito por Manolo (17/03/2008 09:51 AM)
¡Genial!, estaré al tanto de tus actualizaciones
Escrito por Erwin Ried (17/03/2008 03:29 PM)
Hola Erwin, necesito hacerte una pregunta, sabes como puedo ejecutar un archivo "ejecutable" (.exe) con un usuario diferente de manera permanente (sin nececidad de iniciar sesión con el mismo) o si existe una aplicación que lo haga, hace un buen rato que estoy buscando como solucionar ese problema y no he encontrado nada en Internet, saludos y felicitaciones por las "Avatar Utilities" me han ayudado "N".
Escrito por Darthtallgeese (04/03/2008 07:47 PM)
No entiendo que tiene que ver este comentario aquí, pero en "Avatar Utilities" encontrarás una aplicación que yo hice que hace eso que pides, está en "Extras"
Escrito por Erwin Ried (04/03/2008 10:02 PM)
Porfa explicanos como desactivar el klogon Gracias
Escrito por CD (14/02/2008 02:16 PM)
Con "Autoruns" de Sysinternals, como lo muestro en una imagen del documento, simplemente lo deshabilitas y reinicias
Escrito por Erwin Ried (14/02/2008 08:00 PM)
Primero O.ó Buen documento, ha sido uno de los que me a agradado mas, felicitaciones.
Escrito por SirMauricius (06/02/2008 07:16 PM)

Copyright © 2013 por Erwin Ried.