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

183

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

    
pregunta Mysterio 30.06.2012 - 00:16

6 respuestas

160

Podría intentar cambiar su valor de "swappiness":

De Preguntas frecuentes sobre el intercambio de Ubuntu :

  

¿Qué es swappiness y cómo lo cambio?

     

El parámetro swappiness controla la tendencia del núcleo a mover los procesos fuera de la memoria física y hacia el 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 sacan de la memoria demasiado agresivamente.

     
  1. swappiness puede tener un valor de entre 0 y 100

  2.   
  3. swappiness = 0 le dice al kernel que evite intercambiar procesos fuera de la memoria física durante el mayor tiempo posible

  4.   
  5. swappiness = 100 le dice al kernel que cambie los procesos de la memoria física y los mueva al caché de intercambio

  6.   

La configuración predeterminada en Ubuntu es swappiness = 60. Reducir el valor predeterminado de swappiness probablemente mejore el rendimiento general de una instalación de escritorio típica de Ubuntu. Se recomienda un valor de swappiness = 10, pero no dude en experimentar. Nota: las instalaciones del servidor Ubuntu tienen diferentes requisitos de rendimiento para los sistemas de escritorio, y es probable que el valor predeterminado de 60 sea más adecuado.

     

Para verificar el valor de swappiness

     

cat /proc/sys/vm/swappiness

     

Para cambiar el valor de swappiness Se puede hacer un cambio temporal (perdido al reiniciar) con un valor de swappiness 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éguela al final del archivo como se muestra a continuación:

     

vm.swappiness=10

     

Guarde el archivo y reinicie.

También puedes visitar: enlace

    
respondido por el jpetersen 30.06.2012 - 01:10
83

Hay algunos aspectos diferentes a su pregunta.

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

Cómo utiliza Linux RAM (muy simplificado)

Cada aplicación puede usar parte de tu memoria. Linux usa todos los demás memoria desocupada (excepto los últimos Mb) como "caché". Esto incluye la memoria caché de página, las memorias caché de inode, etc. Esto es bueno: ayuda a acelerar las cosas. Tanto la escritura en el disco como la lectura desde el disco pueden acelerarse enormemente mediante el caché.

Idealmente, tiene suficiente memoria para todas sus aplicaciones y aún le quedan varios cientos de Mb para caché. En esta situación, siempre que sus aplicaciones no aumenten el uso de su memoria y el sistema no tenga problemas para obtener suficiente espacio para la memoria caché, no hay necesidad de ningún intercambio.

Una vez que las aplicaciones reclaman más RAM, simplemente ingresan en parte del espacio utilizado por la memoria caché, lo que reduce la caché. Desasignar el caché es tan barato y fácil que simplemente se realiza en tiempo real: todo lo que se encuentra en el caché es solo una segunda copia de algo que ya está en el disco, por lo que puede ser desasignado instantáneamente, o es algo que haríamos. Tuve que enjuagar el disco en los siguientes segundos de todos modos .

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 forma diferente: algunos incluyen el caché como parte de lo que consideran "libre" y otros no.

Cuando habla de RAM libre, es mucho más significativo incluir caché , porque prácticamente es gratis, está disponible en caso de que alguna aplicación lo solicite. En Linux, el comando free lo informa en ambos sentidos: la primera línea incluye el caché en la columna RAM utilizada, y la segunda línea incluye el caché (y los búferes) en la columna gratuita.

Cómo usa Linux el intercambio (incluso más simplificado)

Una vez que haya agotado la memoria suficiente como para que no quede suficiente para una memoria caché 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 intercambiar. Tiene un algoritmo bastante "borroso". Se necesitan muchas cosas en cuenta, que se pueden describir mejor con "cuánta presión hay para la asignación de memoria". Si hay mucha "presión" para asignar nueva memoria, aumentará las posibilidades de que se intercambie para hacer más espacio. Si hay menos "presión", disminuirá estas posibilidades.

Su sistema tiene una configuración de "swappiness" 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 modifiques. El intercambio es, en general, algo muy bueno, aunque existen algunos casos extremos en los que perjudica el rendimiento. Si observa el rendimiento general del sistema, es un beneficio neto para una amplia gama de tareas. Si reduce la confusión, permite que la cantidad de memoria caché se reduzca un poco más de lo que lo haría, incluso cuando realmente puede ser útil. Si esto es una buena compensación para cualquier problema que tenga con el intercambio depende de usted. Deberías saber lo que estás haciendo, eso es todo.

Existe una situación bien conocida en la que el intercambio realmente daña el rendimiento percibido en un sistema de escritorio, y eso se debe a la rapidez con que las aplicaciones pueden responder a la entrada del usuario después de permanecer inactivo durante mucho tiempo y tener procesos de fondo pesados ​​en IO ( como una copia de seguridad durante la noche) ejecutar. Esta es una lentitud muy visible, pero no lo suficiente como para justificar el cierre de intercambio todo junto y muy difícil de prevenir en cualquier sistema operativo. Desactive el intercambio y esta lentitud inicial después de la copia de seguridad / análisis 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 seleccionar la memoria que no se está usando, leída o escrita desde. 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, 8GB es una gran cantidad para una distribución típica de Linux), muy raramente llegará a una situación en la que se necesite cambiar. Incluso puedes intentar desactivar el intercambio. Nunca recomiendo hacerlo, pero solo porque nunca se sabe cuando más memoria RAM puede salvarlo de una falla de la aplicación. Pero si sabes que no vas a necesitarlo, puedes hacerlo .

¿Pero cómo puedo cambiar la velocidad de mi sistema? ¿No cambia las cosas lentamente?

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

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á el bloqueo de una aplicación o la muerte forzosa.

El intercambio solo está asociado con momentos en los que el sistema tiene un rendimiento deficiente porque ocurre en momentos en que se está quedando sin RAM utilizable, lo que ralentizaría su sistema (o lo haría inestable) incluso si no has intercambiado Entonces, para simplificar las cosas, el intercambio ocurre porque su sistema se está atascando, y no al revés.

Una vez que los datos están en intercambio, ¿cuándo vuelven a salir?

Transferir datos fuera del intercambio es (al menos para discos duros tradicionales) tan lento como ponerlo ahí. Por lo tanto, comprensiblemente, su kernel será tan reacio a eliminar datos del intercambio, especialmente si no se están usando (es decir, leídos o escritos). Si tiene datos en el intercambio y no está siendo utilizado, entonces es bueno que permanezca en intercambio, ya que deja más memoria para otras cosas que están siendo utilizadas, lo que podría acelerar su sistema.

    
respondido por el thomasrutter 04.07.2012 - 05:50
21

Establecer el valor de swappiness no funciona en todas las situaciones. Si funciona para ti, genial. Si no es así, he escrito un guión para borrarlo de forma periódica apagándolo y volviendo a encenderlo.

Alternar el intercambio es un poco arriesgado si no tienes cuidado. Si no tienes suficiente RAM libre para guardar todo en RAM plus todo en el intercambio, intentar deshabilitar el intercambio hará que el sistema deje de responder. Mi script comprueba primero si hay suficiente RAM libre (lo que requiere un poco de esfuerzo, ya que la cantidad real de RAM libre es diferente de la que free informa como gratuita), luego solo cambia si es así. Pero, si tiene poca memoria RAM, no comience 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 }')"
buffers="$(echo "$mem_data" | awk '{print }')"
cache="$(echo "$mem_data" | awk '{print }')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print }')"

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 ). Esta secuencia de comandos no dejará su sistema insensible; si no tienes suficiente RAM, se negará a alternar swap. He usado este script sin problemas durante casi cinco años.

    
respondido por el Scott Severance 04.07.2012 - 04:38
4

En general, el intercambio no se utiliza en los sistemas actuales. En mi experiencia, los procesos que se ejecutan durante un tiempo prolongado sin operaciones intensivas se cambian al intercambio por el Linux.
Hace que algunos programas afectados se ejecuten lentamente.
Si tiene muchos RAM libres, puede desactivar el intercambio ejecutando el comando:
swapoff -av (necesitará sudo de derechos para este).
Si no le gusta el intercambio, puede activarlo utilizando el comando simétrico:
swapon -av (de nuevo sudo requerido).

    
respondido por el drake01 30.06.2012 - 00:24
3

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

Una forma de forzar estas páginas en la memoria es apagar el dispositivo de intercambio. Si tiene dos, puede desactivar uno, volver a encenderlo y luego apagar el segundo. Si el intercambio es realmente necesario, se moverá entre dispositivos. Simplemente puede desactivar 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 espacio de intercambio, y se intercambiará como el resto de la memoria. Si ejecuta algo que requiere mucho disco temporal, puede obligar a cambiar las páginas. Una vez creados, los archivos temporales ya no se pueden usar después de un par de minutos y son buenos candidatos para ser movidos al dispositivo de intercambio.

En una pizca, puede usar un archivo como un dispositivo de intercambio. Esto es útil si necesita espacio extra de intercambio temporalmente.

    
respondido por el BillThor 30.06.2012 - 06:02
2

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

#!/bin/bash

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

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
    
respondido por el derberlinersmurf 03.10.2017 - 15:37

Lea otras preguntas en las etiquetas