Linux / perl mmap performance

Estoy tratando de optimizar el manejo de grandes conjuntos de datos utilizando mmap. Un conjunto de datos está en el rango de gigabyte. La idea era colocar en memoria el archivo completo en la memoria, permitiendo que múltiples procesos trabajen en el conjunto de datos al mismo tiempo (solo lectura). Sin embargo, no está funcionando como se esperaba.

Como prueba simple, simplemente hago un mapa del archivo (usando el módulo Sys :: Mmap de perl, usando el sub "mmap" que creo que se asigna directamente a la función C subyacente) y tengo el proceso en espera. Al hacer esto, el código pasa más de un minuto antes de regresar de la llamada mmap, a pesar de que esta prueba no hace nada, ni siquiera una lectura, del archivo mmap'ed.

Adivinando, pensé que tal vez Linux requería que se leyera todo el archivo cuando se hizo el primer mmap'ed, así que después de que el archivo se había mapeado en el primer proceso (mientras estaba durmiendo), invocé una prueba simple en otro proceso que intentaba leer el Primeros pocos megabytes del archivo.

Sorprendentemente, parece que el segundo proceso también pasa mucho tiempo antes de regresar de la llamada mmap, casi al mismo tiempo que mmap'ing el archivo la primera vez.

Me he asegurado de que MAP_SHARED se esté utilizando y de que el proceso que asignó el archivo la primera vez aún esté activo (que no haya finalizado y que el mmap no haya sido asignado).

Esperaba que un archivo mmapped me permitiera dar múltiples procesos de trabajo al acceso aleatorio efectivo al archivo grande, pero si cada llamada mmap requiere leer todo el archivo primero, es un poco más difícil. No he probado el uso de procesos de larga duración para ver si el acceso es rápido después de la primera demora, pero esperaba usar MAP_SHARED y otro proceso por separado sería suficiente.

Mi teoría era que mmap regresaría más o menos inmediatamente, y que Linux cargaría los bloques más o menos a pedido, pero el comportamiento que estoy viendo es el opuesto, lo que indica que requiere leer todo el archivo en cada llamada a mmap.

¿Alguna idea de lo que estoy haciendo mal o si no he entendido bien cómo se supone que funciona mmap?

Respuestas a la pregunta(9)

Su respuesta a la pregunta