GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo la asignación de memoria de un archivo tiene aumentos de rendimiento significativos en comparación con las llamadas al sistema de E/S estándar?

El mapeo de memoria de un archivo evita directamente copiar búferes que suceden con read() y write() llamadas Llamadas a read() y write() incluya un puntero al búfer en el espacio de direcciones del proceso donde se almacenan los datos. Kernel tiene que copiar los datos hacia/desde esas ubicaciones. Usando mmap() asigna el archivo al espacio de direcciones del proceso, por lo que el proceso puede abordar el archivo directamente y no se requieren copias.

Tampoco hay sobrecarga de llamadas al sistema cuando se accede al archivo asignado a la memoria después de la llamada inicial si el archivo se carga en la memoria en el mmap() inicial. . Si una página del archivo mapeado no está en la memoria, el acceso generará una falla y requerirá que el kernel cargue la página en la memoria. Leer un bloque grande con read() puede ser más rápido que mmap() en tales casos, si mmap() generaría un número significativo de fallas para leer el archivo. (Es posible avisar al kernel por adelantado con madvise() para que el núcleo pueda cargar las páginas antes de acceder).

Para obtener más detalles, hay una pregunta relacionada con Stack Overflow:mmap() frente a bloques de lectura


En primer lugar, en la mayoría de las operaciones de E/S, las características del hardware de almacenamiento subyacente dominan el rendimiento. Una matriz RAID5 mal configurada de veintinueve discos SATA S-L-O-W de 5400 rpm en un sistema lento y con poca memoria que usa S/W RAID con tamaños de bloque que no coinciden y sistemas de archivos desalineados le brindará un rendimiento deficiente en comparación con un sistema correctamente configurado y alineado. SSD RAID 1+0 en un controlador de alto rendimiento a pesar de cualquier ajuste de software que pueda probar.

Pero la única manera mmap() puede ser significativamente más rápido si lee los mismos datos más de una vez y los datos que lees no se paginan entre lecturas debido a la presión de la memoria.

Pasos del mapa de memoria:

  1. Llamada al sistema para crear mapeos virtuales - muy costoso
  2. El proceso accede a la memoria por primera vez, lo que provoca una falla de página:costoso (y es posible que deba repetirse si se cancela la página)
  3. El proceso realmente lee la memoria

Si el proceso solo realiza los pasos 2 y 3 una vez por cada bit de datos leídos, o si los datos se eliminan de la memoria debido a la presión de la memoria, mmap() va a ser más lento.

read() pasos:

  1. La llamada al sistema copia los datos del disco a la memoria caché de la página (puede o no fallar la página, es posible que los datos ya estén en la memoria caché de la página, lo que hace que se omita)
  2. Datos copiados de la memoria caché de la página a la memoria del proceso (puede o no fallar la página)

El mapeo de memoria solo superará este rendimiento debido a esa copia adicional del caché de la página para procesar la memoria. Pero una mera copia de una página de memoria (o menos) debe hacerse varias veces para reducir el costo de configurar el mapeo, probablemente. Cuántas veces depende de su sistema. Ancho de banda de la memoria, cómo se utiliza todo el sistema, todo. Por ejemplo, si el tiempo utilizado por la administración de memoria del kernel para configurar la asignación no hubiera sido utilizado por ningún otro proceso, el costo de crear la asignación realmente no es muy alto. Por el contrario, si tiene mucho procesamiento en su sistema que involucra una gran cantidad de creación/destrucción de asignación de memoria virtual (es decir, muchos procesos de corta duración), el impacto de la E/S asignada a la memoria puede ser significativo.

Luego está read() usando E/S directa:

  1. Llamada al sistema para leer del disco en el espacio de la memoria del proceso. (puede o no causar un error de página)

Las lecturas de E/S directas son prácticamente imposibles de superar en cuanto a rendimiento. Pero realmente tiene que ajustar sus patrones de E/S a su hardware para maximizar el rendimiento.

Tenga en cuenta que un proceso puede controlar bastante si la lectura de datos provoca una falla de página para el búfer que el proceso está usando para leer.

Entonces, ¿el acceso a archivos mapeados en memoria es más rápido? Tal vez lo sea, tal vez no lo sea.

Depende de su(s) patrón(es) de acceso. Junto con su hardware y todo lo demás en su(s) ruta(s) de E/S.

Si está transmitiendo un archivo de video de 30 GB en una máquina con 4 GB de RAM, y nunca regresa y vuelve a leer ninguno de los datos, la asignación de memoria del archivo es probablemente la peor manera de leerlo.

Por el contrario, si tiene una tabla de búsqueda de 100 MB para algunos datos a los que accede aleatoriamente miles de millones de veces en su procesamiento y suficiente memoria para que el archivo nunca se borre, el mapeo de memoria aplastará todos los demás métodos de acceso.

Una gran ventaja de los archivos mapeados en memoria

Los archivos de mapeo de memoria tienen una gran ventaja sobre otras formas de IO:la simplicidad del código. Es realmente difícil superar la simplicidad de acceder a un archivo como si estuviera en la memoria. Y la mayoría de las veces, la diferencia de rendimiento entre la asignación de memoria de un archivo y la realización de operaciones de E/S discretas no es tan grande.


Linux
  1. Linux:¿cómo obtener la fecha de creación de un archivo en un volumen lógico Ntfs?

  2. ¿Cómo realiza Unix un seguimiento del directorio de trabajo de un usuario al navegar por el sistema de archivos?

  3. Linux:¿con qué frecuencia se actualiza el sistema de archivos Proc en Linux?

  4. ¿Cómo sabe el comando Xdg-open qué aplicación usar para abrir un archivo?

  5. ¿Cómo el comando Sed '1!g;h;$!d' invierte el contenido de un archivo?

Aprenda los conceptos básicos de cómo funciona la redirección de E/S (entrada/salida) de Linux

Cómo solucionar el error "El repositorio no tiene un archivo de versión" en Ubuntu

¿Cómo puedo asegurarme de que mi sistema use el archivo ~/.screenrc?

¿Cuánta RAM usa el kernel?

¿Cómo calcula ACL los permisos efectivos en un archivo?

Montaje de un sistema de archivos a través de Internet