En la memoria del sistema ... específicamente la diferencia entre `tmpfs,` `shm,` y `hugepages ...`

16

Últimamente he sentido curiosidad por los diversos sistemas de archivos basados ​​en la memoria del kernel de Linux.

Note:En lo que a mí respecta, las preguntas a continuación deben considerarse más o menos opcionales en comparación con una mejor comprensión de lo planteado en el título. Les pregunto a continuación porque creo que responderlas puede ayudarme mejor a comprender las diferencias, pero como mi comprensión es ciertamente limitada, se deduce que otros pueden saberlo mejor. Estoy preparado para aceptar cualquier respuesta que enriquezca mi comprensión de las diferencias entre los tres sistemas de archivos mencionados en el título.

En última instancia, creo que me gustaría montar un sistema de archivos utilizable con un hugepages,poco de investigación ligera (y aún más pequeños ajustes) me ha llevado a creer que a rewritable hugepage mountno es una opción. ¿Estoy equivocado? ¿Cuáles son las mecánicas en juego aquí?

También con respecto a hugepages:

     uname -a
3.13.3-1-MANJARO \
#1 SMP PREEMPT \
x86_64 GNU/Linux

    tail -n8 /proc/meminfo
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     8223772 kB
DirectMap2M:    16924672 kB
DirectMap1G:     2097152 kB

(Aquí hay versiones de texto completo de / proc / meminfo y / proc / cpuinfo )

¿Qué está pasando en lo anterior? ¿Ya estoy asignando? hugepages?¿Hay alguna diferencia entre las DirectMappáginas de memoria yhugepages?

Actualización Después de un pequeño empujón de @Gilles, agregué 4 líneas más arriba y parece que debe haber una diferencia, aunque nunca había oído hablar DirectMapantes de tirar eso tailayer ... ¿tal vez DMIo algo así?

Solo un poco más ...

Al no tener éxito con el hugepagesesfuerzo, y suponiendo copias de seguridad de disco duro de cualquier archivo de imagen, ¿cuáles son los riesgos de montar bucles desde tmpfs?mi sistema de archivos es swappedel peor de los casos? Entiendo que tmpfses el caché del sistema de archivos montado: ¿se puede sacar de memoria mi archivo de bucle montado? ¿Existen medidas atenuantes que pueda tomar para evitar esto?

Por último, ¿qué es exactamente de shm,todos modos? ¿Cómo difiere o incluye hugepagesotmpfs?

mikeserv
fuente
1
¿Qué pasa con las líneas anteriores /proc/meminfoque contienen HugePage(o su versión del kernel no tiene estas)? ¿En qué arquitectura está esto (x86_64, supongo)?
Gilles 'SO- deja de ser malvado'
Los agregaré. Me preocupaba que fuera demasiado tiempo.
mikeserv
@Gilles: me he vinculado al texto sin formato anterior. Espero que esté bien. Gracias por preguntar, debería haberlo incluido en primer lugar, no sé cómo me perdí eso.
mikeserv

Respuestas:

13

No hay diferencia entre tmpfs y shm. tmpfs es el nuevo nombre para shm. shm significa SHaredMemory.

Ver: Linux tmpfs .

La razón principal por la que tmpfs se usa hoy en día es este comentario en mi / etc / fstab en mi cuadro gentoo. Por cierto, Chromium no se construirá con la línea que falta:

# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for 
# POSIX shared memory (shm_open, shm_unlink). 
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0 

que salió de la documentación del kernel de Linux

Citando:

tmpfs tiene los siguientes usos:

1) Siempre hay un montaje interno del núcleo que no verá en
absoluto. Esto se utiliza para asignaciones anónimas compartidas y
memoria compartida SYSV .

Este montaje no depende de CONFIG_TMPFS. Si no se establece CONFIG_TMPFS, la parte visible del usuario de tmpfs no se compila. Pero los
mecanismos internos siempre están presentes.

2) glibc 2.2 y superior espera que tmpfs se monte en / dev / shm para la
memoria compartida POSIX (shm_open, shm_unlink). La adición de la siguiente
línea a / etc / fstab debería encargarse de esto:

tmpfs / dev / shm tmpfs predeterminado 0 0

Recuerde crear el directorio en el que piensa montar tmpfs si es necesario.

Este montaje no es necesario para la memoria compartida SYSV. El
montaje interno se utiliza para eso. (En las versiones del kernel 2.3 era
necesario montar el predecesor de tmpfs (shm fs) para usar la
memoria compartida SYSV )

3) A algunas personas (incluido yo) les resulta muy conveniente montarlo,
por ejemplo, en / tmp y / var / tmp y tienen una gran partición de intercambio. Y ahora
los montajes en bucle de los archivos tmpfs funcionan, por lo que mkinitrd enviado por la mayoría de las
distribuciones debería tener éxito con un tmpfs / tmp.

4) Y probablemente mucho más que no sé sobre :-)

tmpfs tiene tres opciones de montaje para dimensionar:

tamaño: el límite de bytes asignados para esta instancia de tmpfs. El valor predeterminado es la mitad de su RAM física sin intercambio. Si sobredimensiona sus instancias tmpfs, la máquina se bloqueará ya que el controlador OOM no podrá liberar esa memoria.
nr_blocks: igual que el tamaño, pero en bloques de PAGE_CACHE_SIZE.
nr_inodes: el número máximo de inodos para esta instancia. El valor predeterminado es la mitad de la cantidad de páginas de RAM físicas o (en una máquina con highmem) la cantidad de páginas de RAM de baja memoria, la que sea menor.

Del documento transparente del núcleo de Hugepage:

El soporte transparente de Hugepage maximiza la utilidad de la memoria libre en comparación con el enfoque de reserva de hugetlbfs al permitir que toda la memoria no utilizada se use como caché u otras entidades móviles (o incluso inamovibles). No requiere reserva para evitar que las fallas de asignación de páginas grandes se noten desde el país de usuario. Permite que la paginación y todas las demás funciones avanzadas de VM estén disponibles en las grandes páginas. No requiere modificaciones para que las aplicaciones lo aprovechen.

Sin embargo, las aplicaciones se pueden optimizar aún más para aprovechar esta característica, como por ejemplo, se han optimizado antes para evitar una avalancha de llamadas al sistema mmap por cada malloc (4k). La optimización de la zona de usuario no es, de lejos, obligatoria y khugepaged ya puede encargarse de las asignaciones de páginas de larga duración, incluso para aplicaciones inconscientes de páginas enormes que manejan grandes cantidades de memoria.


Nuevo comentario después de hacer algunos cálculos:

Tamaño de página enorme: 2MB
Página enorme utilizada: Ninguna / Desactivada, como lo demuestran todos los 0, pero habilitada según los 2Mb anteriores.
DirectMap4k: 8.03Gb
DirectMap2M: 16.5Gb
DirectMap1G: 2Gb

Usando el párrafo anterior con respecto a la optimización en THS, parece que las aplicaciones que funcionan con mallocs de 4k, 16.5Gb, han solicitado aplicaciones de mallocs de 2M. Las aplicaciones que usan mallocs de 2M están imitando el soporte de HugePage al descargar las secciones de 2M en el núcleo. Este es el método preferido, porque una vez que el kernel libera el malloc, la memoria se libera al sistema, mientras que el montaje de tmpfs usando la página enorme no daría lugar a una limpieza completa hasta que el sistema se reiniciara. Por último, el más fácil, tenía 2 programas abiertos / en ejecución que solicitaban un malloc de 1Gb

Para aquellos de ustedes que leen que no conocen un malloc, hay una Estructura estándar en C que significa Asignación de memoria. Estos cálculos sirven como prueba de que la correlación del OP entre DirectMapping y THS puede ser correcta. También tenga en cuenta que montar un HUGEPAGE SOLO fs solo generaría una ganancia en incrementos de 2 MB, mientras que permitir que el sistema administre la memoria utilizando THS se produce principalmente en bloques de 4k, lo que significa que, en términos de administración de memoria, cada llamada malloc ahorra el sistema 2044k (2048 - 4 ) para algún otro proceso a utilizar.

eyoung100
fuente
2
Esto es realmente bueno, ¿ es el THS mi DirectMap ?
mikeserv
Eso no puedo responder porque busqué en Google DirectMapping y no encontré nada relacionado con tmpfs, etc. Lo único que pude encontrar fue cómo configurar el soporte HugeMem para las bases de datos Oracle que se ejecutan en su versión de Linux, lo que significa que están usando HugePages en lugar de THS Me referí a Sin embargo, todos los núcleos en la rama 2.6 admiten THS. Como una corazonada, mira mi nuevo comentario arriba.
eyoung100
Sí, también aparecí muy poco. He leído algo sobre HP, THP. Estoy bastante intrigado por tu comentario. Esto realmente se está formando, hombre. Esta última parte, solo HP , ¿debo interpretar que significa que puedo montar un sistema de archivos de lectura / escritura sobre un montaje de página enorme? ¿Como un archivo de imagen montado en bucle desde un soporte de página enorme? Escribible?
mikeserv
Sí, y se puede escribir cuando se monta correctamente, pero tenga en cuenta: 1. Desde que lo montó, está a cargo de la limpieza 2. Es un desperdicio: usando su ejemplo, digamos que su bucle solo contenía un archivo de texto, con Los Personajes: Hola, mi nombre es Mike. Suponiendo que cada personaje sea 1k, ese archivo se guardará como 23k. Has desperdiciado 2025k ya que Hugepage te dio 2MB. Ese comportamiento derrochador es la razón por la que la gestión de memoria se incorporó al núcleo. También nos impide necesitar una DLL de contenedor como kernel32
eyoung100
y por último 3. Pierde su montura al reiniciar o estrellarse.
eyoung100
4

Para abordar el problema de "DirectMap": el núcleo tiene una asignación lineal ("directa") de memoria física , separada de las asignaciones virtuales asignadas a cada proceso de usuario.

El núcleo utiliza las páginas más grandes posibles para esta asignación para reducir la presión TLB.

DirectMap1G es visible si su CPU admite páginas de 1 Gb (Barcelona en adelante; algunos entornos virtuales las deshabilitan), y si está habilitado en el kernel, el valor predeterminado está activado para 2.6.29+.

GreenReaper
fuente
3

No hay diferencia entre shmy tmpfs(en realidad, tmpfses solo el nuevo nombre del anterior shmfs). hugetlbfses un tmpfssistema de archivos basado en el que asigna su espacio de páginas enormes del núcleo y necesita una configuración adicional (la forma de usar esto se explica en Documentation / vm / hugetlbpage.txt ).

Andreas Wiese
fuente
Este fue un buen intento, y había leído esos documentos, por supuesto. O tal vez no, por supuesto , pero creo que voy a sacar esto por una recompensa de 100 repeticiones, pero antes de hacerlo, te lo ofreceré si puedes ampliar esto. Hasta ahora aún no ha enriquecido mi comprensión : ya sabía la mayor parte, excepto que los dos eran simplemente sinónimos. En cualquier caso, si puede hacer que esta sea una mejor respuesta para mañana por la mañana, la recompensa de 100 repeticiones es suya. Especialmente interesante para mí es que no encuentro ninguna mención DirectMapen la procfs manpágina. ¿Cómo?
mikeserv
1
@mikeserv - Encontré esta diferencia que muestra qué función se calculan los DirectMaps a partir de: lkml.org/lkml/2008/11/6/163
slm