¿Por qué Windows 2008 usa el intercambio antes de que la memoria esté llena?


9

Administro un servidor Windows 2008 (bueno, en Amazon EC2) con IIS y una aplicación web .NET4. Recibí una alerta de memoria el otro día y fui y miré, y efectivamente, la memoria del proceso había crecido con el tiempo a través de algún tipo de fuga lenta. No creció mucho, al igual que 60M a 200M, pero sucedía lo suficiente con la caja que superó nuestro umbral bastante bajo (75%) para encender el monitor.

Reciclé el conjunto de aplicaciones y la memoria se liberó, y al revisar las estadísticas noté que el espacio de intercambio se estaba utilizando significativamente y que más de 1 GB se liberó con ese reciclaje.

Tal vez esta es una pregunta básica, pero soy un tipo de UNIX y estoy acostumbrado a intercambiar no acostumbrarme hasta que se quede sin memoria. Este cuadro nunca ha superado el 75% de uso de memoria. ¿Es esto una cosa de Windows o una cosa de .NET o una cosa de Amazon? Sospecho que hay una pérdida de memoria mucho mayor en esta aplicación de lo que se sospecha: no está goteando de 60M a 200M, está goteando de 60M a 1.2GB, pero ¿gran parte de eso de alguna manera se está "enfriando" y siendo empujado a cambiar?

Tengo el reciclaje de memoria configurado en el grupo de aplicaciones, pero activa la memoria completa de la caja, por lo que esta aplicación podría ser realmente grande antes de reciclarse automáticamente.

Podría configurar el reciclaje regular "programado", pero esa es una solución alternativa, conseguiré que el desarrollador arregle la aplicación, pero necesito entender lo que está sucediendo aquí con el uso de intercambio para asegurarme de que estoy entendiendo esto correctamente.

Editar con más información: memoria de instancia: 1.7 GB de intercambio: 4.5 GB

Veo el proceso w3wp.exe en taskmgr que muestra esa memoria: 211,000k. Pero cuando lo reinicié (está en su propio grupo de aplicaciones, y es la única aplicación en la caja), su uso de memoria se redujo a su punto de partida normal de 60M y, como 1 GB + de intercambio, también se liberó. En taskmgr, solo tenía la estadística habitual de Memoria (Conjunto de trabajo privado), pero vi el cambio cambiar a través de mi otro monitoreo (Cloudkick). Volviendo y viéndolo hoy, la memoria está de vuelta a 195M en el proceso (1.2 GB en total) y el intercambio se ha movido de 1.0 GB a 1.1 GB, no regresó a donde estaba (graficando con el tiempo, es un lento arrastre).

Estoy menos preocupado por esta aplicación específica y más preocupado por entender cuándo Windows cambia y cómo lo usa, y qué preocuparse por la memoria de Windows y el uso de intercambio en general.


44
Por cierto, al menos en Linux será intercambiar páginas oportunista si no se ha accedido en un largo tiempo, incluso si el sistema no está acercándose a punto de utilizar toda la memoria RAM disponible. Lo hace para liberar memoria de caché de disco, tampones, etc.
EEAA

¿Cuánta memoria tiene esta instancia? ¿Está diciendo que el proceso w3wp.exe está llegando a 1 GB? ¿Es este el único sitio que se ejecuta en ese grupo de aplicaciones?
Kev

@ KevΩ Agregó más información en la Q a su solicitud.
Ernest Mueller

@ErikA, es bueno saberlo, creo que he escuchado a los muchachos que dicen "si estás intercambiando ya tienes un rendimiento de mierda, simplemente apaga el intercambio por completo y no te quedes sin RAM", así que no No mire intercambiar tanto.
Ernest Mueller

Si su disco está dando vueltas al disco, eso es cierto. Si se intercambia, está haciendo espacio para buffers y demás.
Bart Silverstrim

Respuestas:


17

Windows y Linux tienen dos estrategias diferentes de intercambio de páginas.

Linux

Linux quiere evitar el uso de espacio de intercambio y espera hasta el último momento posible. Si ve una gran cantidad de intercambio en Linux, es probable que su sistema tenga o haya tenido problemas. Esta estrategia es buena para minimizar la E / S general del disco, que es la parte más lenta de su sistema, pero más débil para sistemas con períodos alternos de carga ligera y pesada (y, sinceramente, esa es la mayoría de nosotros). Los momentos en que su carga ya es pesada ahora se verán gravados por la E / S de disco "extra", o, dicho de otra manera, debe diseñar las compilaciones de su servidor con el objetivo de tener suficiente ram que no intercambie incluso durante el tiempos de carga más altos esperados.

Ventanas

Windows quiere tratar la memoria como un mero caché del archivo de página. Su memoria real siempre está en el disco, pero leerá / escribirá desde el "caché" primero si puede. Esta estrategia es buena para igualar su carga con el tiempo; cuando el sistema se ocupa y necesita intercambiar páginas, la página actual ya está en el disco y la mitad del trabajo ya está hecho. Este enfoque tenía mucho sentido cuando Windows era joven, 32 MB (olvídate de GB) todavía era mucha RAM, y la necesidad frecuente de usar espacio de intercambio era un hecho. Incluso hoy en día, esto es bueno para cargas de trabajo que alternan entre cargas ligeras y ocupadas, ya que ayuda a distribuir la E / S del disco de manera más uniforme con el tiempo.

Las versiones modernas de Windows tienen optimizaciones adicionales, como SuperFetch, para precargar y preparar páginas de memoria en el disco y en la RAM cuando la carga es ligera, para ayudar a evitar la necesidad de escribir discos adicionales al cargar un programa por primera vez. Todo esto significa que puede diseñar su sistema para que solo necesite suficiente RAM para algo menos que la carga más alta esperada, por lo que aún puede tener un rendimiento al menos aceptable todo el tiempo, con costos reducidos.

Convergencia

Este concepto de medir o predecir la carga en un entorno de prueba primero y luego asignar recursos de producción cuando se conoce la carga es un desarrollo relativamente reciente en la construcción del sistema, hecho posible, o al menos práctico, en parte con la llegada de servidores virtuales y luego en la nube . Dependiendo de su carga, incluso puede diseñar el sistema de manera que nunca necesite intercambiarse. En estos casos, Windows le permite desactivar la paginación y comportarse más como un sistema Linux. Sin embargo, debes tener cuidado; Si el diseño de su sistema requiere más memoria de la esperada, puede meterse en problemas de esta manera.

Por otro lado, los núcleos modernos de Linux están más dispuestos a cambiar a disco de manera oportunista que antes. Entonces, la diferencia en las estrategias de administración de memoria entre los dos sistemas todavía está presente, pero ahora es menos distinta de lo que solía ser. Ambos sistemas tienen sus méritos, y cada uno mira al otro para ver qué avances pueden copiar.


Muy específico en la estrategia final de Windows, ¡gracias! También validado por este Microsoft KB que encontré ... support.microsoft.com/kb/2267427
Ernest Mueller

1
Linux no necesariamente espera el último momento posible a menos que establezca explícitamente vm.swappiness = 0. Con el valor predeterminado 60, cambiará las páginas que no se han tocado en mucho tiempo.
Kjetil Joergensen

@KjetilJoergensen, asegúrese de leer la última sección sobre convergencia.
Joel Coel

1
@JoelCoel Retraigo incondicionalmente mis críticas :)
Kjetil Joergensen

7

Windows (y Linux y otros sistemas operativos similares a Unix) moverán las páginas que no se han utilizado durante algún tiempo al disco para dejar espacio para las memorias intermedias y la memoria caché para acelerar la actividad de E / S activa. Además, las aplicaciones a menudo asignan más memoria de la que van a usar de inmediato; esto puede alentar al Kernel a buscar algunas cosas que no se han tocado recientemente en segundo plano, de modo que dichas aplicaciones no vean el retraso de paginación cuando se inicien repentinamente usando esa asignación.

En Linux, puede modificar (o bloquear) este comportamiento alterando los valores de "intercambio" relevantes en el /procsistema de archivos; sin duda, hay valores de registro que puede modificar para alterar también el comportamiento de Windows a este respecto.

Otra cosa a tener en cuenta es que cuando algo ha sido paginado y luego leído nuevamente, el kernel no lo eliminará del archivo de la página hasta que el archivo esté lleno o la página en la RAM se modifique. De esta manera, si necesita volver a paginar ese fragmento, puede hacerlo sin tener que escribir realmente las páginas en el disco: el contenido ya está allí. Esto puede mejorar en gran medida el rendimiento en situaciones en las que el exceso de compromiso de memoria se ha vuelto tan malo como para causar la agitación de los archivos de la página (cantidades significativas de páginas constantemente asignadas dentro y fuera). Es probable que encuentre que algunos datos fueron eliminados por esa pérdida de memoria, y desde entonces han sido leídos de nuevo pero no borrados del disco en caso de que esas páginas necesiten ser mapeadas o RAM para hacer espacio nuevamente más tarde. En Linux, el valor "SwapCached" en/proc/meminfomuestra cuántos datos están presentes en páginas que tienen copias idénticas en RAM y en disco. Windows, sin duda, utiliza la misma optimización (o algo similar), pero no sé exactamente dónde mirar para ver cuánto está sucediendo (sin duda, hay contadores de monitor de rendimiento relevantes que puede consultar).

tl; dr: Esto es normal. Un kernel OS moderno intentará ser inteligente y maximizará la cantidad de RAM que puede usar como caché para guardar las operaciones de E / S, y a veces tendrá datos copiados en el disco y en la RAM para guardar las E / S si necesita extraer esos bits. de RAM más tarde. Lo más probable es, por contra intuitivo que sea, que este uso de archivos de página de estas dos formas, incluso si actualmente no tiene poca RAM, está mejorando su rendimiento general en lugar de disminuirlo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.