it-swarm-es.com

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

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, los 2GB de RAM se liberan, pero el mismo espacio de intercambio permanece.

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

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

304
jfoucher

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 comando vmstat. Déjelo funcionando unos segundos para que se calme y mire las columnas si (intercambio) y so (intercambio). Si no sucede nada, entonces no hay razón para preocuparse.

Aquí está el resultado de ejecutar 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í en top puede 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
168
popey

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

Sin embargo, si realmente siente que necesita forzarlo, (puedo ver un escenario en el que desearía saber que el sistema responderá más adelante) 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.

418
SpamapS

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. Del Ubuntu SwapFAQ :

La configuración predeterminada en Ubuntu es swappiness = 60. La reducción del valor predeterminado de intercambio probablemente mejorará el rendimiento general de una instalación de escritorio típica de Ubuntu. Se recomienda un valor de intercambio = 10 , pero no dude en 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!

Del Ubuntu SwapFAQ :

El parámetro swappiness controla la tendencia del núcleo a mover los 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 hay 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. Agregue 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/

144
Elijah Lynn

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 ejecutar 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_swap que me ha funcionado durante los últimos años. Comprueba si hay suficiente RAM antes de deshabilitar 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
53
Scott Severance

Después de jugar con swappiness durante un par de días, he llegado a la conclusión de que el kernel 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.

26
Erigami

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.

0
Rory