2012-06-21 16 views
5

Estoy implementando el comando cp (copia de archivo) usando mmap(). Para eso mapeé el archivo fuente en el modo MAP_PRIVATE (como solo quiero leer) y el archivo de destino en el modo MAP_SHARED (ya que tengo que volver a escribir el contenido modificado del archivo de destino).Cómo deshabilitar Copy-on-write y zero filled on demand para mmap()

Al hacer esto, he observado una penalización de rendimiento debido a muchas fallas de página menores que se producen debido a 2 razones. 1) Cero relleno bajo demanda al llamar a mmap (MAP_PRIVATE) para el archivo de origen. 2) Copia en escritura mientras llamas a mmap (MAP_SHARED) para el archivo de destino.

¿Hay alguna forma de deshabilitar el relleno cero bajo demanda y el método de escritura por copia?

Gracias, Harish

+0

Me sorprende que vea una penalización de rendimiento para relleno cero, ¿cómo lo está midiendo? No desea deshabilitar COW, es fundamental para la forma en que funciona la memoria virtual y mejora el rendimiento. ¿Has considerado que usar 'write (2)' podría ser más eficiente para la copia? Especifique el mapa privado como el búfer para escribir. También evita el paso de expandir el nuevo archivo, ya que 'write (2)' lo hará por usted. – cdarke

+0

Estoy midiendo el error de página menor por getrusage(). Muestra que hay casi 50000 fallas menores en la página para copiar 1gb de archivo con mmam() (casi 25000 para mmap (MAP_PRIVATE) y lo mismo para write mmap (MAP_SHARED)). Sí, he comprobado que write (2) es más eficiente que mmap() para copiar, pero creo que mmap() puede ser eficiente si deshabilitamos Zero-fill-on-demand y Copy-on-write. – Harish

+0

Harish, marque 'syscalls 'madvice()' y 'mlock()'. Pueden afectar el número de fallas de página. Y para una copia de archivo rápida, compruebe syscall 'sendfile()'. – osgx

Respuesta

2

hay un pabellón MMAP_POPULATE de mmap (2):

http://linux.die.net/man/2/mmap

MAP_POPULATE (desde Linux 2.5.46) pueblan (pre-falla) tablas de páginas para una cartografía. Para una asignación de archivos, esto provoca la lectura anticipada en el archivo. Los accesos posteriores a la asignación no serán bloqueados por fallas de página. MAP_POPULATE solo es compatible con mapeos privados desde Linux 2.6.23.

Debe pre-fallar todas las páginas en la región mmapped. Debería funcionar para la pregunta (1), y puede no funcionar para la pregunta (2) (compartida).

+2

Nota: 'MAP_POPULATE' significa que no hay retrasos cuando se utiliza la asignación (a menos que se propague por la presión de la memoria), pero también significa que la llamada' mmap' bloquea hasta que se lea todo el archivo. A menudo es mejor evitar 'MAP_POPULATE' a favor de [' posix_madvise'] (http://linux.die.net/man/3/posix_madvise) (o no estandarizado ['madvise'] (http://linux.die.net/ man/2/madvise)) usando 'POSIX_MADV_WILLNEED', que es equivalente a' MAP_POPULATE', pero no bloquea. Puede abrir/asignar el archivo de origen, aconsejarle que lo cargue, y el sistema operativo leerá en segundo plano a granel, en lugar de exigir fallas. – ShadowRanger

+0

Puede bloquear la lectura desde 'mmap', pero como toda la lectura está programada por adelantado, la lectura ya estará en progreso cuando llegue a la página despoblada; no estará enviando nuevas solicitudes de E/S en vivo. – ShadowRanger