¿En qué punto la lectura asíncrona de E / S de disco es más eficiente que la sincrónica?


22

Suponiendo que hay algún código que lee archivos para múltiples consumidores, y los archivos son de cualquier tamaño arbitrario: ¿A qué tamaño se vuelve más eficiente leer el archivo de forma asincrónica? O para decirlo de otra manera, ¿qué tan pequeño debe ser un archivo para que sea más rápido solo para leerlo sincrónicamente?

Me he dado cuenta (y tal vez soy incorrecto) de que al leer archivos muy pequeños, lleva más tiempo leerlos de forma asincrónica que sincrónica (en particular con .NET). Supongo que esto tiene que ver con el tiempo de configuración para cosas como puertos de finalización de E / S, hilos, etc.

¿Hay alguna regla general para ayudar aquí? ¿O depende del sistema y del entorno?


¿Puedes dar el código que usas como punto de referencia? Creo que esto podría suceder solo en el caso en que el tamaño del archivo sea menor que el tamaño del búfer interno del lector de flujo. Pero si tiene que leer tantos archivos pequeños, probablemente tendrá otros problemas con la
E

No tengo el código a mano, me temo. Es algo con lo que me encontré hace un tiempo y ha estado en mi mente desde entonces. El código estaba en .NET y era esencialmente un File.ReadAllBytes () vs FileStream.BeginRead () directo en un bucle for
blesh

Cuando las curvas que representan su eficiencia se cruzan y el IO asíncrono sale del cruce a un valor más alto que la curva IO de sincronización.
Thomas Eding

Respuestas:


14

Lamentablemente, la respuesta es "depende". Sería fácil para usted escribir un pequeño programa para determinar empíricamente los tiempos de las lecturas asíncronas y sincronizadas.

Dependerá de muchos factores. ¿Se almacenan en discos giratorios, SSD o una unidad de red? ¿Qué tipo de CPU estás usando? ¿Cuántos enchufes / núcleos? ¿Está ejecutando en una máquina virtual o metal desnudo? ¿Estás ejecutando un sistema operativo antiguo o moderno?


1
Sí, me lo imaginé. Supongo que esperaba que hubiera algún tipo de estudio para usar como guía o regla general.
carne

9

Async tiene 3 ventajas principales:

  1. Reduce la utilización de la CPU. Esto podría ser útil si también está realizando operaciones pesadas de CPU con datos que acaba de leer.
  2. El uso de algún tipo de infraestructura asíncrona hace que el código sea fácil de paralelizar. Especialmente si estás leyendo muchos archivos.
  3. Al enviar múltiples solicitudes de lectura y escritura al sistema operativo, el sistema operativo y el hardware pueden reordenar esas operaciones para que se completen más rápido. SATA2 tiene tal característica.

Creo que la principal ventaja de la lectura asincrónica es cuando está trabajando con muchos archivos o necesita mucha potencia de CPU.


Tenga en cuenta para el punto 2 que no optimizará nada si la operación de E / S es el cuello de botella. Las cosas son diferentes si está accediendo en paralelo, a través de RAID o red, a archivos que se encuentran en diferentes discos.
Arseni Mourzenko

55
Hmm, tengo problemas para entender lo que quieres decir con el n. ° 1. Yo diría que es al revés en la práctica. Porque con el caso asíncrono, ahora está cambiando su (s) hilo (s) de blocked waiting for I/O(0% CPU) a continue normal processing(> 0% CPU).
Isak Savo

3

Depende

Una cosa a tener en cuenta es lo costoso que es un cambio de contexto entre procesos. Node.JS está diseñado de la manera en que está porque asume que hacer un cambio de contexto es muy costoso y de lo contrario tendrás muchos procesos esperando en IE, lo que atascará la computadora.

Por otro lado, Erlang hace que un cambio de contexto de proceso sea muy barato, por lo que todo puede ser sincrónico y el tiempo de ejecución de Erlang puede realizar un seguimiento de todo.

Entonces los factores a considerar:

  • El costo de una operación de cambio de contexto
  • la velocidad del disco para operaciones de búsqueda
  • la velocidad del disco para operaciones de lectura
  • son los archivos en caché

Y estoy seguro de que estoy dejando de lado media docena de factores


2

No estoy seguro de que haya un "punto" particular, pero tiene más sentido cuando tienes muchos subprocesos funcionando, ya que te permite superponer tu E / S con otro trabajo. Si tiene hilos de repuesto inactivos, leer de forma asincrónica no le dará ninguna ventaja. Es solo cuando tiene que completar las colas de trabajo y su hilo podría estar haciendo otro trabajo útilmente en lugar de esperar E / S que el acceso asíncrono a los archivos ofrece alguna ventaja.


sí, ese es el punto de multihilo!
Vlad

1

Creo que el problema aquí no es tanto la velocidad de lectura como la latencia.

Si está leyendo desde una unidad de red, o desde una unidad de disco duro mecánica lenta con largas colas, el rendimiento caerá en picada para la lectura. Y si su aplicación también está leyendo en el hilo de la GUI, en cuyo caso es una aplicación muy mala, entonces será horrible para el usuario.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.