Diferencia de rendimiento entre ramfs y tmpfs

23

Necesito configurar un sistema de almacenamiento en memoria para alrededor de 10 GB de datos, que consta de muchos archivos individuales (imágenes) de 100 kb. Habrá muchas lecturas y escrituras bastante periódicas (agregar nuevos archivos, eliminar algunos viejos).
Ahora, sé que tmpfs se comporta como un sistema de archivos normal para el que puede, por ejemplo, verificar el espacio libre / usado con df , que es una buena característica. Sin embargo, estoy interesado si ramfs ofrecería algunas ventajas con respecto a la velocidad de las operaciones de E / S. Sé que no puedo controlar el tamaño de la memoria consumida cuando uso ramfs y que mi sistema puede bloquearse si consume completamente la RAM libre, pero eso no será un problema en este escenario.

En resumen, me interesa:
- Rendimiento inteligente, que es más rápido: ¿ ramfs o tmpfs (y posiblemente por qué)?
- ¿Cuándo tmpfs usa el espacio de intercambio? ¿Mueve los datos ya guardados para intercambiar (para liberar RAM para otros programas que se ejecutan actualmente) o solo datos nuevos si en ese momento no queda RAM libre?

Ivan Kovacevic
fuente
¿Cuánta RAM hay en el servidor?
ewwhite
1
El servidor tiene un total de 16 GB de RAM. También vale la pena señalar que no tengo un almacenamiento SSD sino un solo HDD de 7200 rpm. Es por eso que estoy considerando usar algún tipo de almacenamiento RAM.
Ivan Kovacevic

Respuestas:

21

Mi recomendación:

Mida y observe la actividad de la vida real en condiciones normales.

Es poco probable que esos archivos sean TODOS necesarios y se sirvan desde la memoria caché en todo momento. Pero hay una buena herramienta llamada vmtouch que puede decirte qué hay en el caché en un momento dado. También puede usarlo para bloquear ciertos directorios o archivos en la memoria caché. Entonces, vea cómo se ven las cosas después de un uso regular. Usar tmpfs y ramfs no es necesario para esta situación.

Ver: http://hoytech.com/vmtouch/

Creo que te sorprenderá ver que los archivos más activos probablemente ya residan en la memoria caché.


En cuanto a tmpfs versus ramfs, no hay una diferencia de rendimiento apreciable. Hay diferencias operacionales. Un caso de uso de la vida real es Oracle, donde se utilizó ramfs para permitir que Oracle gestione los datos en la RAM sin el riesgo de que se intercambien. Los datos tmpfs se pueden intercambiar bajo presión de memoria. También hay diferencias en cambiar el tamaño y modificar la configuración sobre la marcha.

ewwhite
fuente
1
Impresionante pequeña utilidad! +1
Janne Pikkarainen
1
@ewwhite Excelente respuesta. En uno de nuestros casos, hace unos años, descubrimos que los archivos más utilizados ya residen en caché. Sugerencia: los sistemas de archivos de hoy en día son mucho más inteligentes de lo que creo.
giannisapi
13

No pienses demasiado en esto. Coloque suficiente RAM en su sistema y deje que el caché de disco del núcleo se encargue de las cosas por usted. De esta forma, obtiene el beneficio de las lecturas que provienen directamente de la memoria, al tiempo que puede conservar datos en el disco.

EEAA
fuente
1
Mi sistema actualmente tiene 16 GB de RAM. Es una instalación simple de Debian que ejecuta Nginx para servir esas imágenes. Tengo una conexión de red de 1 Gbit que estará bajo 100% de carga todo el tiempo, sirviendo esas imágenes en ningún orden en particular. ¿Crees que el kernel cargará todos esos 10 gigas de imágenes de todos modos en el caché en este escenario?
Ivan Kovacevic
3
Sí, si hay suficiente RAM en el sistema y otras aplicaciones en el servidor no compiten por los recursos de RAM, esos archivos permanecerán en caché.
EEAA
2
He estado en la administración de Unix durante ~ 15 años, y nunca me he encontrado con una situación en la que tmpfs / ramfs hubiera proporcionado algún beneficio sobre el caché fs del kernel nativo. Eso no quiere decir que no existan situaciones en las que se justifique, pero son bastante raras. Por lo general, si necesita memoria caché RAM para algunas cosas, se usa una capa de almacenamiento en caché especialmente diseñada (Redis / Memcache / etc.).
EEAA
44
El almacenamiento en caché de disco ciertamente funcionará para el caso en que las imágenes deben leerse, pero tmpfs o ramfs aún podrían ser útiles si desea acelerar muchas escrituras aleatorias / pequeñas pero están vinculadas a un disco que es lento con E / S aleatorias O. Tenga en cuenta que si la máquina falla o sufre una falla de energía, el contenido de tmpfs desaparecerá ya que (solo) estaban en la memoria.
Martijn
1
@Martijn tiene razón. tmpfs y ramfs son realmente útiles. Por ejemplo, estoy haciendo una reescritura intensiva (rama de filtro) de un repositorio git. Hacerlo en la memoria es mucho más rápido que hacerlo en mi SSD. El almacenamiento en caché ayuda con las lecturas, no las escrituras, ya que (normalmente) Linux tiene que cumplir con algunas garantías sobre la permanencia de las operaciones de disco.
Paul Draper
7

1) Referencia de rendimiento.

Usando esta página como referencia, hice una comparación de E / S entre tmpfs y ramfs, y los resultados son que es bastante idéntico en términos de rendimiento:

# !mount
mount | grep -E "tmp|ram"
tmpfs on /dev/shm type tmpfs (rw)
ramfs on /mnt/ram type ramfs (rw,size=1G)

# dd bs=1M count=1024 if=/dev/zero of=/dev/shm/test conv=fdatasync
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.634054 s, 1.7 GB/s

# dd bs=1M count=1024 if=/dev/zero of=/mnt/ram/test conv=fdatasync
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.559557 s, 1.9 GB/s

# dd bs=1M count=4096 if=/dev/zero of=/dev/shm/test conv=fdatasync
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 2.5104 s, 1.7 GB/s

# dd bs=1M count=4096 if=/dev/zero of=/mnt/ram/test conv=fdatasync
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 2.36923 s, 1.8 GB/s

2) Según esta página , tmpfs usa swap y ramfs no usa swap.

Michael Martinez
fuente
2
Su respuesta está en el camino correcto. Sin embargo, no estaría de acuerdo con su conclusión sobre el rendimiento, sus pruebas muestran que HAY diferencias de 0.2 GB / sy 0.1 GB / s a ​​favor de ramfs. Creo que esto debería probarse aún más para proporcionar una muestra estadística válida. Con respecto a 2) Sí, eso se sabe, sin embargo, me hubiera gustado tener una mejor idea de cuándo se utiliza el intercambio.
Ivan Kovacevic
Si hicimos este punto de referencia varias veces con archivos de diferentes tamaños, no creo que veamos una diferencia. notarás que cuando aumenté el tamaño cuatro veces, la diferencia en realidad se redujo en lugar de ampliarse.
Michael Martinez
1
¿Qué pasa con el caso en el que tienes un montón de archivos pequeños? Por ejemplo, escribir millones de archivos de 100-200 kb. ¿También obtiene una diferencia de 0.2 GB / s repetidamente para el mismo tamaño de archivo? Lo que definitivamente señalaría la diferencia de rendimiento. Probablemente lo probaré yo mismo cuando esté en mi horario. Pero es por eso que pregunté aquí, por lo que tal vez podría tacharlo de la lista de tareas si alguien más ya lo hizo.
Ivan Kovacevic
Sí, la única forma de saberlo con certeza es hacer las pruebas.
Michael Martinez
1

Si tiene una cantidad suficiente de RAM instalada para alojar los diversos búferes del núcleo, las aplicaciones se apilan y apilan, la memoria caché normal del sistema de archivos y todos los archivos que intenta colocar ramfsnunca deben ser más lentos, tmpfsya que no habrá riesgo de E / S física por diseño. Las E / S físicas son, sin duda, la principal causa de la degradación del rendimiento en esa área.

Sin embargo, si no tiene esa cantidad de RAM instalada, el uso ramfspodría y probablemente será más lento que tmpfscuando este último usa la heurística de memoria virtual para decidir qué debería estar mejor en el disco (es decir, en el área de intercambio) frente a lo que debería estar en la RAM mientras que con tmpfs, los datos de su sistema de archivos están atascados en la RAM, lo que podría ser un desperdicio de recursos.

Para responder a su segunda pregunta, sí, tmpfsmoverá los datos antiguos primero al área de intercambio, no a la última "activa".

jlliagre
fuente