¿Por qué se usa el intercambio aunque tengo mucha RAM libre?

208

Pensé que toda la esencia del intercambio era actuar como una red de seguridad de almacenamiento temporal cuando la RAM estaba llena, pero mi partición de intercambio se usa constantemente a pesar de que a veces tengo hasta 3 GB de RAM libre. ¿Esto es normal?

Mysterio
fuente
3
Por favor, comparta el contenido o la salida de los siguientes comandos / archivos para ayudar mejor a solucionar su problema ( instrucciones de esta respuesta ) : free -m,top -b 1
ish
Actualizará la pregunta con pastebins de esos comandos mañana. Son las 12 de la mañana en este momento :(
Mysterio
Debería editar el título para agregar "... pero tengo demasiado sueño para preocuparme ahora, así que ustedes también toman una siesta": P
ish

Respuestas:

188

Puede intentar cambiar su valor de "intercambio":

De las preguntas frecuentes sobre el intercambio de Ubuntu :

¿Qué es el intercambio y cómo lo cambio?

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 por el mayor tiempo posible. Para Kernel versión 3.5 y posteriores, deshabilita el intercambio.

  3. swappiness = 100 le dice al kernel que intercambie agresivamente los procesos fuera de la memoria física y los mueva a intercambiar caché

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. Nota: las instalaciones del servidor Ubuntu tienen diferentes requisitos de rendimiento para los sistemas de escritorio, y el valor predeterminado de 60 es probablemente más adecuado.

Para verificar el valor de intercambio

cat /proc/sys/vm/swappiness

Para cambiar el valor de intercambio Se puede realizar un cambio temporal (perdido al reiniciar) con un valor de intercambio de 10 con

sudo sysctl vm.swappiness=10

Para hacer un cambio permanente , edite el archivo de configuración con su editor favorito:

gksudo gedit /etc/sysctl.conf

Busque vm.swappiness y cambie su valor como desee. Si vm.swappiness no existe, agréguelo al final del archivo de la siguiente manera:

vm.swappiness=10

Guarde el archivo y reinicie.

También puede consultar: https://askubuntu.com/a/103916/54187

jpetersen
fuente
1
Especulación inactiva: esto podría ser realmente beneficioso para el rendimiento: las páginas a las que no se ha accedido desde hace tiempo se pueden copiar en el espacio de intercambio, lo que permite que el sistema operativo las desaloje rápidamente si alguna vez necesita memoria, pero el contenido de la página permanece en la memoria .
Simon Richter
77
@SimonRichter Sí, esa es la idea. Sin embargo, el intercambio de 60 probablemente sea demasiado agresivo en los sistemas modernos, ya que eso significa que está comenzando a cambiar cuando todavía tiene varios conciertos de memoria libre.
Brendan Long
1
Ejecutar sudo sysctl --load=/etc/sysctl.confdespués de editar el archivo para aplicar los cambios
deFreitas
92

Hay algunos aspectos diferentes a su pregunta.

En primer lugar, cuál es su definición de "gratis". En realidad, no es tan simple como parece en Linux (o en cualquier sistema operativo moderno).

Cómo Linux usa RAM (muy simplificado)

Cada aplicación puede usar parte de su memoria. Linux usa toda la memoria no ocupada (excepto los últimos Mb) como "caché". Esto incluye el caché de página, los cachés de inodo, etc. Esto es algo bueno: ayuda a acelerar las cosas. Tanto la escritura en el disco como la lectura desde el disco se pueden acelerar enormemente mediante el caché.

Idealmente, tiene suficiente memoria para todas sus aplicaciones y todavía le quedan varios cientos de Mb para caché. En esta situación, siempre y cuando sus aplicaciones no aumenten el uso de memoria y el sistema no tenga problemas para obtener suficiente espacio para la memoria caché, no es necesario realizar ningún intercambio.

Una vez que las aplicaciones reclaman más RAM, simplemente entra en parte del espacio utilizado por el caché, reduciendo el caché. La desasignación de la memoria caché es barata y lo suficientemente fácil como para que se realice simplemente en tiempo real: todo lo que se encuentra en la memoria caché es solo una segunda copia de algo que ya está en el disco, por lo que puede desasignarse al instante, o es algo que haríamos De todos modos, he tenido que descargar el disco en los próximos segundos .

Esta no es una situación específica de Linux: todos los sistemas operativos modernos funcionan de esta manera. Los diferentes sistemas operativos podrían informar RAM libre de manera diferente: algunos incluyen el caché como parte de lo que consideran "libre" y otros no.

Cuando hablamos de RAM libre, es mucho más significativo incluir caché, porque prácticamente es gratis, está disponible si alguna aplicación lo solicita. En Linux, el freecomando informa en ambos sentidos: la primera línea incluye caché en la columna RAM utilizada, y la segunda línea incluye caché (y buffers) en la columna libre.

Cómo Linux usa el intercambio (aún más simplificado)

Una vez que haya usado suficiente memoria para que no quede suficiente para un caché que funcione sin problemas, Linux puede decidir reasignar parte de la memoria de la aplicación no utilizada de la RAM para intercambiar.

No hace esto de acuerdo con un límite definido. No es como si alcanzas un cierto porcentaje de asignación, entonces Linux comienza a intercambiarse. Tiene un algoritmo bastante "difuso". Tiene en cuenta muchas cosas, que se pueden describir mejor por "cuánta presión existe para la asignación de memoria". Si hay mucha "presión" para asignar nueva memoria, entonces aumentará las posibilidades de que algunas sean intercambiadas para hacer más espacio. Si hay menos "presión", disminuirá estas posibilidades.

Su sistema tiene una configuración de "intercambio" que le ayuda a ajustar cómo se calcula esta "presión". Normalmente no se recomienda alterar esto en absoluto, y no recomendaría que lo altere. El intercambio es en general algo muy bueno, aunque hay algunos casos extremos en los que perjudica el rendimiento, si se observa el rendimiento general del sistema, es un beneficio neto para una amplia gama de tareas. Si reduce la capacidad de intercambio, permite que la cantidad de memoria caché se reduzca un poco más de lo que lo haría de otra manera, incluso cuando realmente sea útil. Depende de usted si esto es una compensación suficiente para cualquier problema que tenga con el intercambio. Deberías saber lo que estás haciendo, eso es todo.

Existe una situación bien conocida en la que el intercambio realmente perjudica el rendimiento percibido en un sistema de escritorio, y eso es lo rápido que las aplicaciones pueden responder a la entrada del usuario nuevamente después de permanecer inactivo durante mucho tiempo y tener procesos en segundo plano pesados ​​en E / S (como un copia de seguridad durante la noche). Esta es una lentitud muy visible, pero no suficiente para justificar la desactivación del intercambio y es muy difícil de evitar en cualquier sistema operativo. Apague el intercambio y esta lentitud inicial después de la copia de seguridad / escaneo de virus puede no ocurrir, pero el sistema puede funcionar un poco más lento durante todo el día. Esta tampoco es una situación limitada a Linux.

Al elegir lo que se va a intercambiar en el disco, el sistema intenta elegir la memoria que realmente no se está utilizando: leer o escribir. Tiene un algoritmo bastante simple para calcular esto que elige bien la mayor parte del tiempo.

Si tiene un sistema en el que tiene una gran cantidad de RAM (al momento de escribir, 8 GB es una gran cantidad para una distribución típica de Linux), entonces rara vez se encontrará con una situación en la que sea necesario el intercambio. Incluso puede intentar desactivar el intercambio. Nunca recomiendo hacerlo, pero solo porque nunca se sabe cuándo una mayor cantidad de RAM puede salvarlo de algún bloqueo de la aplicación. Pero si sabe que no lo va a necesitar, puede hacerlo.

Pero, ¿cómo puede el intercambio acelerar mi sistema? ¿El intercambio no ralentiza las cosas?

El acto de transferir datos de la RAM al intercambio es una operación lenta, pero solo se toma cuando el núcleo está bastante seguro de que el beneficio general superará esto. Por ejemplo, si la memoria de su aplicación ha aumentado hasta el punto de que casi no le queda memoria caché y su E / S es muy ineficiente debido a esto, en realidad puede obtener mucha más velocidad de su sistema liberando algo de memoria, incluso después del gasto inicial de intercambio de datos para liberarlos.

También es un último recurso si sus aplicaciones realmente solicitan más memoria de la que realmente tiene. En este caso, el intercambio es necesario para evitar una situación de falta de memoria que a menudo provocará que una aplicación se bloquee o tenga que ser eliminada por la fuerza.

El intercambio solo se asocia con momentos en los que su sistema funciona mal porque sucede en momentos en que se está quedando sin RAM utilizable, lo que ralentizaría su sistema (o lo haría inestable) incluso si no tuviera el intercambio. Entonces, para simplificar las cosas, el intercambio ocurre porque su sistema se está estancando, en lugar de al revés.

Una vez que los datos se intercambian, ¿cuándo vuelven a salir?

Transferir datos fuera de intercambio es (al menos para los discos duros tradicionales) tan lento como ponerlo allí. De manera comprensible, su núcleo será tan reacio a eliminar datos del intercambio, especialmente si en realidad no se está utilizando (es decir, leído o escrito). Si tiene datos en el intercambio y no se está utilizando, entonces es realmente bueno que permanezca en el intercambio, ya que deja más memoria para otras cosas que se están utilizando, lo que puede acelerar su sistema.

thomasrutter
fuente
55
+1 para una explicación detallada. También me gusta mantener el intercambio de 2GiB en mis computadoras. Si algo sale mal: pérdidas de memoria, etc., puede ver que el intercambio aumenta y buscar el problema antes de que se agote la memoria. Es una red de seguridad, así como una herramienta de rendimiento.
Joe
1
En mi netbook, que solo tiene 2 GB de RAM, guardo 4 GB de intercambio. Esto se debe a que uso el netbook para mucho más de lo que estaba destinado y mis programas requieren con frecuencia más de 2 GB de memoria. Como Linux se comporta muy mal en situaciones de falta de memoria, prefiero tener una gran red de seguridad. Y tengo mucho espacio en disco.
Scott Severance
Si sus programas requieren con frecuencia más de 2 GB de memoria, consideraría arrojar más RAM allí (¡es muy barato!) Porque agotar la RAM perjudicará el rendimiento. Para el beneficio de otros lectores: asegúrese de que no solo esté mirando la memoria caché que se supone que acapara la RAM disponible; consulte otras referencias free -m.
thomasrutter
2
@neon_overload: Debo señalar que, según HP, la RAM máxima de mi netbook es de 1 GB. Ahora tengo 2 GB allí, y las fuentes de Internet sugieren que 2 GB es el máximo real. De ahí la necesidad de este tipo de soluciones.
Scott Severance
@thomasrutter: ¿Cómo cambia su respuesta para servidores grandes? Uno de los míos tiene 1TB (sí, un terabyte completo) de ram y aún está usando swap; ¿Qué configuración de intercambio y qué tamaño de partición de intercambio recomendaría?
chrisinmtown
24

Establecer el valor de intercambio no funciona en todas las situaciones. Si te funciona, genial. Si no, he escrito un script para limpiar periódicamente el intercambio apagándolo y volviendo a encenderlo.

Cambiar el intercambio es un poco arriesgado si no tienes cuidado. Si no tiene suficiente RAM libre para guardar todo en RAM más todo en el intercambio, intentar deshabilitar el intercambio hará que su sistema deje de responder. Mi script primero comprueba si hay suficiente RAM libre (lo que requiere un poco de trabajo, ya que la cantidad real de RAM libre es diferente de lo que se freeinforma como libre), luego solo alterna el intercambio si es así. Pero, si tiene poca RAM, no inicie otro proceso importante mientras se ejecuta el script. Aquí está:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
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)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Debe ejecutar este script como root (por ejemplo, con sudo). Este script no dejará su sistema sin respuesta; Si tiene RAM insuficiente, se negará a alternar el intercambio. He usado este script sin problemas durante casi cinco años.

Scott Cesantía
fuente
+1 para el guión. Es posible que desee modernizarlo un poco cambiando MB a MiB en las salidas. Escribí un script similar sin todas las (buenas) pruebas de seguridad que incluye. En mi vieja computadora portátil donde se usaba mucho el intercambio, tomaría un tiempo ejecutarlo, uno o dos minutos, pero no hizo daño. De vez en cuando fallaba porque no había suficiente memoria libre para que se ejecute, pero eso no causó ningún problema adicional. Tuve que reiniciar para aclarar las cosas cuando eso sucedió. Tenía que ver con lo que parecía una pérdida de memoria en la transmisión (ya que creo que está arreglado) y tener solo 2GiB de ram.
Joe
66
Si algo se ha movido para intercambiar y permanece en el intercambio, eso normalmente es algo bueno: significa que los datos no se están utilizando realmente y libera parte de su RAM para otras cosas, lo que da como resultado un aumento potencial de la velocidad. ¿Qué te ha llevado a creer que estos datos no deberían intercambiarse y deberían ocupar más RAM valiosa? Por lo general, el kernel es bastante bueno para saber qué no se usa y qué puede permanecer en un intercambio de forma segura para liberar RAM.
thomasrutter
@neon: Tenga en cuenta que mis máquinas tienen 2GB y 3GB de RAM, respectivamente, lo cual es bastante poco en estos días. La evidencia está en el desempeño. Por ejemplo, abrir menús o cambiar de programa puede ser lento debido al intercambio, al igual que los efectos visuales Compos. Esta lentitud se cura al alternar el intercambio, lo que demuestra que al menos en algunas situaciones los algoritmos de optimización del núcleo son subóptimos. No puedo discutir con la experiencia repetida.
Scott Severance
¡¡Uf!! Esto solo se redujo al 0% del intercambio ... No tuve mucho tiempo para analizar esta pregunta completa y su respuesta, pero lo preferí leerla cuando obtuve algo de tiempo libre.
AzkerM
¿Por qué no establecerías el intercambio a un valor bajo? Parecería estar haciendo lo mismo que su script, pero de una manera mucho más controlada.
jhfrontz
4

En general, el intercambio no se utiliza en los sistemas actuales. En mi experiencia, los procesos que se ejecutan durante mucho tiempo sin operaciones intensivas se cambian para ser intercambiados por Linux.
Hace que algunos programas afectados se ejecuten lentamente.
Si tiene mucho ram libre, puede apagar el intercambio ejecutando el comando:
swapoff -av(necesitará sudoderechos para ello).
Si no le gusta el intercambio, puede encenderlo, usando el comando simétrico:
swapon -av( de nuevo sudorequerido).

drake01
fuente
12
Volviendo de intercambio fuera del todo es una exageración ya swappiness = 0 hace lo mismo, pero más seguro (si lo hace terminar con demasiadas cosas en la memoria, arrojará algo en intercambio).
Brendan Long
@BrendanLong Fair point .. Gracias por enseñarme. :)
drake01
3

Una vez que se ha utilizado el intercambio para un programa, tiende a permanecer mapeado durante la vida del programa. Muchos programas tienen código (y datos) que rara vez se usan. Una vez que se intercambia la memoria, es poco probable que se intercambie.

Una forma de forzar estas páginas en la memoria es apagar el dispositivo de intercambio. Si tiene dos, puede apagar uno, volver a encenderlo y luego apagar el segundo. Si realmente se necesita el intercambio, se moverá entre dispositivos. Simplemente puede apagar el dispositivo de intercambio (o archivo), pero si realmente necesita espacio de intercambio, pueden ocurrir cosas drásticas.

Además de las cosas normales en la memoria, tempfs usa el espacio de intercambio, y se intercambiará como el resto de la memoria. Si ejecuta algo que requiere mucho disco temporal, puede forzar el intercambio de páginas. Una vez creados, los archivos temporales ya no pueden usarse después de un par de minutos y son buenos candidatos para ser trasladados al dispositivo de intercambio.

En caso de necesidad, puede usar un archivo como dispositivo de intercambio. Esto es útil si necesita espacio de intercambio adicional temporalmente.

BillThor
fuente
2

Edité el guión de Scott Severance para que coincida con las versiones más recientes de free que ya incluyen un campo de memoria total disponible.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
derberlinersmurf
fuente