Liberando espacio de intercambio


10

A veces, el núcleo parece tener la intención de mantener, por ejemplo, Firefox en el intercambio, a pesar de que hay suficiente memoria física disponible y estoy usando Firefox:

robert@rm:~> free -m
             total       used       free     shared    buffers     cached
Mem:          3009       1904       1104          0        109        679
-/+ buffers/cache:       1116       1892
Swap:         4102        885       3216

¿Hay un comando para indicar al kernel que deje caer el espacio de intercambio y use la memoria libre disponible?


Actualización : aunque a corto plazo he usado swapon / swapoff, ahora configuro

sudo sysctl vm.swappiness=30

como se sugiere en otra respuesta, y obtenga muy buenos resultados.

Respuestas:



15

Podrías hacer lo que Nik sugirió y usar swapoff . Sin embargo, hay otra forma más elegante de modificar "swappiness", o cuán agresivamente el kernel intercambia programas en el disco en sistemas que ejecutan los kernel 2.6.

Ha habido acalorados debates sobre las listas de correo del kernel de Linux sobre la política que el kernel debe seguir con respecto al comportamiento de intercambio . El resultado es que ahora tenemos un parche en 2.6 núcleos que nos permite ajustar este comportamiento en gran medida.

Tenga en cuenta que necesita privilegios de root para hacer esto, como lo haría para ejecutar los comandos swapoff / swapon.

El valor actual de "swappiness" se puede inspeccionar en el archivo / proc / sys / vm / swappiness , o ejecutando este comando sysctl :

sudo sysctl vm.swappiness

Los valores de "intercambio" pueden variar de 0 (sin intercambio) a 100 (cambiar al disco tanto como sea ​​posible). Ubuntu se envía con el intercambio predeterminado establecido en 60.

Para cambiar esto para una sesión, llame a sysctl nuevamente y páselo como valor de intercambio para usar:

sudo sysctl vm.swappiness=30

Además de gratis , puedes controlar los efectos de hacerlo a través de las excelentes utilidades htop o iotop .

Si le gusta lo que ve y desea conservar este valor en los reinicios, simplemente coloque "vm.swappiness = 30" en el archivo /etc/sysctl.conf .

$ sudo sysctl vm.swappiness
vm.swappiness = 30
$ sudo sysctl vm.swappiness=40
vm.swappiness = 40
$ sudo sysctl vm.swappiness
vm.swappiness = 40
$ sudo tail /etc/sysctl.conf 
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#
# The contents of /proc/<pid>/maps and smaps files are only visible to 
# readers that are allowed to ptrace() the process
# kernel.maps_protect = 1
vm.swappiness=30

Puede jugar con diferentes valores hasta que encuentre uno que implique un nivel aceptable de intercambio en su máquina.


+1 para sysctl. Al experimentar con diferentes valores de swappiness, puede escribir directamente en el archivo proc (echo "30"> / proc / sys / vm / swappiness). Estos cambios son temporales y no se escribirán en /etc/sysctl.conf. Una vez que esté satisfecho con la configuración, use sysctl para hacer un cambio 'permanente'.
Shawn Chin

6

Recuerde que las cosas en el intercambio se pusieron allí en un momento más ocupado que ahora.

Es posible que los datos también estén en la RAM, ya que se volvieron a cargar para su uso pero no se borraron del intercambio. El núcleo hace esto para ahorrar tiempo en el próximo período ocupado: si los datos ya se copian allí, puede liberar la RAM que está utilizando en lugar de tener que hacer primero las escrituras en disco. Por lo tanto, a menos que sepa que la máquina no necesitará volver a intercambiar en el futuro cercano, forzar la liberación del espacio de intercambio no puede lograr nada, excepto reducir la velocidad un poco más la próxima vez que se necesite el intercambio.

Esto se gestiona sobre una base de borrado en escritura, por lo que si se actualiza la copia en la RAM, se liberarán los bloques en el intercambio.

Si el espacio de intercambio es necesario para otra cosa, que no será en este momento, ya que tiene mucho espacio libre, por supuesto, se liberará para ese uso.

No puede ver cuántos datos hay en este estado (de estar tanto en páginas basadas en disco en áreas de intercambio como en RAM) en la salida de free. Sin embargo, puede verlo a través del /procsistema de archivos especial. Mira la salida de cat /proc/meminfopara el SwapCachedrecuento.

Otras dos razones para que haya intercambio en uso cuando aparentemente hay memoria libre son

  • cuando está bajo una carga de E / S pesada, el núcleo ha decidido que las páginas que no se han utilizado durante mucho tiempo se intercambian mejor para que pueda usar la RAM para caché / búferes, aunque mirando su freesalida que probablemente no sea el caso aquí como usted tener una porción de RAM verdaderamente no asignada, así como la utilizada por el caché / buffers de E / S.
  • las páginas se intercambiaron por alguna razón anteriormente, y simplemente no se han vuelto a necesitar desde entonces, tal vez es la memoria en uso por un proceso que ha estado inactivo durante algún tiempo. En este caso, liberar el intercambio (por lo que cargar las páginas de nuevo en la RAM) puede mejorar el tiempo de respuesta de ese proceso la próxima vez que sea necesario hacer algo que no sea dormir, pero si ha estado inactivo durante algún tiempo, puede que no sea necesario en cualquier momento en el futuro cercano de todos modos.

1
+1 para una excelente explicación. Para su información, vmstat le permite ver / proc / meminfo datos a través de no todos.

1

Recuerde que freees solo una instantánea del uso de la memoria. El resultado que está viendo puede implicar que, en algún momento en el pasado, el sistema se estaba quedando sin RAM, por lo que se cambió el material residente en RAM. Desde entonces, la RAM se ha liberado, pero no se ha requerido el material en el intercambio, por lo que todavía se mantiene en el intercambio en lugar de solo saturar la RAM. Si ese es el caso, desactivar el intercambio sería una mala idea. ¿Hay algún proceso que pueda exigir una cantidad tan grande de RAM desde la última recarga?

Además, es posible que desee verificar que no tiene una restricción en el tamaño máximo de residente establecido a través de ulimit (generalmente en / etc / profile pero tal vez varía con las distribuciones y se puede configurar por proceso (por ejemplo, en un script de inicio) )

Finalmente, en Microsoft Windows hay informes de problemas específicos con Firefox que se cambia al disco, por ejemplo, cuando se minimiza (por ejemplo, http://joeabiraad.com/mozilla-firefox/control-your-firefox-ram-usage/113 ). No he oído hablar de eso en los sistemas GNU / Linux, pero puede valer la pena explorarlo.


Gracias por la respuesta. Mi problema no es que se esté usando el intercambio, sino que ahora se usa para programas activos, por ejemplo, Firefox y Thunderbird, que se sienten lentos. Un intercambio / swapon los hizo sentir ágiles nuevamente.
Robert Munteanu
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.