¿Es el intercambio un anacronismo?

43

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'

sintetizadorpatel
fuente
No tengo mucha barba * x (algo de pelo todavía;), pero mis 2 centavos serían que tener un "poco" de intercambio le daría a su sistema algo de robustez. Como en lugar de directamente OOM, iría a cambiar si un poco por encima de los límites de su sistema. Claro, si realmente supera los límites de su sistema, su sistema eventualmente se bloqueará / detendrá / se nukeará / lo que sea que pueda imaginar. Entonces, dar un poco de cuerda para jugar;)
Ouki
1
Lo que pasa con fork () es de hecho cierto si configuras tu sistema para que nunca se sobrecomprima RAM (esto no es lo predeterminado). Ahora, ¿por qué necesitarías esa configuración? No tengo ni idea. No es útil para el procesamiento en tiempo real.
Joshua
@Jushua: el sobrecompromiso de memoria puede no ser el predeterminado o incluso posible, dependiendo del sistema operativo.
jlliagre
Tengo un servidor NAS con 8 GB de RAM, ejecutará hasta 2 máquinas virtuales. No puse swap. Si comienza a cambiar mucho, de todos modos ya está muerto. Por lo tanto, apoya perfectamente su argumento. Por otro lado, todavía estoy usando mi escritorio oxidado con un límite de 1 GB de RAM y allí tengo intercambio para manejar la escasa memoria. Hace las cosas un poco más lentas, pero me ayuda a tener Firefox y otras aplicaciones abiertas al mismo tiempo.
Huygens
Encuentro que el asesino OOM se dispara demasiado tarde, solo después de que todos los cachés se hayan vaciado y el sistema se haya vuelto lento. Para mantener mi sistema ágil, utilizo earlyoom o nohang para hacer el mismo trabajo, ¡pero antes! Se puede usar con o sin intercambio.
joeytwiddle

Respuestas:

28

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.

jlliagre
fuente
1
¿Está seguro de que el punto sobre Solaris sigue siendo cierto? blogs.oracle.com/jimlaurent/entry/solaris_faq_myths_and_facts afirma: La memoria virtual hoy 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. Creo que veo cuál es tu punto: si quisieras mapear algo más grande que el carnero físico sin el intercambio, ¿no podrías? (Independientemente de que mmap es un inicializador perezoso).
sintetizadorpatel
55
Sí, estoy seguro de que mi punto sobre Solaris sigue siendo cierto. Incluso si la cita de Jim Laurent es verdadera, es decir, Solaris no exige el intercambio, no tener intercambio significa que todas las reservas de memoria (es decir, malloc) deben estar respaldadas por RAM, incluso cuando parte de la memoria asignada no se utiliza. Esto no está relacionado con mmap o tmpfs grandes, aunque tmpfs también es una razón por la que es posible que desee intercambiar con Solaris (y Linux también).
jlliagre
1
Actualización para Linux: el exceso de compromiso se puede desactivar, el algoritmo OOM se puede modificar, incluso puede tener su propio controlador OOM con cgroups.
Peter
1
@peterph Desactivar el exceso de compromiso en Linux hace que el intercambio sea aún menos anacrónico. Si no se compromete en exceso, debe asegurarse de tener un área de intercambio lo suficientemente grande como para respaldar todas las reservas.
jlliagre
1
La memoria virtual reservada por una bifurcación depende del tamaño del programa que lo hace. Digamos que tiene una máquina virtual Java que utiliza 2 GB de bifurcación de memoria, requerirá temporalmente 2 GB más. Si esto sucede mientras tiene menos de 2 GB disponibles o simultáneamente varias veces, una o más bifurcaciones fallarán. Esta es una situación común con sistemas operativos que no se comprometen en exceso, y también con Linux cuando se sobrehabilita el compromiso excesivo. Se puede solucionar fácilmente al tener un área de intercambio lo suficientemente grande que, en mi humilde opinión, es una solución bastante mejor que el compromiso excesivo de memoria.
jlliagre
3

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.

Paul Tomblin
fuente
Este es un gran punto, pero no un reflejo de la bifurcación moderna (): en Linux y FreeBSD (y, aparentemente, ¿OSX?), La bifurcación () se implementa mediante el uso de páginas de copia en escritura. Copy-on-write (o COW) es una técnica para retrasar o evitar por completo la copia de los datos. En lugar de duplicar el espacio de direcciones del proceso, el padre y el hijo pueden compartir una sola copia. Sin embargo, los datos se marcan de tal manera que si se escriben en ellos, se realiza un duplicado y cada proceso recibe una copia única. Citas: foros.freebsd.org/showthread.php?t=26355 y página de manual de Linux para fork ()
sintetizadorpatel
Si bien es cierto, hay algunas páginas que no se pueden marcar VACA. Por ejemplo, las páginas utilizadas para la pila del núcleo del nuevo proceso secundario y las páginas utilizadas para las estructuras de datos internas (the files_struct, the struct signals, the task_structy 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. :)
Azhrei
3

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.

Joe
fuente
Bueno, sí, los sistemas heredados no pueden hacer mucho sin el intercambio habilitado. Todavía tengo un viejo subnotebook con 256 MB de RAM, donde se requiere el intercambio para iniciar prácticamente cualquier programa. Sin embargo, creo que la pregunta se dirige a los sistemas modernos.
Dmitry Grigoryev
3

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.

datenwolf
fuente
1
Concisando su precio ($ 549), ¿no sería más eficiente invertir $ 100 en una placa base que admita 64 GB de RAM ?
Dmitry Grigoryev
1
@DmitryGrigoryev: Por supuesto. Pero a veces uno se ve obligado a utilizar ese tipo particular de hardware (ya que por razones tos sistema médico de certificación para la tos ), pero también tienen que lidiar con ridículamente grandes conjuntos de datos producidos en muy poco tiempo (piense tomógrafos, regímenes de datos> 3GiB / s).
datenwolf
¿No tendría que certificar la unidad RAM como dispositivo médico también en ese caso? ;) Pero sí, entendí el punto.
Dmitry Grigoryev
1
@DmitryGrigoryev: De hecho, tienes que hacerlo. Sin embargo, certificar dicho dispositivo de disco RAM S-ATA es mucho, mucho más fácil que certificar una placa base completa. Al comprar computadoras que se usan en equipos médicos, generalmente compra tantos componentes como sea posible certificados de fábrica. Para aquellas partes donde no existe nada con una certificación disponible, usted mismo hace las pruebas y la certificación necesarias. Especialmente cuando se trabaja en investigación, donde el énfasis está en la seguridad del paciente y los datos no se utilizan para la planificación del tratamiento, esta es la solución más rentable y más rápida. BT; DT.
datenwolf
3

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:

  • Windows "pierde" memoria con el tiempo, en aproximadamente 20-30 días de tiempo de actividad llego a un punto en el que prefiero reiniciar. No sé por qué sucede esto. Supongo que puede ser una fuga en algún controlador o el antivirus. Cuando tiene un archivo de paginación, creo que puede poner esta memoria filtrada en el archivo de paginación, por lo que sería más difícil notar este problema en un sistema Windows normal.
  • Firefox maneja mucho mejor con poca memoria que Chrome. Firefox te advierte, y aún se ejecuta, Chrome simplemente se bloquea.
spuk
fuente
2

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 Ay luego descubro que necesito usar la aplicación Bpara algo (ya sea una subtarea o una interrupción), entonces es mentalmente más fácil para mí dejar el Aintercambio en el disco mientras trabajo en Blugar de cerrar Ay luego recordar comenzar de nuevo después.

Esto es especialmente cierto si Amantiene algún estado no guardado que no se restauraría cuando se reinicie.

Si es más rápido empujar y tirar Ahacia / 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.

joeytwiddle
fuente
Actualización: después de escribir esta respuesta, tenía una computadora portátil con mucha RAM y un disco duro lento. ¡En ese caso mi consejo se invirtió! Aquí hay un resumen de pros y contras .
joeytwiddle
1

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.

Joshua
fuente
Eso es bastante peligroso: si necesito ramfs, especifico en fstab (u opciones) para establecer el tamaño explícitamente. Es probable que un programa pueda volverse loco con la asignación de memoria, ya que comenzará a crear archivos en / tmp. El intercambio sería un mal lugar para que aparezcan los archivos ramfs (especialmente si confía en ramfs para la velocidad)
sintetizadorpatel
2
Supero el tamaño de RAM allí con frecuencia. tmpfs respaldado por swap es significativamente más rápido que ext2 incluso cuando se derrama.
Joshua
Es útil saberlo, y probablemente será un elemento de investigación en el futuro, todavía me preocuparía que una aplicación llene mi ram por proxy de tmpfs / ramfs en / tmp. ¡Eso me da los heebie jeebies!
sintetizadorpatel
Luego establezca el límite = tamaño del intercambio.
Joshua
Por cierto, esta es la diferencia entre ramfs y tmpfs. tmpfs puede derramarse para intercambiarse mientras que ramfs no.
Joshua
1

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:

  1. ejecutan Linux / Windows o similar no RTOS (sistema operativo en tiempo real); o
  2. corren un RTOS.

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

  • leer del intercambio puede llevar un tiempo impredecible
  • los dispositivos tienen un número predefinido (en tiempo de compilación) de tareas que no es necesario intercambiar

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.

vasily-vm
fuente
Además, el intercambio es necesario para la hibernación (suspensión en el disco) a menos que esté usando algo como TuxOnIce.
Renan
1

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í )

Comunidad
fuente
0

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 ...

vonbrand
fuente