Linux lee con anticipación cuando se realizan lecturas simultáneas en el mismo archivo

Linux lee con anticipación cuando se realizan lecturas simultáneas en el mismo archivo

Linux realiza lecturas anticipadas (especificadas en /sys/block//queue/read_ahead_kb) cuando un archivo se lee secuencialmente.

SO interesado: Red Hat Linux Sistema de archivos interesado: xfs, ext4

¿Cuál es el criterio para decidir que se realiza una lectura secuencial?Considere múltiples lecturas simultáneas realizadas en el mismo archivo usando pread (https://man7.org/linux/man-pages/man2/pwrite.2.html) con FD iguales o diferentes.

p.ej

Mismo FD. lecturas en las posiciones 10-20-30-78-89 (lecturas fuera de secuencia) -40-50-60-70 - 23-34 (lecturas fuera de secuencia) - 80-90-100...

¿Podrían las lecturas sutiles fuera de secuencia anteriores evitar lecturas anticipadas en este caso?

Si es así, ¿el uso de dos FD diferentes resolvería este problema (es decir, un FD separado utilizado para lecturas en 78-89-23-34)? (es decir, las lecturas anticipadas se realizarán como de costumbre para las lecturas 10-20-30-40-50)

Respuesta1

¿Las lecturas sutiles fuera de secuencia anteriores pueden evitar lecturas anticipadas en este caso?

Sí, las lecturas fuera de secuencia del mismo descriptor de archivo pueden afectar las lecturas anticipadas, pero el núcleo intenta tener esto en cuenta, al menos para pequeñas lecturas "aleatorias" en paralelo con lecturas secuenciales. Verla descripción del diseño de lectura anticipada bajo demanda, En particular:

En lecturas secuenciales entrelazadas, las transmisiones simultáneas en el mismo fd pueden invalidar el estado de lectura anticipada de cada uno. Entonces marcamos la nueva página de lectura anticipada en (start+size-async_size) con PG_readahead y la usamos como indicador de lectura anticipada. La bandera no se establecerá en páginas que ya están almacenadas en caché, para evitar el problema de lectura anticipada para nada, ahorrando búsquedas inútiles en la caché de páginas.

Puedes ver dónde encaja esto mirandoondemand_readahead, En particularsu llamado atry_context_readaheady los comentarios circundantes.

Como siempre, cuando intenta eliminar cuellos de botella de rendimiento, no debe tener en cuenta los cuellos de botella potenciales excepto como sugerencias: debe idear sus propios puntos de referencia y analizar las características de rendimiento de sus escenarios específicos. Podría darse el caso, por ejemplo, de que sus lecturas fuera de secuencia solo lean páginas visitadas que ya están en el caché de páginas como resultado de la lectura anticipada de sus lecturas secuenciales.

información relacionada