Share via


El gran misterio de la memoria Skype Empresarial

Este artículo fue escrito por Kenn Guilstorf, ingeniero de escalación de Skype Empresarial.

Como ingeniero de escalación, ayudo a los clientes con algunos de los problemas más "persnickety" Skype Empresarial. Últimamente, he recibido bastantes casos que están "basados en el rendimiento": básicamente, las quejas que Skype Empresarial son lentas o lentas, no permiten el uso compartido de aplicaciones o simplemente usan demasiada memoria. Muchas veces, una investigación de estos casos muestra que el usuario ha dejado que Skype Empresarial se ejecute durante semanas; y, con el tiempo, la memoria se ha deslizado hasta que afecta al rendimiento. Incluso lo he notado yo mismo cuando dejé que Skype se ejecute durante mucho tiempo. Entonces, ¿qué hace Skype y por qué contiene tanta memoria? (Esta es una pequeña sugerencia: Esto es normal y por diseño. No hay nada malo: todos y cada programa nativo se ejecuta en esto).

¿Cuánta memoria puede masticar?

El primer paso para corregir cualquier problema es comprender el problema y el primer paso para comprender cualquier problema es definirlo. Esto no es tan fácil de hacer como parece.

Cuando se inicia por primera vez Skype Empresarial (SfB), el uso de memoria es comparablemente pequeño (si puede contar 100 MB como pequeño). Podemos ver que esto ocurre en cualquier número de herramientas, como el Administrador de tareas:

Captura de pantalla que muestra los detalles de la aplicación Lync en la ventana Administrador de tareas con valores de memoria 83 428K.

Figura 1: No se deje engañar: Lync.exe es el nombre del proceso para SfB (versión de 32 bits)

Con el tiempo, la cantidad de memoria que usa el proceso va a crecer. La cantidad de tamaño que crece se determinará por la cantidad de Skype que se usa, para qué se usa, etc. Por ejemplo, este es el mismo cliente después de aproximadamente 24 horas:

Captura de pantalla que muestra los detalles de la aplicación Lync en la ventana Administrador de tareas con Memoria que aumenta a 115 196 000.

Figura 2: El mismo SfB 24 horas más tarde

Por lo tanto, Skype ha consumido aproximadamente 32 MB en 24 horas. Eso no es mucho, ¿verdad? Realmente no lo es, hasta que explique que Skype estaba sentado inactivo durante todas esas 24 horas. Básicamente, comencé a Skype Empresarial en un equipo, lo bloqueé y esperé unas 24 horas antes de desbloquearlo. En uso, el peaje habría sido mucho mayor, especialmente si me uniera a las reuniones, usara el uso compartido de aplicaciones o el uso compartido de escritorio en esas reuniones, usara mensajería instantánea, etc. He visto casos en los que Skype Empresarial uso de memoria creció a 300-500 MB en un solo día. Las cosas se pueden poner en cubos después de una o más semanas de uso, especialmente en el cliente de 32 bits con más restricciones de memoria.

Mostrarme la memoria

Hay muchas herramientas que pueden generar perfiles de memoria. Una de las más populares, al menos en Microsoft, es la herramienta SysInternals VMMap, disponible en VMMap v3.26. Podemos usarla para examinar la memoria del proceso y ver si podemos generar perfiles de la memoria Skype Empresarial.

Después de descargar VMMap, ejecútelo. A medida que se inicia, se abrirá una lista de procesos para que pueda elegir el proceso que desea examinar. Elegiré lync.exe y haga clic en Aceptar.

Captura de pantalla que muestra el mapa de V m al principio con Lync seleccionado.

Figura 3: VMMap al inicio

A continuación, verá un gráfico que es una representación multicolor del perfil de memoria actual para el ejecutable que ha seleccionado, Lync.exe, en este caso.

Captura de pantalla que muestra la representación multicolor del perfil de memoria.

Figura 4: Inicio de VMMap para los Lync.exe iniciados recientemente

Hay mucha información aquí, y describirlo todo rellenaría una o varias entradas de blog propias. Si está interesado, hay varios libros excelentes y artículos en línea que pueden ayudarle a explicarlo. (Personalmente, recomiendo "Windows avanzado" por Jeffrey Richter – actualmente fuera de impresión, pero todavía excelente para explicar cómo funciona la memoria. Puede encontrar copias usadas de él en su tienda de libros favorita).

Como puede ver, la memoria que se muestra en el Administrador de tareas no se alinea con ninguna categoría de VMMap. El Administrador de tareas es una representación más generalizada; es preciso, simplemente no cuenta todo. VMMap es mucho más completo.

Esta es nuestra instancia de Skype después del período de espera de 24 horas:

Captura de pantalla que muestra el mapa de V m para Skype después de 24 horas.

Figura 5: VMMap para Skype después de 24 horas

¿Dónde está la memoria?

Si compara cada categoría individual, nada se alinea realmente. Encontrar realmente lo que consume la memoria es difícil de hacer porque las categorías de memoria fluctúan a medida que se realizan y liberan objetos y solicitudes de memoria, y la memoria se reserva y confirma para almacenar varios objetos. El "kernel de conocimiento" (para los fines de este blog, de todos modos) es la categoría "Gratis". En nuestro ejemplo, la memoria "libre" es todo el espacio disponible que está "reservado" para el archivo ejecutable de Lync. Pero solo se muestra un determinado tipo de memoria "confirmada" en el Administrador de tareas. La memoria reservada no se cuenta porque no está en uso.

¿Dónde está la memoria? Esto resulta difícil de identificar porque no se pierde la memoria. Contrariamente a la creencia popular, el equipo de Skype no fue subvencionado por los fabricantes de memoria de escritorio. No hay ningún trazado nefasto para que los clientes actualicen cualquier sistema o memoria. Ni siquiera es un caso de obsolescencia planeada. La verdad es un poco más difícil de explicar.

Vamos a retroceder un poco para que las cosas sean más claras. La primera vez que inicia el cliente de Skype Empresarial, tiene una superficie de memoria relativamente pequeña, normalmente 100 MB o más, dependiendo del número de contactos de los que realice un seguimiento por usted y de otra sobrecarga (puede ver claramente esto en los datos anteriores). Después de unos días, observará que esta superficie crece varios cientos de miles de bytes a varios megabytes. En determinadas situaciones, esto puede ser un problema, pero no es necesariamente un problema en Skype Empresarial sí mismo. En su lugar, es un efecto del paradigma de programación de Windows y cómo controla la memoria de forma nativa.

¿Qué programación de Windows?

Solo voy a dar una vista simplista de la memoria de Windows aquí. La memoria de Windows se controla a través de procedimientos costosos (en términos de ciclos de equipo y recursos) conocidos como asignaciones y desasignaciones. Cuando un programa necesita memoria, pide a Windows que la asigne. Cuando se acabó con la memoria, el programa pide a Windows que la desasigne. Internamente, Windows pasa por varios procesos para administrar las solicitudes de memoria.

Cuando se realiza una solicitud, Windows comprueba la memoria que ya se ha confirmado en el proceso, pero que el proceso no está usando. Windows busca ver si hay un bloque de memoria lo suficientemente grande como para usarlo. Si lo hay, el sistema lo usa y sigue su camino alegre. Si no lo hay, comprueba la memoria reservada. Si hay un bloque suficientemente grande de memoria reservada, la confirma (en fragmentos definidos por el sistema operativo conocidos como "páginas") y almacena la variable en ella. La memoria ya está confirmada y acabamos de crecer la superficie de memoria del ejecutable.

¿Qué ocurre si no hay suficiente memoria reservada para controlar la solicitud? El sistema operativo intenta reservar más memoria, si es posible. Aquí es donde entra en juego la diferencia entre la arquitectura de 32 bits y la arquitectura de 64 bits. Un proceso de 32 bits solo puede usar un máximo de 4 GB de memoria. Esto se debe a que 4 GB es la cantidad máxima que un registro de 32 bits puede abordar. (Un bit solo puede contener un binario de 1 o 0. Por lo tanto, 32 bits significa que 232 es la dirección más alta permitida). Gracias a la arquitectura de 32 bits, solo se asignan aproximadamente 2 GB de esa memoria al propio proceso, el resto lo usa el sistema operativo para asignar archivos DLL comunes, cuidar de objetos comunes en modo kernel, etc. En un sistema de 64 bits, los registros largos de 64 bits pueden controlar 264, lo que resulta ser aproximadamente 18 exabytes. Sin embargo, Windows limita artificialmente la cantidad de memoria disponible para reservarse a entre 2 terabytes y 4 terabytes (TB), en función de la versión de Windows.

Una vez reservada la memoria, se confirmará y se usará como antes. El proceso de desasignación es en gran medida inverso, excepto uno o dos detalles pequeños pero importantes.

En primer lugar, a menos que se solicite, Windows nunca "borra" la memoria. Cuando la memoria se desasigna, se marca como libre en el mapa de memoria de Windows. Todo lo que haya mantenido sigue ahí y permanecerá allí hasta que se sobrescriba por otra asignación. A continuación, Windows rara vez elimina la confirmación de memoria a menos que se le solicite hacerlo. Como dije anteriormente, las operaciones de memoria son bastante costosas para los recursos. Por lo tanto, si un programa necesitaba la memoria asignada anteriormente, Windows se supone que puede necesitar esa memoria de nuevo y mantendrá desasignada la memoria hasta que tenga que hacerlo de forma absoluta. Por último, Windows nunca "fusiona" memoria. Esto significa que la memoria que Windows libera nunca se "agrega" y los bloques de memoria libre nunca se "mueven juntos" para crear bloques más grandes de memoria libre. (Todas estas funciones se agrupan en una categoría que se conoce como "recolección de elementos no utilizados". .NET Framework tiene algunas características de recolección de elementos no utilizados. Sin embargo, Skype Empresarial es una aplicación "nativa" o non-.NET).

Skype Empresarial procesa muchos objetos cada segundo que tienen un tamaño variable. Tiene que hacer esto para ser la herramienta impresionante que queremos que sea. Le pedimos que administre contactos, administre calendarios (reuniones), mensajería instantánea con nuestros amigos, familiares y compañeros e incluso hable con ellos mediante voz y vídeo, comparta escritorios o ventanas, etc. Bueno, para citar al difunto, gran Robert Heinlein, entre otros: "No hay tal cosa como un almuerzo gratis".

La administración de tantos objetos de tamaños diferentes y a menudo variables crea asignaciones y desasignaciones de fragmentos de memoria de tamaño variable. Con el tiempo, esto provoca la fragmentación de memoria, a veces grave, que aumenta la superficie de memoria de Skype Empresarial.

Un ejemplo podría ilustrar mejor este punto. Supongamos que Skype (o cualquier programa nativo, en realidad) asigna 64 objetos, numerados de 1 a 64, que tienen un tamaño de 4 K bytes cada uno:

Captura de pantalla que muestra los objetos de Skype 64.

Figura 6: 64 objetos, cada uno con 4 KB de memoria

Esto provoca un compromiso y asignación de memoria de 256 KB. Ahora, supongamos que el programa no requiere los objetos numerados uniformemente, por lo que los libera:

Captura de pantalla que muestra todos los objetos pares publicados.

Figura 7: Liberar todos los objetos numerados uniformemente libera 128 KB de memoria.

Si observa la imagen más grande de la memoria general (mediante VMMap o una herramienta similar), verá que una de las columnas confirmadas (probablemente en la sección Montón , pero depende exactamente de cómo el programa solicitó la memoria) tiene 128 KB menos y la sección Gratis ha aumentado en 128 KB. En el Administrador de tareas, el programa ahora solo posee 128 KB de memoria.

A continuación, supongamos que nuestro programa tiene un único objeto de 8 KB que tiene que almacenar. Esto debería ser sencillo. Después de todo, tiene 128 KB gratis. Sin embargo, al intentar almacenar ese objeto de 8 KB se creará una nueva reserva de memoria en lugar de almacenar la memoria en el espacio libre de 128 KB. Esto se debe a que, si observa la memoria, puede ver que todavía está segmentada en fragmentos de 4 KB. Windows no tiene un bloque de memoria lo suficientemente grande como para contener el objeto de 8 KB, por lo que tiene que reservar y confirmar más memoria en el programa.

Este es un ejemplo bastante contrived, pero ilustra la dificultad de la administración de memoria de Skype. Skype administra un gran número de objetos que no tienen un tamaño fácil de definir. Todos estos objetos tienen una longitud variable. Esto significa que a medida que los objetos se almacenan y liberan, especialmente durante un largo período de tiempo, como días o semanas, la fragmentación de la memoria puede ser grave y, dado que Windows tiene que asignar más memoria para almacenar los nuevos objetos, la superficie de memoria crece excesivamente.

Cuando esto provoca problemas en el cliente de 32 bits, con frecuencia se recomienda pasar al cliente de 64 bits porque la memoria está mucho menos restringida allí, gracias a la arquitectura de 64 bits frente a 32 bits. Sin embargo, el crecimiento excesivo de la memoria, entre otras consideraciones, puede causar lentitud incluso en el cliente de 64 bits. Estas otras consideraciones incluyen la memoria general del sistema, las velocidades de disco (porque la memoria del programa suele estar respaldada por memoria virtual en el archivo de paginación de Windows), cuántas otras aplicaciones están abiertas, etc. En ambos casos, a medida que la superficie de memoria Skype Empresarial crece con el tiempo, peor será su rendimiento. En el caso del cliente de 32 bits, esto puede hacer que los objetos más grandes que Skype requiere (como su búfer interno para el uso compartido de aplicaciones) se queden sin espacio y provoquen errores.

Para ser justos, la memoria es solo un recurso que se consume con el tiempo, pero es el más obvio. Controlar el uso puede aumentar, los subprocesos aumentarán con el tiempo, la memoria del grupo paginado aumentará, etc. Cada uno de estos aumentos puede tener un impacto en el proceso y, en determinados casos, en todo el sistema operativo. Esta es una de las múltiples razones por las que sugerimos, incluso para el cliente de 64 bits, que los usuarios salgan y reinicien Skype diariamente (o, al menos, semanalmente) como procedimiento recomendado.

¿Qué hago al respecto y puedo forzar el reinicio de Skype?

Hay varias maneras de forzar un reinicio de Skype, pero no hay ninguna manera única y mejor. Una forma, por supuesto, es la educación del usuario. Los usuarios son los árbitros de su uso de escritorio en la mayoría de los casos, por lo que es pragmático enseñarles a cerrar la sesión y cerrar Skype cuando salgan por el día. Esto también se puede hacer como un paso obligatorio escribiendo un script o ejecutable personalizado y, a continuación, ejecutando uno como una tarea del Programador de tareas. Ese enfoque es un poco difícil de usar y puede hacer que Skype se cítee incluso cuando está "en uso" (aunque esto se puede mitigar un poco a través de las condiciones del programador de tareas). También hay oportunidades de terceros para la administración de equipos y equipos de escritorio, posibles opciones de BIOS, etc.

La conclusión es que lo mejor para Skype Empresarial es recorrerlo diariamente o, al menos, semanalmente. Si puede entrenar a los usuarios para que reciclen Skype Empresarial de forma regular (o, al menos, cuando las cosas se vuelvan extrañas), es probable que tenga muchas menos llamadas del departamento de soporte técnico y muchos usuarios más felices.