A che punto la lettura asincrona dell'I / O del disco è più efficiente di quella sincrona?

20

Supponendo che ci sia un po 'di codice che legge i file per più utenti e che i file sono di qualsiasi dimensione arbitraria: A che dimensioni diventa più efficiente leggere il file in modo asincrono? O per dirla in altro modo, quanto deve essere piccolo un file per essere più veloce solo per leggerlo in modo sincrono?

Ho notato (e forse sono errato) che durante la lettura di file molto piccoli, ci vuole più tempo per leggerli in modo asincrono rispetto alla sincronia (in particolare con .NET). Suppongo che questo abbia a che fare con il tempo di installazione per cose come I / O Completion Ports, threads, ecc.

Esiste qualche regola empirica per dare una mano qui? O dipende dal sistema e dall'ambiente?

    
posta blesh 12.09.2012 - 16:25
fonte

5 risposte

14

Sfortunatamente, la risposta è "dipende". Sarebbe facile per te scrivere un piccolo programma per determinare empiricamente i tempi delle letture asincrone e di sincronizzazione.

Dipenderà da molti fattori. Sono memorizzati su dischi rotanti, SSD o un'unità di rete? Che tipo di CPU stai usando? Quanti socket / core? Stai correndo in una VM o in un bare metal? Stai utilizzando un sistema operativo antico o moderno?

    
risposta data 12.09.2012 - 16:34
fonte
8

Async ha 3 vantaggi principali:

  1. Riduce l'utilizzo della CPU. Questo potrebbe essere utile se stai anche facendo operazioni pesanti con la CPU con i dati che hai appena letto.
  2. L'utilizzo di una sorta di infrastruttura asincrona rende il codice facile da paralizzare. Soprattutto se stai leggendo molti file.
  3. Inviando più richieste di lettura / scrittura a OS, OS e HW è possibile riordinare queste operazioni per essere completate più velocemente. SATA2 ha tale caratteristica.

Credo che il vantaggio principale della lettura asincrona sia quando lavori con molti file o hai bisogno di molta potenza della CPU.

    
risposta data 12.09.2012 - 17:53
fonte
3

Dipende

Una cosa da tenere a mente è quanto sia costoso un cambio di contesto tra i processi. Node.JS è progettato in questo modo perché presuppone che fare un cambio di contesto sia molto costoso e che altrimenti ci siano un sacco di processi in attesa su IE che impantanerà il computer.

D'altro canto, Erlang rende un contesto di processo molto economico, quindi tutto può essere sincronizzato e il tempo di esecuzione di Erlang può tenere traccia di tutto.

Quindi i fattori da considerare:

  • il costo di un'operazione di cambio di contesto
  • la velocità del disco per cerca operazioni
  • la velocità del disco per le operazioni di lettura
  • sono i file nella cache

E sono sicuro che sto tralasciando una mezza dozzina di fattori

    
risposta data 12.09.2012 - 18:13
fonte
2

Non sono sicuro che ci sia un particolare "punto", ma ha più senso quando hai un sacco di thread che funzionano, in quanto ti permette di sovrapporre i tuoi I / O con altri lavori. Se i thread di riserva sono inattivi, leggere in modo asincrono non ti darà alcun vantaggio. È solo quando si riempiono le code di lavoro e il thread può fare un buon lavoro anziché attendere che l'I / O acceda a un accesso asincrono ai file.

    
risposta data 12.09.2012 - 22:46
fonte
1

Penso che il problema qui non sia tanto la velocità di lettura, quanto la latenza.

Se stai leggendo da un'unità di rete, o da un'unità disco rigido meccanica lenta con lunghe code, le prestazioni saranno necessarie per la lettura. E se la tua app sta anche facendo la lettura nel thread della GUI, nel qual caso è un'applicazione pessima, allora sarà terribile per l'utente.

    
risposta data 13.09.2012 - 07:11
fonte

Leggi altre domande sui tag