Intercambiar en tmpfs (Obviamente, una mala idea, pero ¿es posible?)


11

Esta pregunta se originó con una broma entre compañeros de trabajo sobre el aumento del rendimiento al mover archivos de intercambio a un tmpfs. Claramente, incluso si esto es posible, no es una buena idea. Todo lo que quiero saber es, ¿se puede hacer?

Actualmente estoy en Ubuntu 14.04, pero imagino que el proceso es similar para la mayoría de las máquinas Linux / Unix. Esto es lo que estoy haciendo:

> mkdir /mnt/tmp
> mount -t tmpfs -o size=10m tmpfs /mnt/tmp
> dd if=/dev/zero of=/mnt/tmp/swapfile bs=1024 count=10240
> chmod 600 /mnt/tmp/swapfile
> mkswap /mnt/tmp/swapfile
# So far, so good!

> swapon /mnt/tmp/swapfile
swapon: /mnt/tmp/swapfile: swapon failed: Invalid argument

Entonces, en Linux o Unix (estoy interesado en cualquier solución), ¿puede configurar de alguna manera el intercambio en un archivo / partición que reside en RAM? ¿Hay alguna forma de evitar el Invalid argumenterror que obtengo arriba?

De nuevo, solo quiero enfatizar que no espero que esto sea una solución a un problema del mundo real. Solo un experimento divertido, supongo.


¿Estás buscando zram?
frostschutz

Respuestas:


1

Entonces, en Linux o Unix (estoy interesado en cualquier solución), ¿puede configurar de alguna manera el intercambio en un archivo / partición que reside en RAM?

Por supuesto. En FreeBSD:

# swapinfo -h
Device          1024-blocks     Used    Avail Capacity
/dev/mirror/swap.eli     4194300       0B     4.0G     0%

Eso muestra que actualmente, tengo una partición de intercambio encriptada 4G con redundancia duplicada. Agregaré otro 4G de intercambio no redundante, no encriptado:

Primero cree un mddispositivo de "disco de memoria" ( ) respaldado por 4G RAM :

# mdconfig -a -t malloc -s 4g; mdconfig -lv
md0
md0     malloc   4096M  -

Luego diga swaponque agregue eso al grupo de dispositivos de intercambio disponibles, y swapinfoconfirma que ahora tengo 8G de intercambio:

# swapon /dev/md0; swapinfo -h
Device          1024-blocks     Used    Avail Capacity
/dev/mirror/swap.eli     4194300       0B     4.0G     0%
/dev/md0            4194304       0B     4.0G     0%
Total               8388604       0B     8.0G     0%

Mover la marca de verificación de "respuesta aceptada" después de 4 años es una decisión difícil. ¡Esta respuesta muestra que hay un camino! mdconfig(8)incluye una nota de que omitir la -o reserveopción "es una forma muy fácil de aterrorizar un sistema". También señala que se puede establecer el tipo swapque permite el escenario muy entretenido de un sistema que mueve páginas de memoria al intercambio que en sí reside en la memoria. Incluso hay una opción -o forcepara tontos como yo que quieren omitir "controles de cordura extra". Me reí mucho al leer esto.
vastlysuperiorman

10

No debería ser posible. swaponla llamada al sistema requiere readpagey bmap(indirectamente) las llamadas implementadas por el sistema de archivos:

http://lxr.free-electrons.com/source/mm/swapfile.c?v=4.0#L2412

if (!mapping->a_ops->readpage) {
    error = -EINVAL;
    goto bad_swap;
}   

Pero ninguno de ellos está implementado por tmpfs , falta una entrada correspondiente en address_space_operations: http://lxr.free-electrons.com/source/mm/shmem.c?v=4.0#L3104

Por la misma razón, tmpfs no puede contener montajes de bucle, y ramfs tampoco funcionará (no tiene bmapllamada)


3

De estas preguntas y respuestas /superuser/539287/swapon-failed-invalid-argument-on-a-linux-system-with-btrfs-filesystem (el sitio original de referencia no responde):

Por lo tanto, "Argumento no válido" debe leerse como "Su sistema de archivos no admite archivos de intercambio"

La razón de incompatibilidad que sospecho es una "dependencia circular". De este artículo: http://www.jamescoyle.net/knowledge/951-the-difference-between-a-tmpfs-and-ramfs-ram-disk :

Estas dos diferencias entre ramfs y tmpfs hacen que tmpfs sea mucho más manejable, sin embargo, este es un inconveniente importante; tmpfs puede usar espacio SWAP. Si su sistema se queda sin RAM física, los archivos en sus particiones tmpfs pueden escribirse en particiones SWAP basadas en disco y deberán leerse desde el disco la próxima vez que acceda al archivo.

Lo cual sería prácticamente imposible en su escenario.

Se puede trabajar con ramfs, aunque - que no tiene este problema.


Sí, establecer una tmpfspartición como intercambio comenzaría y un bucle sin fin cuando la máquina comience a intercambiar.
dr_

1

Puede evitar fácilmente los problemas con las funciones faltantes y cambiar a tmpfs, aunque de forma indirecta:

dd if=/dev/zero bs=1M of=/tmp/swapfs count=128
chmod 0600 /tmp/swapfs
mkfs.ext2 /tmp/swapfs
mount -o loop /tmp/swapfs /mnt
dd if=/dev/zero bs=1M of=/mnt/swap
mkswap /mnt/swap
swapon /mnt/swap

Combinado con zswap, parecía una excelente solución de "expansor de memoria" hasta que mi RasPi4 se congeló casi por completo (la consola ssh se congeló, X se congeló, youtube en Chrome siguió hablando durante varios minutos y también se congeló, pero el sistema estaba respondiendo a pings y el perro guardián no lo hizo). No haga nada útil. Lanzado a través de ssh (antes de que eso ocurriera) en la parte superior no mostraba nada sobresaliente también: parecía haber suficiente espacio libre de memoria RAM e intercambio, de hecho, una idea similar con OpenSolaris (cambiar a un zvol comprimido) conducir a un resultado similar.


@Jesse_b, ¿haría alguna diferencia hacer un enlace en lugar de un montaje de bucle en ese archivo?
Jueves

@rjt: No estoy seguro. No escribí la respuesta, solo la edité.
jesse_b

@unisol, ¿tu swapfile creció más allá de lo previsto? Llenando espacio en disco
rjt

1
¿Dónde exactamente usa esto realmente RAM? Parece que crea un archivo en / tmp / que persiste durante los reinicios en mi máquina.
Rjt

Se pensaba que tenía tmpfs montado en / tmp (es bueno en términos de "no queda nada después del reinicio" y a menudo se usa en configuraciones integradas, pero peligroso si tiene poca RAM y es desagradable cuando algo no cabe en su / tmp - como mc desempacando varios conciertos de archivo). El tema de inicio no pudo obtener el archivo de intercambio utilizando un sistema de archivos basado en RAM, por lo que simplemente creo un archivo en él, lo formateo en cualquier FS que tenga las capacidades necesarias (es decir, ext2) y creo un intercambio en ese FS. Aros y bucles adicionales, pero se logra el objetivo.
unisol
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.