¿Cómo vaciar el intercambio si hay RAM libre?

315

Cuando abro una aplicación con uso intensivo de RAM (VirtualBox configurado en 2 GB de RAM), generalmente se usa algo de espacio de intercambio, dependiendo de qué más haya abierto en ese momento.

Sin embargo, cuando salgo de esa última aplicación, se liberan los 2 GB de RAM, pero se mantiene el mismo uso de espacio de intercambio.

Por ejemplo, en este momento, aproximadamente dos horas después de haber cerrado VirtualBox, tengo 1.6 GB de RAM libre y todavía 770 MB de intercambio.

¿Cómo puedo decirle a Ubuntu que deje de usar ese intercambio y que vuelva a usar la RAM?

jfoucher
fuente
Lo más fácil es reiniciar su dispositivo y ahorrar tiempo al hacer frente a ram y liberar ram ahorra energía de la computadora portátil y la temperatura de la CPU
Mohamed Slama
55
Gran suposición de que repoblar todas las cosas en su computadora lleva menos tiempo que eso.
jQwierdy
Ubuntu 16.04, al menos, puede seguir usando el intercambio mucho después de que fuera necesario, lo que hace que sus órdenes de magnitud del sistema sean más lentas al confiar en el archivo de intercambio, aunque ya no sea una necesidad. La intervención manual puede por lo tanto por útil. Reiniciar no siempre es una opción.
mate

Respuestas:

167

El hecho de que el intercambio esté asignado no significa que se esté 'utilizando'. Si bien programas como el monitor del sistema y la parte superior mostrarán parte de su espacio de intercambio asignado (en su ejemplo, 770 MB), eso no significa que el sistema esté intercambiando activamente dentro / fuera.

Para saber si algo está cambiando de entrada / salida, puede usar el vmstatcomando. Déjelo funcionando unos segundos para que se sicalme y somire las columnas (intercambiar) y (intercambiar). Si no sucede nada, entonces no hay razón para preocuparse.

Aquí está el resultado de la ejecución vmstat 1, donde puede ver que mi máquina no se intercambia en absoluto.

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0  78588 230788   9596  72196    0    0     0     0  543  652 12  6 78  0
 0  0  78588 230780   9596  72196    0    0     0     0  531  410  1  0 99  0
 0  0  78588 230796   9596  72196    0    0     0     0  300  335  1  1 97  0
 1  0  78588 230788   9608  72224    0    0    40     0  737  762  4  4 84  8
 5  0  78588 230788   9608  72224    0    0     0     0  415  385  9  3 84  0
 0  0  78588 230540   9616  72224    0    0     0    44  611  556 55  5 31  0
 0  0  78588 230532   9616  72224    0    0     0     0  574  662  1  6 89  0

Sin embargo, aquí toppuedes ver que tengo espacio de intercambio asignado: -

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached
papa
fuente
32
"No hay razón para preocuparse", hasta el punto en que continúo usando alguna aplicación que se cambió. entonces todo el infierno se desata.
törzsmókus
207
Esta publicación no responde la pregunta.
emchristiansen
18
La premisa de la pregunta se basa en conceptos erróneos. Esta publicación aborda los conceptos erróneos.
papa
30
No veo una idea errónea, veo un desacuerdo sobre lo que significa "usado". Quiere decir "usado" para referirse al intercambio activo de entrada / salida, mientras que la pregunta original parece estar planteada con "usado", lo que significa que hay datos que se han cambiado, que más tarde deberán volver a cambiarse. razones válidas para querer vaciar el intercambio después de un evento que intercambia mucha otra memoria, esencialmente evitando el intercambio activo que el usuario sabe que ocurrirá más tarde (especialmente si es probable que ocurra un 'intercambio' posterior mientras el el disco está bajo carga por otros motivos).
drfrogsplat
39
Después de ejecutar una aplicación de uso intensivo de memoria, mis otras aplicaciones no responden cuando cambio a ellas, presumiblemente debido a que se intercambiaron. Sería mejor alguna forma de decirle al sistema que desarme la mayor cantidad de datos posible (seguido de un descanso para tomar café) que tener que esperar 20 segundos cada vez que presione Alt + Tab.
Mark K Cowan el
425

El kernel de Linux subyacente a Ubuntu "intercambiará" automáticamente esas páginas del disco a la RAM según sea necesario, por lo que en general diría que simplemente suceda de forma natural.

Sin embargo, si realmente siente que necesita forzarlo, (puedo ver un escenario en el que desearía saber que el sistema responderá más tarde) puede deshabilitar y volver a habilitar momentáneamente el intercambio

sudo swapoff -a
sudo swapon -a

O alternativamente como una sola línea

swapoff -a; swapon -a

Tenga cuidado al hacer esto, ya que puede hacer que su sistema sea inestable, especialmente si ya tiene poca RAM.

SpamapS
fuente
8
Eso hizo el truco, el intercambio se copió a ram. Supongo que solo debes asegurarte de tener al menos la cantidad de intercambio utilizada como ram libre antes de ejecutar el intercambio, ¿verdad?
jfoucher
12
El intercambio no se copió a la RAM. Fue simplemente deshabilitado. Debe asegurarse de que la caja no se intercambie antes de hacer esto. Si lo hace, entonces el núcleo verá desaparecer la memoria y el OOM-Killer probablemente comenzará a eliminar aplicaciones arbitrariamente. No hay ninguna razón por la que deba 'limpiar' el intercambio de esta manera. (ver mi otro comentario) :)
popey
51
En realidad, el intercambio se copia, básicamente, en RAM, o más exactamente, las páginas se vuelven a cambiar desde el disco a la RAM antes de que el intercambio se pueda desactivar.
SpamapS
14
Las páginas se copian a la RAM solo si aún son necesarias para algún proceso. A veces, una página intercambiada pertenece a un proceso que ya ha finalizado, y al núcleo no le importa eliminar estas páginas del intercambio inmediatamente.
BrunoJCM
66
Esta debería ser la respuesta correcta, ya que es la forma de devolver las páginas intercambiadas a la RAM y luego vaciar la memoria de intercambio
Alfonso Jiménez
144

También puede establecer su valor de "intercambio" desde el valor predeterminado de 60, de esta manera el intercambio no crecerá tanto para empezar. Por qué el valor predeterminado de envío se establece en 60 cuando el valor recomendado es 10 me deja perplejo. Desde Ubuntu SwapFAQ :

La configuración predeterminada en Ubuntu es swappiness = 60. La reducción del valor predeterminado de swappiness probablemente mejorará el rendimiento general de una instalación de escritorio típica de Ubuntu. Se recomienda un valor de intercambio = 10 , pero siéntase libre de experimentar.

Al cambiar este valor a 10 o incluso 0, puede agregar un aumento de velocidad significativo y perceptible a un sistema anterior con un disco lento. Establecer este valor en 0 no desactiva el intercambio para el kernel Linux 3.4 e inferior, pero con 3.5+ lo hace, por lo que querrá usar un valor de 1 si desea mantenerlo en su configuración más baja *.

No veo ninguna razón para no establecer esto en 0 ya que cualquier cosa que golpea el disco es más lenta que la RAM. Tengo 8 núcleos virtuales, un SSD rápido y 8 GB de memoria y mi intercambio está configurado en 0. A partir de este momento tengo 3 máquinas virtuales en funcionamiento, mi uso de memoria es 7.1 de 7.7 GB, mi intercambio usado es solo de 576 KB de ¡952 MB y todos los sistemas funcionan sin problemas!

Desde Ubuntu SwapFAQ :

El parámetro swappiness controla la tendencia del núcleo a mover procesos fuera de la memoria física al disco de intercambio. Debido a que los discos son mucho más lentos que la RAM, esto puede conducir a tiempos de respuesta más lentos para el sistema y las aplicaciones si los procesos se eliminan demasiado agresivamente de la memoria.

  1. el intercambio puede tener un valor de entre 0 y 100
  2. swappiness = 0 le dice al kernel que evite intercambiar procesos fuera de la memoria física el mayor tiempo posible
  3. swappiness = 100 le dice al kernel que intercambie agresivamente los procesos fuera de la memoria física y los mueva a intercambiar caché

A continuación se presentan instrucciones básicas para verificar el intercambio, vaciar el intercambio y cambiar el intercambio a 0:

Para verificar el valor de intercambio:

cat /proc/sys/vm/swappiness

Para establecer temporalmente el intercambio en 0 ( como lo sugiere SpamapS ):

Esto vaciará su intercambio y transferirá todo el intercambio nuevamente a la memoria. Primero asegúrese de tener suficiente memoria disponible al ver la pestaña de recursos de gnome-system-monitor, su memoria libre debe ser mayor que su intercambio utilizado. Este proceso puede llevar un tiempo, use gnome-system-monitor para monitorear y verificar el progreso.

sudo swapoff --all

Para establecer el nuevo valor en 0:

sudo sysctl vm.swappiness=0 

Para volver a activar el intercambio:

sudo swapon --all

Para establecer permanentemente el intercambio en 0:

  1. sudoedit /etc/sysctl.conf
  2. Agrega esta línea vm.swappiness = 0
  3. sudo shutdown -r now # reiniciar sistema

* Con la versión 3.5+ del kernel, el cambio de configuración a 0 lo desactiva por completo y se recomienda una configuración de 1 si desea el algoritmo de intercambio más bajo. fuente: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/

Elijah Lynn
fuente
1
Acabo de actualizar la respuesta para incluir una forma permanente de configurar el intercambio. No estoy seguro de cómo se votó tanto, supongo que nadie lo probó.
Elijah Lynn
1
Más buena lectura sobre swappiness en esta respuesta => askubuntu.com/a/103916/11929
Elijah Lynn
3
No estoy seguro de si esto estaba disponible cuando el autor publicó originalmente la respuesta, pero existe un valor de intercambio de "60" para las instalaciones del servidor ubuntu ya que ese entorno tiene un conjunto diferente de especificaciones de rendimiento. help.ubuntu.com/community/…
Frito
1
Esta configuración es muy efectiva para controlar el tamaño del intercambio. Mi sistema tiene 16G de RAM y 16G de intercambio. A veces estoy corriendo a máquinas virtuales y algunas de mis aplicaciones se intercambian. Cuando cierro las máquinas virtuales, el uso de RAM disminuye, pero el uso de intercambio sigue siendo el mismo y mi sistema se retrasa al cambiar de aplicación. Cambiar el intercambio me ha mejorado el rendimiento.
kapad
1
Esta debería ser la respuesta aceptada realmente. Explicación exhaustiva del problema, y ​​su solución, así como enlaces y una solución para retener la memoria Swap, pero ayudan a mantenerlo bajo control en primer lugar. Cosas geniales. Gracias. :)
Jack_Hu
53

Descubrí que el intercambio de vaciado puede ayudar mucho en sistemas con discos lentos y RAM limitada. Por supuesto, como ya se mencionó, la forma de hacerlo es correr sudo swapoff -a; sudo swapon -a. El problema aquí es que si no hay suficiente RAM, hacerlo causará todo tipo de problemas.

He escrito un guión que llamo toggle_swapque me ha funcionado durante los últimos años. Comprueba si hay suficiente RAM libre antes de desactivar el intercambio. Aquí está:

#!/bin/bash

free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
Scott Cesantía
fuente
Impresionante estaba buscando algo como esto. Tal vez para estar un poco más seguro podría presentar el número y los porcentajes y luego preguntar, solo para estar absolutamente seguro.
Atherion
2
He actualizado el código y he creado un gist
Jekis
Esta es la conclusión a la que llegué después de leer todos los consejos, como uno debería asegurarse de alguna manera de que haya suficiente RAM antes de matar el intercambio. Gracias señor, maravilloso guión. Debería incluirse en Ubuntu por defecto (no es broma, realmente es imprescindible).
Shiki
Excepto que si ejecuta algo nuevo mientras apaga el intercambio, y antes de que vuelva a encenderse, no tendrá suficiente memoria.
barteks2x
Eso depende de la cantidad de memoria libre que tenga. Si hay suficiente memoria libre para guardar todo en el intercambio Y el nuevo proceso, entonces no hay problema. Si no, entonces tienes razón.
Scott Severance el
25

Después de jugar un poco con el intercambio durante un par de días, he llegado a la conclusión de que el núcleo debe dejarse en sus propios dispositivos. Sabe lo que está haciendo y está optimizado para brindarle la mejor experiencia.

A menos que tenga una buena razón para querer recuperar ese disco, lo dejaría en paz.

Erigami
fuente
2
Tenía algunas cosas en el intercambio, vmstat me mostró que estaba sucediendo el intercambio y el intercambio, y Chrome estaba retrasado, mientras que mi CPU apenas se usaba. Buena razón, ¿no?
Xerus
Definitivamente, hay casos en los que cierto intercambio en el escritorio hace que sea lento. (no mientras se intercambia, sino también después, cuando hay suficiente RAM, durante mucho tiempo después). Entonces, en el mejor de los casos, esta respuesta es solo una experiencia subjetiva que ocurre en algunos casos.
Cray
-1

No afecta el rendimiento si su espacio de intercambio está ocupado. La única penalización de rendimiento es que las cosas entran / salen del intercambio. Si no se intercambia / intercambia nada, entonces no tiene que preocuparse por nada.

Rory
fuente
10
Sí, pero si se intercambia algo, afecta el rendimiento, de ahí esta pregunta.
cuant
Eso es una verdadera tontería, por lo general, los grandes intercambios de respaldo están en HDD o generalmente en un dispositivo más lento que la RAM, si se agota el espacio, se intercambian las cosas existentes, como por ejemplo, el navegador de Internet, y luego prácticamente lo está usando desde el dispositivo más lento. ..
jave.web