Deshabilitar el intercambio de memoria inactiva

Fondo:

OSX guarda cierta información en la RAM que ya no se usa, pero que se usó recientemente. Esto se llama memoria inactiva y tiene como objetivo mejorar la experiencia del usuario acelerando algunas acciones:

Por ejemplo, si ha estado usando Mail y luego lo cierra, la memoria RAM que Mail estaba usando se marca como memoria inactiva. La memoria inactiva está disponible para que la use otra aplicación, al igual que la memoria libre. Sin embargo, si abre Mail antes de que otra aplicación utilice su memoria inactiva, Mail se abrirá más rápido porque su memoria inactiva se convierte en memoria activa, en lugar de cargarla desde la unidad más lenta.

Suena cuestionable (¿cuánto puede acelerar el correo en una máquina de cuatro núcleos?), pero al menos eso no podría doler , ya que dicha memoria puede tratarse como memoria libre. En realidad, puede :

En OS X, cuando el número de páginas en la lista libre cae por debajo de un umbral calculado, el kernel reclama páginas físicas para la lista libre intercambiando páginas inactivas fuera de la memoria.

Esto me hace preguntarme si el manejo de la memoria de OSX es realmente superior; después de todo la misma página menciona que

La paginación de cualquier tipo... afecta negativamente al rendimiento porque obliga al sistema a pasar mucho tiempo leyendo y escribiendo en el disco. Leer una página desde el almacén de respaldo lleva mucho tiempo y es mucho más lento que leer directamente desde la RAM. Si el sistema tiene que escribir una página en el disco antes de poder leer otra página del disco, el impacto en el rendimiento es aún peor.

Asunto:

Es probable que esto (paginación de la memoria inactiva y la subsiguiente degradación grave del rendimiento) ocurra incluso durante tareas triviales como la exploración de múltiples pestañas, incluso si la cantidad de pestañas abiertas simultáneamente se mantiene dentro de lo razonable (tanto Safari como Chrome parecen ser culpables de agregando a la memoria inactiva cada vez que se cierra una pestaña).

La máquina se vuelve difícilmente utilizable cuando esto sucede; incluso abrir la Terminal y purgar la memoria puede llevar unos minutos.

Pregunta:

¿Se puede desactivar el intercambio de memoria inactiva? O, dado que la memoria inactiva no es esencial, ¿se puede desactivar por completo?

Alternativamente, ¿hay disponible un demonio o una aplicación preferiblemente de Apple que monitoree el uso de memoria inactiva (un oxímoron de OSX) y cuando supera una cantidad arbitraria (¿medio concierto?) purgese realiza una?

al ver las etiquetas asumo que aún no han arreglado la paginación de memoria inactiva en Mountain Lion?
@Pieter: aparentemente no hay nada que arreglar porque la implementación actual es tal como Apple pretendía :)
confirmaron esto como 'funcionando según lo previsto'? No entiendo cuáles son los beneficios de intercambiar memoria inactiva en el disco.
"... degradación grave posterior del rendimiento...": a pesar de lo que se encuentra en la Biblioteca para desarrolladores de Mac, no estoy convencido de que todas las degradaciones sean negativas . Sospeche que en algunos casos hay un efecto más negativo del sistema operativo que intenta restringir su enfoque de los archivos de intercambio externos : Memoria virtual de Mac: cómo hacer que OS X cree archivos de intercambio (página) tan libremente con un arranque normal como lo hace con una caja fuerte arranque (swapfile1, etc.)
@Graham Perrin: cuando digo grave, hablo por experiencia (aunque no necesariamente compartida): si trabaja con cantidades masivas de datos y se queda sin espacio en el disco duro antes de archivarlo, el archivo de intercambio se vuelve más y más fragmentado, aumentando el tiempo de acceso, etc. (me imagino que no sería un problema de rendimiento con un SSD, pero suena como algo que acortaría su vida útil). No estoy defendiendo este patrón de uso, pero esto es algo con lo que sigo encontrándome.

Respuestas (3)

He estado investigando esta misma pregunta durante algún tiempo y he llegado a la conclusión de que, si bien se ofrecen varias supuestas "soluciones" en varios lugares, ninguna de ellas soluciona realmente el problema o hace que los síntomas desaparezcan. Lo mejor que he encontrado son técnicas que cambian cuando se intercambia la memoria inactiva, como el uso del purgecomando al que se refirió. Creo que MacLemon tiene razón en que el intercambio se puede deshabilitar solo en su totalidad y no de forma selectiva, por lo que deshabilitar el intercambio de memoria inactiva en la práctica sería equivalente a deshabilitar la memoria virtual por completo, lo que podría ser una solución viable en una máquina con cantidades realmente grandes. de RAM, pero no es práctico en máquinas con una capacidad de RAM máxima baja, como MacBooks o Minis.

La razón por la que ninguna de las soluciones de purga ad-hoc mejora significativamente la situación es que en realidad solo hay dos formas de obligar a OS X a borrar la memoria inactiva: el purgecomando o forzar la asignación de toda la memoria libre (y dado que no estoy seguro de qué método purgeusa, estos dos pueden ser más o menos iguales).purge, como mencionaste, toma una cantidad de tiempo no trivial para completarse. La asignación de toda la memoria libre simplemente acelera el proceso mediante el cual el contenido de la memoria inactiva se intercambiaría de forma natural y, por lo tanto, aún consume la misma gran cantidad de recursos del sistema. La única ventaja de cualquiera de estas soluciones es que le permiten elegir cuándo se produce el intercambio, por lo que puede realizarse antes de que normalmente intente asignar esa memoria a otra cosa. Si eso es realmente útil para usted depende de varios factores, por lo que la forma más sencilla de averiguarlo es probarlo.

He estado probando algunas de las utilidades de borrado de memoria que existen y descubrí que, para mí, forzar manualmente el intercambio inactivo requiere una supervisión más activa de los niveles de memoria de lo que es práctico mientras estoy trabajando y usando una utilidad. que fuerza automáticamente el intercambio cuando la memoria libre cae por debajo de un cierto umbral no es mejor que dejar que el sistema operativo lo haga solo, ya que todavía no tengo control sobre cuándo ocurrirá el intercambio y mis aplicaciones tendrán SPOD. Entonces, si bien hay una aplicación que hará exactamente lo que pide su pregunta alternativa, eso en realidad no hace que la situación sea menos dolorosa.

Hasta que el equipo de desarrollo del sistema operativo de Apple decida que el sistema de administración de memoria no está funcionando como se supone que debe hacerlo y encuentren una manera de hacerlo funcionar correctamente, la única solución real es identificar qué aplicaciones están generando la mayor cantidad de memoria inactiva y detenerse. utilizarlos. En mi situación, esto ha significado cambiar de navegador web. He estado probando una variedad de ellos, y Chrome es hasta ahora el que parece generar la menor cantidad de memoria inactiva, probablemente en parte porque cada pestaña y cada extensión se ejecutan como un proceso separado, lo que permite que la administración de memoria nativa del sistema operativo trate cada uno. uno por separado en términos de priorizar el intercambio. Safari es lo peor que he probado; Comenzando con Safari 5.1, podía abrir algunas pestañas, no hacer absolutamente nada y ver cómo la memoria inactiva aumentaba rápidamente en el Monitor de actividad; pasaría fácilmente de < 1 gb inactivo a > 3 gb inactivo dentro de unos cinco minutos, ejecute el ciclo de intercambio y luego haga exactamente lo mismo. (De acuerdo, la memoria que no hace nada es exactamente lo que la hace inactiva en primer lugar, pero no debería crear más memoria inactiva de la que se asignó activa en primer lugar). Safari 6 bajo Mountain Lion es un poco mejor, pero no lo suficientemente mejor como para que valga la pena cambiar de nuevo. Firefox, al no estar basado en WebKit, debería ser mejor en esto que Safari o Chrome, pero tiene su propio legado de problemas de administración de memoria, incluido un historial de fugas de memoria, que no lo hacen mejor en la práctica. t crea más memoria inactiva de la que se asignó activa en primer lugar). Safari 6 bajo Mountain Lion es un poco mejor, pero no lo suficiente como para que valga la pena volver. Firefox, al no estar basado en WebKit, debería ser mejor en esto que Safari o Chrome, pero tiene su propio legado de problemas de administración de memoria, incluido un historial de fugas de memoria, que no lo hacen mejor en la práctica. t crea más memoria inactiva de la que se asignó activa en primer lugar). Safari 6 bajo Mountain Lion es un poco mejor, pero no lo suficiente como para que valga la pena volver. Firefox, al no estar basado en WebKit, debería ser mejor en esto que Safari o Chrome, pero tiene su propio legado de problemas de administración de memoria, incluido un historial de fugas de memoria, que no lo hacen mejor en la práctica.

Lo que realmente solucionaría el problema es si hubiera una opción, probablemente una opción oculta en el sistema operativo, que le indicara al sistema operativo que simplemente descargue el contenido de la memoria inactiva cuando sea necesario en lugar de intercambiar su contenido en el disco. Pero no espero que Apple alguna vez haga disponible esa opción.

"Lo que realmente solucionaría el problema es si (el sistema operativo) simplemente volcara el contenido de la memoria inactiva cuando fuera necesario en lugar de intercambiar su contenido en el disco". Como se explica en mi respuesta , el sistema operativo hace exactamente eso. Te acabas de perder esa parte de la documentación.

¿Cuánta RAM tiene tu Mac? Además, se sabe que los navegadores (especialmente los de Webkit) usan grandes cantidades de memoria en estos días. La memoria inactiva se utiliza bien en lugar de la RAM libre, que simplemente se queda allí consumiendo energía. En el caso de un navegador, esto le permite deshacer el cierre de una pestaña y aún así conservar su historial, etc.

Puede deshabilitar completamente el intercambio de memoria ejecutando sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plisty reiniciando. No puede deshabilitar selectivamente el intercambio.

Puede deshacer esto ejecutando sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plisty reiniciando nuevamente.

"... La memoria inactiva se le da un buen uso..." – +1 .
@MacLemon con 4 GB de RAM y un sistema operativo inconformista, siento que esta Mac es muy lenta. Tengo alrededor de 1,5 GB de RAM inactiva. Solo intento tu sugerencia, pero parece que no funciona bien. ¿cualquier otra sugerencia?
Nunca dije que funcionaría bien y la primera pregunta fue sobre la cantidad de RAM en la Mac. Responde a tu pregunta. La solución adecuada a su pregunta es obtener más RAM.
Tengo 16 GB (y SSD) y el último OSX es muy lento al hacer intercambios. Es terrible cómo maneja su memoria.
Nota: Deshabilitar el buscapersonas dinámico no funcionará en un sistema con SIP activado ( Protección de integridad del sistema ).

Actualización 2020

Esta pregunta se hizo en 2012 y esta respuesta se escribió en 2020, y algunas cosas han cambiado mientras tanto, pero mucho sigue igual.

Creo que la mayor parte de esta pregunta, la respuesta de Quantumpanda y la descripción del artículo de soporte de Apple sufren de un malentendido de la naturaleza de la "memoria inactiva". El OP apunta a la documentación de Apple que dice

En OS X, cuando el número de páginas en la lista libre cae por debajo de un umbral calculado, el kernel reclama páginas físicas para la lista libre intercambiando páginas inactivas fuera de la memoria.

La documentación de Apple decía eso en 2012 y todavía dice eso en 2020. Sin embargo, esa cita proviene de la sección "Proceso de salida de página" de la documentación; el OP se perdió la discusión de " Listas de páginas en el Kernel ". La oración clave (para nuestros propósitos actuales) en esa sección es

Si una página inactiva no se ha modificado y no es residente permanente (cableada), se roba (cualquier asignación virtual actual se destruye) y se agrega a la lista libre.

De qué hablaba el artículo de soporte

Por ejemplo, si ha estado usando Mail y luego lo cierra, la memoria RAM que Mail estaba usando se marca como memoria inactiva. La memoria inactiva está disponible para que la use otra aplicación, al igual que la memoria libre. Sin embargo, si abre Mail antes de que otra aplicación utilice su memoria inactiva, Mail se abrirá más rápido porque su memoria inactiva se convierte en memoria activa, en lugar de cargarla desde la unidad más lenta.

Para ejecutar un programa, Mail en este ejemplo, el código de ese programa se lee desde el disco y se escribe en la RAM, porque la CPU solo puede ejecutar código desde la RAM. El sistema operativo realiza un seguimiento del hecho de que la RAM es una copia de un archivo en el disco y realiza un seguimiento de si esos datos en la RAM se han modificado o no. Cuando se cierra el programa de Correo, la copia RAM del archivo ya no es necesaria y termina en la lista "inactiva". Sin embargo, si hay suficiente RAM para todos, no hay necesidad de destruir los datos en la RAM, por lo que se deja como está.

Ahora, si vuelve a ejecutar el programa de inmediato, el sistema operativo no tiene que copiar el código del disco a la RAM porque puede ver, mirando la lista inactiva, que ya tiene una copia del archivo en la RAM, por lo que simplemente mueve esa memoria RAM a la lista activa y la asigna al nuevo programa de correo en ejecución. Esto es mucho más rápido que volver a leer el archivo desde el disco.

Sin embargo, el correo es un mal ejemplo, porque no se detiene e inicia con frecuencia el programa de correo. Sin embargo, hay docenas de pequeños programas que el sistema operativo ejecuta en segundo plano, como para mantener actualizados los índices de Spotlight o mantener sus datos locales sincronizados con iCloud, que se ejecutan con frecuencia y luego se cierran cuando terminan. Para estos programas el ahorro de tiempo es mucho más significativo.

El punto crítico: este tipo de memoria inactiva nunca se intercambia

Este tipo de memoria, que está respaldada por un archivo en el disco y no se modifica, nunca se escribe para intercambiar , porque ya hay una copia en el disco en otro lugar. Este es el tipo de memoria mencionado en la cita añadida anterior: "no se ha modificado y no es residente permanente". Cuando no hay suficiente memoria, este tipo de memoria inactiva no se intercambia, se roba y se coloca directamente en la lista libre.

La memoria inactiva que se intercambia es la memoria que aún necesita una aplicación en ejecución

La otra forma en que la memoria se vuelve inactiva es si una aplicación no la ha tocado (leído o escrito) en un tiempo. Por ejemplo, si está trabajando en un procesador de texto y tiene varios archivos abiertos, esta podría ser información sobre uno de los archivos que tiene abiertos pero en los que no está trabajando. Cuando la memoria se agota, este tipo de memoria se intercambia en el disco para dejar espacio para lo que sea que esté solicitando la memoria que necesita en este momento y que está provocando que la memoria se agote.

Este tipo de memoria inactiva debe cambiarse porque contiene datos que no se guardan en ningún otro lugar. La única forma de evitar que se intercambie este tipo de memoria es deshabilitar el intercambio por completo, y casi siempre es una mala elección. Cuando deshabilita el intercambio por completo, reduce significativamente la capacidad del sistema. Si limitó el sistema a ejecutar solo lo que podría ejecutar con el intercambio deshabilitado, funcionaría igual de bien con el intercambio habilitado.

purgees una pista falsa

El purgeprograma es una pista falsa contraproducente. Obligará a que la memoria inactiva que sería robada en lugar de ser intercambiada sea robada de inmediato. Eso puede parecer bueno para los números, pero en realidad perjudica el rendimiento de dos maneras:

  1. Se necesita tiempo para ejecutar el purgeprograma
  2. Elimina el rendimiento que se obtiene al realizar un seguimiento de lo que contiene la memoria inactiva y permitir que se reutilice.

En pocas palabras: no intente deshabilitar el intercambio de memoria inactiva