¿Cómo deshabilitar Mac OS X para usar el intercambio cuando todavía hay memoria "Inactiva"?


61

Un fenómeno común en mi uso diario (y varios otros según varias publicaciones en Internet) de OS X, el sistema parece volverse lento cada vez que no hay más memoria "libre" disponible. Supuestamente, esto se debe al intercambio, ya que la actividad de disco pesado es aparente y que vm_stat informa muchos pageouts. (Corrígeme del mal)

Sin embargo, la cantidad de RAM "inactiva" es típicamente alrededor del 12.5% ​​-25% de toda la memoria disponible (^ 1.) Cuando el intercambio comienza / ocurre / finaliza.

De acuerdo con http://support.apple.com/kb/ht1342 :

Memoria inactiva

Esta información en la memoria no se usa activamente, pero se usó recientemente.

Por ejemplo, si ha estado usando Mail y luego lo cerró, la RAM que Mail estaba usando está marcada como Memoria inactiva. Esta memoria inactiva está disponible para su uso por otra aplicación, al igual que la memoria libre. Sin embargo, si abre Mail antes de que otra aplicación use su memoria Inactiva, Mail se abrirá más rápido porque su memoria Inactiva se convierte en Memoria activa, en lugar de cargar Correo desde el disco duro más lento.

Y de acuerdo con http://developer.apple.com/library/mac/#documentation/Performance/Conceptual/ManagingMemory/Articles/AboutMemory.html :

La lista inactiva contiene páginas que actualmente residen en la memoria física pero a las que no se ha accedido recientemente. Estas páginas contienen datos válidos pero pueden liberarse de la memoria en cualquier momento .

Entonces, básicamente: cuando un programa se ha cerrado, su memoria se marca como Inactiva y debe poder reclamarse en cualquier momento. Aún así, OS X preferirá comenzar a cambiar la memoria al archivo Swap en lugar de reclamar esta memoria, siempre que la memoria "Libre" llegue a estar baja.

¿Por qué? ¿Cuál es la ventaja de este comportamiento sobre, por ejemplo, liberar instantáneamente memoria inactiva y ni siquiera tocar el archivo de intercambio? Algunas fuentes (^ 2.) Indican que OS X paginaría la memoria "Inactiva" para intercambiar antes de liberarla, pero eso no tiene sentido ahora ¿lo hace si la memoria se puede liberar de la memoria en cualquier momento ? El intercambio es costoso, la liberación es barata, ¿verdad?

¿Se puede cambiar este comportamiento usando alguna preferencia o un truco conocido? (Preferiblemente, uno que no incluya deshabilitar swap / dynamic_pager por completo y reiniciar ...)

Aprecio el comando de purga , así como el concepto de Reparar permisos de disco para forzar algo de memoria Libre, pero esas son formas de forzar dolorosamente más memoria Libre que en realidad arreglar la lógica de decisión de intercambio / liberación ...

Por cierto, se hizo una pregunta similar aquí: http://forums.macnn.com/90/mac-os-x/434650/why-does-os-x-swap-when/ y aquí: http: //hintsforums.macworld .com / showthread.php? t = 87688 pero a pesar de que los OP volvieron a hacer la pregunta central, ninguna de las respuestas responde a una respuesta ...

^ 1. ACTUALIZACIÓN 17-mar-2012 Desde la primera vez que publiqué esta pregunta, pasé de 4 gb a 8 gb de ram instalado, y el problema persiste. La cantidad de ram "Inactivo" era 0.5gb-1.0gb antes y ahora es típicamente alrededor de 1.0-2.0GB cuando el intercambio comienza / ocurre / termina, es decir, parece que alrededor del 12.5% ​​-25% del ram se conserva como Inactivo por osx lógica del núcleo

^ 2. Por ejemplo https://apple.stackexchange.com/questions/4288/what-does-it-mean-if-i-have-lots-of-inactive-memory-at-the-end-of-a-work- dia :

Una vez que se utiliza toda su memoria (la memoria libre es 0), el sistema operativo escribirá memoria inactiva en el archivo de intercambio para hacer más espacio en la memoria activa.

ACTUALIZACIÓN 17-mar-2012

Aquí hay un resumen de los métodos que se han sugerido para ayudar hasta ahora:

El comando de purga

"Se utiliza para aproximar las condiciones iniciales de arranque con una memoria caché de búfer de disco frío para el análisis de rendimiento. No afecta la memoria anónima que se ha asignado a través de malloc, vm_allocate, etc.".

Esto es útil para evitar que osx intercambie la memoria caché del disco (lo cual es ridículo que osx realmente lo haga en primer lugar), pero con la desventaja de que se libera la memoria caché del disco, lo que significa que si la memoria caché del disco no estaba por ser intercambiado, uno simplemente terminaría con un caché de búfer de disco frío, probablemente afectando negativamente el rendimiento

La aplicación FreeMemory y / o la reparación de permisos de disco para forzar algo de memoria libre

No ayuda a liberar memoria, solo mueve algunos gigabytes de contenido de memoria de RAM a HD. Al final, esto causa muchos intercambios cuando intento usar las aplicaciones que estaban abiertas mientras liberaba memoria, ya que gran parte de su VM ahora está en intercambio.

Acelerar la asignación de intercambio utilizando dynamicpagerwrapper

Parece algo bueno para acelerar el uso de intercambio, pero no aborda el problema del intercambio de osx en primer lugar mientras todavía hay memoria inactiva.

Deshabilitar el intercambio deshabilitando dynamicpager y reiniciando

Esto obligará a osx a no usar el intercambio al precio del sistema que se cuelga cuando se usa toda la memoria. No es una alternativa viable ...

Deshabilitar el intercambio utilizando un Dynamicpager hackeado

Similar a la desactivación de dynamicpager anterior, algunos extractos de los comentarios a la publicación del blog indican que esta no es una solución viable: "La memoria inactiva es alta como siempre". "cuando su sistema se está quedando sin memoria, todo el sistema operativo se bloquea ...", "si consume toda la memoria de la Mac, es probable que la máquina se bloquee"

En resumen, todavía no estoy al tanto de una forma de deshabilitar Mac OS X del uso de intercambio cuando todavía hay memoria "Inactiva". Si no es posible, tal vez al menos hay una explicación en alguna parte de por qué osx prefiere cambiar la memoria que se puede liberar de la memoria en cualquier momento .


1
Tengo este problema, ilustrado por estos números de Monitor de actividad: bassistance.de/i/f2322d.png Casi no hay memoria libre, pero hay mucha memoria inactiva. En lugar de reclamar eso, OSX prefiere comenzar a intercambiar mucho, como puede ver en las salidas de página de 40 GB.
Jörn Zaefferer

Tengo mucha memoria libre y todavía se utilizan varios GB de intercambio. 16GB rMBP.
Steven Lu

1
aparentemente algunas personas han reportado beneficios al ejecutar "purga" apple.stackexchange.com/questions/67031/… no negativo
rogerdpack

Respuestas:


19

Por definición, la memoria inactiva es la memoria que está lista para ser paginada, y paginarla puede implicar escribirla para intercambiarla. Este no es ningún tipo de problema o problema que deba optimizarse; de hecho, OS X funciona según lo diseñado .

Desafortunadamente, los escritores de soporte técnico no son desarrolladores de kernel, y la cita del artículo de soporte de la Base de conocimiento de Apple es simplemente incorrecta cuando afirma que la memoria inactiva es memoria no utilizada por los programas. Cuando sale de un programa, toda su memoria residente se vuelve Libre; No se detiene en Inactivo. Sin embargo, el segundo enlace al sitio del desarrollador que describe cómo funciona la administración de memoria es un buen recurso, si se lee por completo.

Existen muchas ideas erróneas sobre lo que significa "memoria inactiva" en OS X. Contrariamente a las ideas falsas, no toda la memoria inactiva está vacía, sin usar, en caché o purgable. De hecho, la memoria activa también se puede almacenar en caché o purgar, si se ha accedido recientemente. Mucha memoria inactiva también contiene datos que no se pueden descartar simplemente. Si se descartara, los programas se bloquearían, porque las páginas descartadas habrían contenido datos válidos (como dice la cita del desarrollador OS X), y los programas esperan que los datos que han almacenado en la memoria (virtual) no solo desaparezcan.

La memoria inactiva contiene los mismos tipos de datos que la memoria activa. La única diferencia es que OS X ha notado que algunos fragmentos de memoria no se han leído ni escrito en mucho tiempo.

La razón por la cual OS X clasifica alguna memoria como inactiva y otras regiones como "activas" tiene que ver con la paginación. Cuando la memoria se agote, tendrá que buscar algunos datos. La pregunta es, ¿qué datos? Si busca datos que un programa necesita de inmediato, pierde tiempo y no logra nada. Por lo tanto, desea extraer la memoria que un programa no necesitará usar de inmediato.

Es difícil anticipar qué páginas serán innecesarias en el futuro porque un programa puede usar su memoria virtual, sin embargo, le gusta y no le dice nada al sistema operativo sobre cuáles son sus planes. Pero como heurístico, la mayoría de los programas son "pegajosos" en su uso de memoria; si no han usado alguna pieza de memoria en un tiempo, es probable que continúen sin usar esa memoria y que continúen usando la memoria que han usado recientemente.

Entonces, cuando el sistema operativo decide extraer algunos datos, toma la estrategia de intercambiar páginas que no se han utilizado recientemente. Es por eso que OS X clasifica la memoria que están ocupando los programas en dos montones de "activo" e "inactivo". El enlace publicado anteriormente al sitio del Desarrollador, si se lee completamente, indica cómo ocurre ese proceso:

  • Cuando la memoria comienza a agotarse, el sistema operativo comienza a pasar por las páginas de memoria activa y establece un indicador en cada una.
  • Si un programa lee o escribe en una página, se borra la bandera.
  • Si, después de algún retraso, la bandera no se borra, esa página se ordena en la pila "inactiva".
  • Si su programa accede a una página "inactiva", se vuelve a colocar en la pila "activa".
  • Cuando se agota la memoria, las páginas "inactivas" se eliminan.

Tenga en cuenta que este proceso de clasificación para decidir qué memoria intercambiar es similar en todos los sistemas operativos modernos. Linux tiene las mismas dos listas de páginas activas e inactivas, como se describe en Descripción del Administrador de memoria virtual de Linux . Windows podría usar algo un poco diferente con más de dos clases de experiencia reciente; No puedo encontrar una descripción técnica reciente y confiable en este momento. Se discuten más implementaciones en la página de Wikipedia titulada "Algoritmo de reemplazo de página" . La única diferencia con OS X era cómo se mostraban las estadísticas: alguien decidió que sería una buena idea mostrar números separados para el topmonitor activo o inactivo en el Monitor de actividad. En retrospectiva, esto probablemente no fue una buena idea (y esto ha cambiado en OS X 10.9).

Este proceso de establecer y borrar marcas y mantener montones activos / inactivos requiere un poco de potencia del procesador. Por esa razón, OS X no lo hace cuando hay mucha memoria libre. Por lo tanto, los primeros programas que inicie aparecerán como toda la memoria "activa" hasta que la memoria libre comience a agotarse.

Entonces, a medida que comienza desde una pizarra en blanco y abre más y más programas, puede esperar ver la siguiente progresión en el Monitor de actividad:

  • Primero, hay mucha memoria "libre" y muy poca inactividad. Esto se debe a que el marcador de memoria no ha comenzado a ejecutarse.
  • A medida que disminuye la cantidad de memoria libre, OS X comenzará a ejecutar su marcador de memoria y comenzará a ver que aumenta la cantidad de "inactivo". Cada bit de "inactivo" estaba previamente "activo".
  • Cuando se quede sin memoria libre, las páginas de la pila "inactiva" se eliminarán. El indicador de memoria también ejecutará la inclinación completa clasificando la memoria en activa e inactiva. Por lo general, verá una gran cantidad de "inactivos" mientras se escribe en el intercambio, lo que indica que el indicador de memoria está haciendo lo que se supone que debe hacer.

Las páginas debenser clasificado como inactivo antes de que se cambien. Eso es lo que significa la cita del sitio para desarrolladores de Apple cuando dice "Estas páginas contienen datos válidos pero pueden liberarse de la memoria en cualquier momento". Esto está en oposición a las páginas activas, que no se lanzarán hasta después de que hayan sido degradadas a inactivas. Hay varias formas de publicar páginas; Si la página se asignó desde un archivo y no se ha modificado, se puede eliminar de inmediato y volver a leer a pedido. De manera similar, si se trata de memoria que se había intercambiado previamente y no se había modificado desde que se cambió. Los programas también pueden asignar explícitamente caché y memoria purgable, para almacenar datos que pueden olvidarse y recrearse a pedido (pero la razón por la cual un programa asignaría caché es si lleva mucho tiempo recrear esos datos.

Por lo tanto, al observar la cantidad de memoria "inactiva" en el Monitor de actividad y ver que hay mucha inactividad al mismo tiempo que la computadora escribe para intercambiar, solo le indica que el sistema está funcionando según lo diseñado.

También existe una confusión entre la memoria inactiva y la caché de archivos. No estoy seguro de por qué existe esa confusión, porque el Monitor de actividad ya los enumera en encabezados separados. La memoria caché es la memoria utilizada para almacenar datos recientes que se han leído o escrito desde el sistema de archivos, en caso de que sea necesario volver a acceder a ellos. Cuando la memoria es baja, OS X tiende a deshacerse del caché primero. Si tiene intercambio de palabras y el monitor de actividad muestra una gran cantidad de caché (NO inactivo), eso sería un problema. Pero la memoria inactiva es una cosa diferente.

En caso de duda, ignore la distinción entre "inactivo" y "activo". Considérelos como un grupo de "memoria utilizada por los programas" y sume los dos números. Esto es lo que hace cualquier otro sistema operativo cuando le informa sobre el uso de la memoria.

NOTA para OS X 10.9: Mavericks introdujo la "compresión de memoria" que es, más o menos, otra capa de intercambio. Las páginas activas ahora se clasifican como inactivas, luego se comprimen (lo que puede aparecer como memoria Kernel dependiendo de las herramientas que esté usando) y luego se escriben para intercambiarse a medida que aumenta el uso de memoria. Mavericks también ha dejado de mostrar números separados para activos e inactivos en Activity Monitor, ya que resulta que no es algo útil de ver, especialmente dados los conceptos erróneos que lo rodean.


4

Actualmente no hay una manera fácil de ajustar el comportamiento de intercambio (o así se llama) de macos X. Sin embargo, hay algunos hacks disponibles (requiere cuenta de desarrollador y SDK):

http://cestdelamerde.com/archives/22-Killing-Mac-OS-X-Swapping-How-To-Disable-dynamic_pager.html

http://dropsafe.crypticide.com/article/3848

¡Buena suerte!

Posdata. Supongo que es posible que desee leer esta respuesta (también por mí) para tener una revisión más general de qué memorias activas, inactivas y de otro tipo en MacOSX: Memoria cableada vs. Memoria activa en OS X


Gracias por sus respuestas Ajustar el intercambio definitivamente ayudaría, ¡lástima que no sea fácil! Con respecto al primer enlace, realmente estoy buscando un truco que no incluya deshabilitar swap / dynamic_pager por completo y reiniciar, ya que eso requiere demasiado esfuerzo para deshabilitar el uso de intercambio, y también deja el sistema inestable cuando se acerca a una cantidad baja de memoria inactiva y libre. El segundo enlace se refiere al problema de los archivos de intercambio cada vez mayores. Si bien es un problema importante, especialmente cuando uno se está quedando sin archivos de intercambio, no es realmente relevante para mi pregunta en este hilo ...
Motin

4

No es una solución permanente, pero al menos puede ayudar a recuperar algo de memoria inactiva, evitando potencialmente el temido intercambio: http://itunes.apple.com/nz/app/freememory/id460931672?mt=12

La herramienta es gratuita y bastante fácil de usar. Una vez iniciado, seleccione su opción "Memoria libre" en la barra de herramientas / menú del sistema.

A diferencia de la pantalla de memoria de ActivityMonitor, solo muestra memoria libre, lo que parece ser un mejor indicador de intercambio en curso o no.


He estado evaluando esta aplicación desde su sugerencia hace aproximadamente dos meses. Parece que esta aplicación de hecho aumenta la cantidad de memoria "libre" a través de varios trucos, que incluyen reclamar agresivamente mucha memoria para sí misma y luego liberarla. Sin embargo, esto hace que se intercambie la misma cantidad de memoria que "liberó". Esto quiere decir que no ayuda a liberar ninguna memoria, solo mueve los contenidos de la memoria RAM a HD. Al final, esto causa muchos intercambios cuando intento usar las aplicaciones que estaban abiertas mientras liberaba memoria, ya que gran parte de su VM ahora está en intercambio. :(
Motin

@Motin, he usado FreeMemory durante meses, y no lo hace, al menos en mi experiencia. Si tuviera que adivinar (basado en lo que he visto en el Monitor de actividad), la diferencia es que FM consume primero la memoria "activa", que tiene prioridad sobre las memorias caché de disco. "Libera" otra memoria al tener mayor prioridad, luego libera su propia memoria. Nunca lo he visto agregarse al intercambio significativamente (tal vez una pequeña cantidad que se asigna mientras se consume).
párpado

2

Comenzando con OS X 10.5, hay problemas evidentes de administración de memoria en MAC OS X. La web ya estaba abarrotada de quejas sobre la desaceleración dramática del sistema después de algún tiempo. En aquel entonces tenía una máquina más lenta, Mac Mini con 1 GB de RAM, así que (erróneamente) concluí que se debía a un hardware inferior.

Ahora tengo 2010 MBP, Core i7, 8 GB de RAM, doble GPU. Mac os X Snow Leopard fue doloroso, pero después de migrar a OS X Lion, trabajar en cosas serias en MAC comenzó a ser una pesadilla.

Finalmente logré reproducir el escenario problemático, así que ejecuté la prueba y grabé la pantalla en video.

Problema de rendimiento de MAC OS X Lion: administración de memoria rota

Ejecuto el comando tar + bzip, que es material básico de Unix, en la gran cantidad de archivos de imagen, en mi carpeta Imágenes /. Justo antes de comenzar, ejecuto el comando "purgar" para eliminar los datos del programa inactivos / en caché.

Puede ver en el video que la memoria libre comienza a caer muy rápido y que la inactividad aumenta constantemente. Si observa el comando "bsdtar", solo se necesita un fragmento de RAM, por lo que el problema no está en este proceso. No se puede decir que se trata de una pérdida de memoria del programa, porque el problema no estaría en la memoria RAM inactiva, sino en activa / cableada.

Cuando la memoria libre cayó por debajo de 100 MB, inicié algunas aplicaciones, como Safari, iPhoto y MS Word, y puede ver en el video que tarda incluso minutos en iniciar una aplicación, cuando normalmente (cuando hay RAM libre), tomaría unos 3-5 segundos para cargar.

Ejecuto el mismo escenario y los mismos comandos en mi caja Linux Centos 6, ¡no hay problema! El uso de memoria es de unos 10-20mb, no hay problemas con el caché / buffer.

¡La administración de memoria debe estar muy rota en Mac OS X!


2
Lo que está viendo es el sistema de almacenamiento en caché de archivos en la memoria. Estoy de acuerdo en que hay un problema, ya que el caché nunca parece ser purgado ... pero el almacenamiento en caché en sí (y el crecimiento de la memoria inactiva como consecuencia) es una característica de rendimiento sensata y, a veces, útil.
párpado

Además, el entorno de prueba está lejos de ser estéril. No podemos decir qué está haciendo QuickTime Player, o cualquiera de los otros programas abiertos.
chrishiestand

1

Apuesto a que no hay una respuesta correcta para esto. Es lo mismo con la memoria que permanece activa cuando pones tu Mac a dormir, solo crece y crece con cada sueño que haces.

En el lado "divertido" (también conocido como caro), puede actualizar su memoria o reemplazar el HDD con un SSD, por lo que el intercambio no será un golpe de rendimiento. Elegí la primera opción, ya que la memoria Corsair ahora está disponible a un precio razonable.

16 GB de RAM


2
Tenga en cuenta que los SSD tienen ciclos de escritura limitados. También tenga en cuenta que para las SSD no habilitadas para recortar, las escrituras pueden llegar a ser caras ya que la celda Flash debe borrarse.
Wavy Crab

¿Puedes citar una fuente sobre el problema "El sueño hace que el uso de memoria aumente"?
GordonM

¿Puedo citar mi experiencia? :) Hice una búsqueda rápida y encontré esto: debates.apple.com/message/21624847#21624847 + hay muchos temas relacionados con la memoria inactiva que no se borra cuando es necesario. Personalmente, vi cómo, después de cada sueño, la memoria inactiva permanece como antes y aumenta. 'purgar' es una opción, pero no me gustaría purgar la memoria inactiva una vez cada 20 minutos (apuesto a que este sería el caso con 4 GiB RAM).

1
Los SSD @WavyCrab pueden tener ciclos de escritura limitados, pero no hay posibilidad de que llegue a ese límite. No me preocuparía por eso, a menos que sea un SSD para un centro de datos. En cualquier caso, si va a bajar el SSD por escritura excesiva, bajaría un HDD antes.
andreadi
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.