He usado Unix durante bastante tiempo, y durante los últimos años he sentido que el intercambio es un anacronismo, pero me gustaría saber qué piensan otras personas.
Mi argumento es más o menos esto (suponiendo que no haya un límite global o un giro de la configuración OOM):
There is little value in swap because if you need to swap out to disk,
odds are it's going to be a vicious cycle where an app will continue
to eat not only real memory, but swap as well until it gets OOM
reaped (_if_ it gets OOM reaped).
If you have swap enabled, it will only prolong this death march to
the detriment of other processes - and in the worst case where the
process is not OOM reaped in a timely manner, grind the system to
a halt.
Without swap, it will probably get OOM reaped sooner (if at all)
Para cualquier servicio que esté ajustado para el rendimiento, creo que comprender los límites superiores de su uso de recursos sería clave para ajustarlo en primer lugar, en cuyo caso usted sabe cuánto necesita.
No puedo imaginar muchas situaciones (algunas, pero no muchas) en las que suspenderías un proceso en ejecución y podría cambiar para dejar espacio para otras cosas, pero aún así perderías tus sockets si lo hicieras, por lo que forzarías un Core-dump a través de gcc o copiar la memoria a mano sería funcionalmente equivalente.
Definitivamente no me gustaría intercambiar en un sistema embebido (a pesar de que puede tener una memoria RAM disponible más pequeña), si te quedas sin memoria RAM preferiría que mi proceso muera antes que romper una memoria flash de un millón de escritura por sector conduzca durante un fin de semana nivelando el desgaste de los sectores hasta el fondo.
¿Alguna barba unix tiene alguna razón convincente para seguir intercambiando?
ACTUALIZAR respuestas y análisis:
¿CONFIRMADO? - fork () requiere la misma cantidad de memoria para el proceso hijo que el padre
Modern fork () es copia-en-escritura para niños en POSIX (en general), pero Linux y FreeBSD específicamente, y estoy asumiendo OSX por extrapolación. Considero esta parte del equipaje anacrónico que el intercambio lleva consigo.
Curiosamente, este artículo de Solaris afirma que a pesar de que Solaris utiliza Copy-on-Write con fork (), debe tener al menos 2x (!) El tamaño del proceso principal en la memoria virtual libre para que el fork () no se pierda en el medio. Si bien el elemento Solaris revienta un poco el argumento de que el intercambio es un anacronismo, creo que suficientes sistemas operativos implementan correctamente CoW de tal manera que es más importante disipar el mito que marcarlo como una justificación adicional para el intercambio. Ya que. Seamos sinceros. En este punto, las personas que realmente usan Solaris probablemente sean solo chicos de Oracle. Sin ofender Solaris!
CONFIRMADO : los archivos tmpfs / ramfs pueden intercambiarse como una conveniencia cuando tmpfs / ramfs se llena
¡No use tmpfs / ramfs sin límite! Siempre defina explícitamente la cantidad de ram que desea que tmpfs / ramfs use.
PLAUSABLE : intercambie un poco por si acaso
Uno de mis viejos jefes solía decir un gran dicho: "no sabes lo que no sabes", esencialmente, no puedes tomar una decisión basada en información que aún no tienes. Sin embargo, este es un argumento plausible para el intercambio: sospecho que los tipos de cosas que haría para detectar si su aplicación se está intercambiando o no serían más pesados que verificar si malloc () tiene éxito o detectar la excepción de Un nuevo fallido ().
Esto puede ser útil en los casos en que está ejecutando un escritorio y tiene un montón de cosas al azar, pero aún así, si algo se vuelve loco, preferiría que fuera OOM cosechado que sumergirse en el infierno de intercambio. Así soy yo.
Reventado! - En Solaris , el intercambio es importante por un par de razones
tmpfs : estados La cantidad de espacio libre disponible para tmpfs depende de la cantidad de espacio de intercambio no asignado en el sistema. El tamaño de un sistema de archivos tmpfs crece para acomodar los archivos escritos en él, pero hay algunas compensaciones inherentes para los grandes usuarios de tmpfs. Tmpfs comparte recursos con los segmentos de datos y pila de programas en ejecución. La ejecución de programas muy grandes puede verse afectada si los sistemas de archivos tmpfs están cerca de su tamaño máximo permitido. Tmpfs es libre de asignar todos menos 4 MB del espacio de intercambio del sistema.
Datos y mitos de Solaris sobre los estados de intercambio La memoria virtual actual consiste en la suma total de RAM física y espacio de intercambio en el disco. Solaris NO requiere que se configure ningún espacio de intercambio. Si elige esta opción, una vez que la RAM esté llena, no podrá iniciar nuevos procesos. .
No estoy seguro de si esto significa que el mapa virtual máximo que puede crear es ram + swap , o si aún podría hacer algo como mmap () un archivo más grande que ram y confiar en la inicialización perezosa de mmap (). Probablemente pueda ejecutar Solaris en estos días sin intercambio, parece que es menos amigable que otros sistemas operativos POSIXy.
Reventado! Las herramientas populares de hibernación de Linux parecen confiar en el intercambio
Por defecto, TuxOnIce parece que depende del intercambio para la hibernación, aunque existen otros backends. Sin embargo, si no está ejecutando un cuadro que necesita hibernar, aún estaría detrás de la afirmación de que 'el intercambio es anacronístico en Linux'
Respuestas:
No confunda (the) swap (como área de disco) y (to) swap (como método para mover páginas de memoria de RAM a disco y recíprocamente).
El intercambio excesivo es algo que debe evitarse por razones de rendimiento, pero tener un área de intercambio no es necesariamente un problema.
En los sistemas, como Linux, que compromete demasiado la memoria, es decir, que permite que los procesos asignen más memoria de la disponible, quedarse sin RAM sin suficiente intercambio para manejar la situación activará el OOM asesino. Debe confiar en el algoritmo utilizado para seleccionar el proceso "correcto" para matar, y aceptar que uno o más de sus procesos se eliminen sin tener la oportunidad de cerrarse correctamente. Aquí hay una analogía famosa que explica por qué el asesino OOM podría no ser una buena idea.
En sistemas como Solaris, que no comprometen demasiado la memoria, es decir, que se aseguran de que una reserva de memoria siempre esté respaldada por la memoria virtual, ya sea en la RAM o en el disco, es absolutamente necesario tener un área de intercambio suficiente; de lo contrario, una parte potencialmente significativa de la RAM será vano.
fuente
Sé de una razón para seguir intercambiando. Tengo una aplicación que ocupa tanta memoria como puedo permitirme configurar para mi sistema. Utiliza Hadoop, que en una parte del procesamiento hace una bifurcación y un ejecutable para ejecutar un solo comando de Unix (creo que "uname" o "user" o algo para lo que no pudieron encontrar un equivalente de Java). Parece que Java no hace un vfork con copia en la semántica de escritura como lo haría una aplicación nativa. Si inicio mi aplicación con 4 Gb de RAM, cuando se bifurca, la bifurcación usa otros 4 Gb de RAM, pero luego la libera rápidamente. Si no tuviera 4 Gb de intercambio para que Hadoop lo intercambie, tendría que pagar 8 Gb de RAM solo para tener 4 Gb para mi aplicación.
fuente
files_struct
, thestruct signals
, thetask_struct
y otras). Además, muchas páginas ejecutables no son código dependiente de posición (PIC) y, por lo tanto, las páginas de código ejecutable que fueron modificadas por el cargador dinámico (ld-linux.so
) deben tener espacio de intercambio reservado para ellos, incluso si no se escribe nada en el espacio de intercambio inmediatamente. Por eso amo Linux; puede desactivar el intercambio y el sistema aún se ejecuta. :)No puedo agregar a la discusión técnicamente, pero puedo dar algunos ejemplos. Mi vieja computadora portátil (2GB RAM kunbuntu lucid) generalmente se ejecuta con intercambio en 0. Cuando ejecuto la transmisión (cliente bittorrent) con una serie de torrents que pueden estar utilizando 100 conexiones, mi intercambio puede aumentar. Se pone aún peor cuando tengo un XP vm corriendo que usa 1GB de memoria real.
He visto a otros comentar que los procesos intensivos en memoria, como la representación gráfica, también pueden sumergirse en el intercambio. Si solo haces eso ocasionalmente, entonces no es un problema.
En cuanto a los problemas de OOM, el intercambio en realidad puede salvarle la vida porque le da tiempo entre identificar el problema y las cosas que van hacia el sur. Muchas cosas usan casi toda mi memoria, así que no le presto atención, pero cuando el intercambio comienza a funcionar, lo noto y empiezo a buscar el problema, antes de que me muerda.
fuente
Hay una aplicación muy buena para el espacio de intercambio: la extensión de RAM al colocar el espacio de intercambio en el dispositivo de almacenamiento que usa RAM, para superar las limitaciones de la RAM del sistema instalable
Eche un vistazo a este gadget http://techreport.com/articles.x/16255 Básicamente es una interfaz de S-ATA a DDR2-RAM. Puede meter hasta 64 GB de RAM en esos. Al colocar espacio de intercambio en uno de esos, obtendrá una cantidad considerable de RAM adicional. Por supuesto, no es tan rápido como la RAM del sistema normal. Pero de alguna manera convierte la RAM del sistema en una especie de capa de caché adicional.
fuente
He estado ejecutando Linux y Windows sin intercambio (archivo de paginación, en la nomenclatura de Windows), en computadoras portátiles / de escritorio con 4 Gb o más. Hay algunas ocasiones en que ocurre el agotamiento de la memoria, solo trato con ellas. Siento que el sistema es más ágil de esta manera, lo que me importa más. Sin embargo, no hay requisitos especiales en mi carga de trabajo.
Cosas que he aprendido:
fuente
Creo que sus argumentos son bastante válidos para un servidor , donde el rendimiento es importante, y saber qué aplicación actuará a continuación puede no ser predecible.
Sin embargo, para un escritorio , encuentro swap útil cuando estoy presionando y haciendo estallar tareas.
Por ejemplo, si estoy trabajando en una tarea usando la aplicación
A
y luego descubro que necesito usar la aplicaciónB
para algo (ya sea una subtarea o una interrupción), entonces es mentalmente más fácil para mí dejar elA
intercambio en el disco mientras trabajo enB
lugar de cerrarA
y luego recordar comenzar de nuevo después.Esto es especialmente cierto si
A
mantiene algún estado no guardado que no se restauraría cuando se reinicie.Si es más rápido empujar y tirar
A
hacia / desde el intercambio, o cerrarlo y reiniciarlo, depende de la aplicación. (Algunos logran tener un inicio lento pero un tamaño residencial pequeño).Sin embargo, estaría de acuerdo en que una mejor solución para mejorar la productividad sería instalar RAM adicional.
fuente
En mi sistema, / tmp se derrama para intercambiar si engulle demasiada RAM.
Esto es mucho más rápido que usar un sistema de archivos real para / tmp.
fuente
Hay muchas razones, cuando se utiliza el intercambio.
Por lo general, cuando el sistema no tiene suficiente memoria física, el núcleo puede intercambiar algunas aplicaciones (de hecho, algunas partes de la memoria que se utilizan al no ejecutar las aplicaciones).
Más tarde, cuando estas aplicaciones deberían hacer algo (por ejemplo, algunos datos llegan a un socket o se dispara un temporizador), el kernel pondrá alguna otra aplicación para intercambiar.
Otro ejemplo de uso de intercambio es suspender al disco.
Con respecto a los dispositivos integrados, todos se pueden dividir en (al menos) dos grandes grupos:
Por supuesto, hay dispositivos que ejecutan solo un código (algún tipo de microcontroladores), etc. No los describiría porque tales dispositivos no tienen ningún sistema operativo, por lo que discutir el intercambio no tiene sentido para dichos dispositivos.
El primer grupo de dispositivos integrados (que ejecutan algunos SO) puede usar (y usualmente usan) el intercambio. Y, en general, dichos dispositivos usan el intercambio de la misma manera que los escritorios y servidores.
El segundo grupo de dispositivos (que ejecutan RTOS) no usa el intercambio en absoluto, porque RTOS tiene una limitación de tiempo para responder a un evento, y
Por cierto, hay muchas descripciones de cómo Linux usa el intercambio, una de ellas es http://distilledb.com/blog/archives/date/2009/02/22/swap-files-in-linux.page
Uso de Windows Un enfoque similar.
fuente
Me parece que tanto la hibernación como el sueño híbrido necesitan espacio de intercambio en Linux .
Nunca utilicé el espacio de intercambio / partición en Linux hasta que me enfrenté a la necesidad de usar la suspensión híbrida, ya que la suspensión en el nivel de batería crítico no estaba disponible en mi sistema, ya que eso fue manejado por Upower, que solo elige entre apagado, hibernación e híbrido -dormir. (más aquí )
fuente
Algunos buenos usos que he visto son procesos que usan mucha memoria, pero no un rendimiento crítico. Un caso fue un antiguo Firefox que tenía una pérdida de memoria incorrecta. Llenaría RAM y se derramaría para intercambiar sin ningún efecto negativo. Otro que teníamos era nuestro servidor DNS recursivo (esos rápidamente acumulan una gran caché que rara vez se usa).
La otra explicación que he visto sobre el intercambio fue algo similar: "Se le dice que siempre configure SWAP = 2 * RAM. Esto no tiene sentido, no hay relación entre RAM e intercambio. El intercambio es para acomodar picos en el uso de memoria , debe agregar suficiente memoria para que la mayoría de las veces su carga se ajuste a la RAM. Si su carga es estable, no necesita intercambio. Si su carga es muy variable, necesita suficiente intercambio para los picos, y organizar de manera que swap se usa raramente lo suficiente como para no afectar el rendimiento de manera significativa en general. Resumiendo, ya que no tiene idea de cuáles son sus picos de carga, y como el disco es mucho más barato que la RAM, configure SWAP = 2 * RAM ".
Algunas versiones antiguas de Solaris no podían usar el intercambio en absoluto a menos que hubiera al menos tanto intercambio como RAM (recuerdo que asignó un espacio de intercambio fijo para salir de RAM o algo así), por lo que 2 * RAM era realmente el mínimo sensible valor. Pero eso fue hace eones, cuando nuestra máquina grande tenía 64 MiB RAM y un disco de 1 GiB ...
fuente