Linux: ¿cómo deshacer explícitamente todo lo posible?


59

Lancé algo que tomó mucha memoria y ahora todo se retrasa mucho. Supongo que la memoria de todas las aplicaciones se ha cambiado para liberar espacio para el proceso de uso intensivo de memoria, y ahora todo vuelve lentamente a la RAM cuando se accede.

¿Hay alguna manera de mover explícitamente todo lo posible desde el intercambio de vuelta a la RAM? ¿O tal vez no todo, sino solo algunos datos de procesos particulares?

Respuestas:


59

Recomiendo permitir el intercambio normal de control de memoria de Linux en las cosas que realmente se usan, tal como se usan.

Lo único que puedo pensar es apagar el intercambio y volver a encenderlo

sudo swapoff -a
sudo swapon -a

Eso supone que tiene suficiente memoria física de reserva para contener todo en el intercambio ...


44
Funciona muy lentamente :) ¡Gracias! Pero aún así creo que hay una solución más elegante :)
kolypto

77
Cuidado con esta solución, sacará todo del intercambio a la fuerza ... si no se ajusta a la memoria física, el núcleo iniciará el mortal asesino OOM. No conozco ningún buen comando "intenta mover todo a RAM, pero falla con gracia si no es posible".
Juliano

1
Lo probé y descubrí que funciona muy lentamente. Por lo que es posible monitorizar la memoria RAM libre y matar swapoffsi la memoria pasa a nivel bajo: en este caso, el espacio de intercambio seguirá siendo funcional :)
kolypto

2
No estoy seguro de que matar swapoff realmente pare la operación. Depende de cómo se implemente.
Douglas Leeder

3
Parece que el comando swapoff hace algo como "no permitir que se intercambien nuevas escrituras" mientras que cualquier otro proceso en ejecución (que estaba / está usando swap) aún puede "liberar swap". Esto puede ser por qué parece ir tan lento. No parece causar OOM como dijo otra persona (estoy usando Ubuntu Bionic), probablemente ese sería el caso si "procesos adicionales (o existentes) comienzan a usar nueva memoria" (es decir, OOM reales). Así que, en general, el swapoff / swapon es una gran solución, parece. Suave / estable. Esto supone que no inicia más memoria utilizando procesos (o aumenta el consumo en los que se ejecutan).
Roel Van de Paar

13

Puede sintonizar haciendo eco de algún número entre 0 y 100 /proc/sys/vm/swappiness.

Este control se utiliza para definir qué tan agresivo el núcleo intercambiará páginas de memoria. Los valores más altos aumentarán la agresividad, los valores más bajos disminuyen la cantidad de intercambio . Un valor de 0 indica al núcleo que no inicie el intercambio hasta que la cantidad de páginas libres y respaldadas por archivos sea menor que la marca de límite superior en una zona.

El valor predeterminado es 60.


13
No use / proc / sys directamente, use el sysctlcomando en su lugar. En este caso, lo es sysctl vm.swappiness=x.
Juliano

77
¿No creo que incluso un intercambio de cero haga que las páginas que ya están intercambiadas se traigan explícitamente a la memoria principal?
Douglas Leeder

1
@ Douglas tiene razón. vm.swappiness controlará principalmente la decisión de si mover cosas para intercambiar o reducir la cantidad de cachés y almacenamientos intermedios cuando se requiere memoria.
Juliano

@Juliano, ¿por qué no debería usarse / proc / sys?
James

@James Porque / proc / sys es la interfaz de nivel inferior utilizada para cambiar y consultar la configuración del kernel (es "detalle de implementación"). Linux proporciona el sysctlcomando de nivel superior para la interacción del usuario. El resultado final es el mismo, pero generalmente se prefieren las interfaces de nivel superior para que el usuario interactúe directamente. Es como arrancar el motor haciendo un cortocircuito en los cables de encendido (nivel inferior) en lugar de simplemente girar la llave (nivel superior).
Juliano

5

Linux hace un buen trabajo administrando la memoria y no debe interponerse en su camino. La configuración de vm.swappiness (mencionada anteriormente) no se interpone en su camino. Es más probable que experimente problemas extraños al hacer las cosas de otra manera.

¿Qué lanzaste que tenía tanta memoria? ¿Se puede sintonizar? Si no tiene sus propias directivas de límite de memoria, también puede consultar ulimit.


En mi caso lo fue convert -density 200 file.pdf jpegs/file.jpg. Por alguna razón, usa mucha memoria, pero tienes razón: se puede ajustar. De todos modos, la situación es posible con cualquier aplicación :)
kolypto

1
Estoy de acuerdo con esta respuesta: probablemente debería dejar las operaciones normales en la máquina para intercambiar lo que realmente se necesita.
Douglas Leeder

converttiene el -limitargumento para controlar su memoria frente al uso del disco, y debe leer sobre ellos. El ajuste -limit memory 512MBo similar sería bueno. Probablemente también sería bueno especificar un MAGICK_TEMPORARY_PATH explícito y limpiarlo después de que su comando haya terminado.
Slacy

3

Si tiene la memoria disponible para todas sus aplicaciones, está bien establecer el intercambio en 0 para que las cosas no se intercambien. Por ejemplo, qemu-kvm es un gran objetivo que el VMM debe intercambiar, porque "parece" estar inactivo la mayor parte del tiempo. He visto que hasta el 80% de la memoria de una memoria qemu-kvm se escribe para intercambiar. Las máquinas virtuales que se ejecutan en qemu-kvm dejarán de responder porque se están quedando sin intercambio (aunque el invitado no tiene idea de que esto está sucediendo). La VM invitada pensará que está funcionando de manera excelente, aunque en realidad se está arrastrando terriblemente. Cuando un montón de máquinas virtuales "se despiertan" y comienzan a hacer cosas, puede aumentar el promedio de carga hasta más de 30, incluso en hardware de grado empresarial con memoria y disco rápidos y amplios. Supongo que esto es una falla en el diseño qemu-kvm listo para usar.

Espero que esto ayude a alguien.


Me temo que esto no es del todo exacto.
Marc.2377

2

Aconsejaría que no intente superar el subsistema VM en el núcleo. Es EXTREMADAMENTE improbable que realmente tenga suficiente información para tomar mejores decisiones de las que tendrá. Y si lo obligas de alguna manera a hacer lo incorrecto, terminarás haciendo las cosas aún más lentas.


99
Hay algunos casos en los que quiero hacer lo que el OP quiere. Si accidentalmente dejo que un proceso se ejecute y tome toda mi RAM + swap, entonces puedo esperar 15 segundos cada vez que cambie de aplicación para que la memoria salga del intercambio o simplemente forzarlo y hacer que todo funcione tan rápido como de costumbre.
Alex

Bueno ... quiero que suceda el "cambio" durante mi pausa para el café, no siempre cuando trato de cambiar de aplicación. ¿Es "pensar menos que el subsistema VM" cuando quiero informarle de un descanso para tomar café?
Klaws

1

Si puede reiniciar el sistema, debería hacerlo (y puede llevar mucho menos tiempo que probar cualquier otra solución).


1

Para copiar parte de mi respuesta de esta pregunta .

Para que sepas cómo funciona el swappiness sintonizable. Esto funciona diciéndole al subsistema VM que busque páginas para intercambiar cuando el% de memoria asignada para procesar tablas de páginas + valor de intercambio es> 100. Por lo tanto, una configuración de 60 hará que el sistema comience a paginar páginas obsoletas de la tabla de páginas de proceso cuando utiliza más del 40% de la memoria de su sistema. Si desea permitir que sus programas utilicen más memoria a expensas de la memoria caché, querrá reducir el valor de intercambio.


No creo que el problema sea la memoria del programa frente a la caché, creo que es la memoria de la aplicación frente a la memoria no utilizada. Y no creo que el intercambio afecte eso.
Douglas Leeder

0

¿El proceso aún se está ejecutando? Abra una terminal y vea si puede detectar los procesos que se iniciaron. (El nombre de proceso ps aux | grep podría facilitarlo un poco) Utilice kill -9 PID para eliminarlos si todavía se están ejecutando. Ten cuidado con lo que matas. Si no sabes cuál es el proceso, ¡no lo mates! Además, publique la salida de free -m para que podamos ver si todavía está usando mucho intercambio.

Si las cosas siguen funcionando lentamente, es posible que todavía tenga lo que haya lanzado todavía ejecutándose. Nunca desconectaría el intercambio a menos que realmente sepas lo que estás haciendo o te guste vivir al límite. =)


0

Creo que no hay una forma realmente buena de forzar el intercambio de datos de Linux del disco a la memoria. Cuando swapoff / swapon es una solución que funciona, pero está sucio y fácilmente puede hacer que su sistema sea inestable. Para los casos en que tenga más datos en el intercambio que memoria libre, será difícil imaginar una política eficiente que Linux pueda emplear para decidir qué datos se moverán a la memoria y qué piezas se guardarán en el disco.

Resumen: solo deje que Linux restaure gradualmente su rendimiento de la manera normal. Su subsistema VM está organizado de tal manera que se esfuerza y ​​se mueve constantemente a un estado equilibrado ideal.


-2

Vaciar la memoria caché de búferes

Si alguna vez quieres vaciarlos, puedes usar esta cadena de comandos.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

Puede indicar al kernel de Linux que deje caer varios aspectos de los elementos en caché cambiando el argumento numérico al comando anterior.

NOTA: limpie la memoria de cosas innecesarias (Kernel 2.6.16 o más reciente). ¡Siempre asegúrese de ejecutar la sincronización primero para eliminar cosas útiles en el disco!

  • Para liberar pagecache:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • Para liberar dentries e inodes:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • Para liberar pagecache, dentries e inodes:

    $ echo 3 > /proc/sys/vm/drop_caches
    

Lo anterior está destinado a ejecutarse como root. Si está tratando de hacerlos con sudo, deberá cambiar la sintaxis ligeramente a algo como esto:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.