W którym momencie asynchroniczny odczyt dysku I / O jest bardziej wydajny niż synchroniczny?

22

Zakładając, że jest trochę kodu, który odczytuje pliki dla wielu konsumentów, a pliki mają dowolny dowolny rozmiar: przy jakim rozmiarze bardziej efektywne jest odczytywanie pliku asynchronicznie? Innymi słowy, jak mały musi być plik, aby był szybszy tylko po to, by czytać go synchronicznie?

Zauważyłem (i być może się mylę), że podczas czytania bardzo małych plików odczytanie ich asynchronicznie zajmuje więcej czasu niż synchronicznie (w szczególności w .NET). Zakładam, że ma to związek z czasem konfiguracji takich rzeczy, jak porty zakończenia we / wy, wątki itp.

Czy jest tu jakaś praktyczna zasada? A może zależy to od systemu i środowiska?

blesh
źródło
Czy możesz podać kod, którego używasz do testu porównawczego? Myślę, że może się to zdarzyć tylko w przypadku, gdy rozmiar pliku jest mniejszy niż rozmiar bufora wewnętrznego czytnika strumienia. Ale jeśli musisz przeczytać tak wiele małych plików, prawdopodobnie napotkasz inne problemy z dyskowym
wejściem
Obawiam się, że nie mam pod ręką kodu. To coś, z czym wpadłem jakiś czas temu i od tamtej pory o tym myślę. Kod znajdował się w .NET i był zasadniczo prostym File.ReadAllBytes () vs FileStream.BeginRead () w pętli for
blesh
Gdy krzywe reprezentujące ich wydajność krzyżują się i asynchroniczne we / wy wychodzi ze skrzyżowania z wyższą wartością niż synchroniczna krzywa we / wy.
Thomas Eding,

Odpowiedzi:

14

Niestety odpowiedź brzmi: „to zależy”. Łatwo byłoby napisać mały program, który empirycznie określi czasy odczytów asynchronicznych i synchronizacyjnych.

Będzie to zależeć od wielu czynników. Czy są przechowywane na wirujących dyskach, dysku SSD lub dysku sieciowym? Jakiego procesora używasz? Ile gniazd / rdzeni? Czy pracujesz na maszynie wirtualnej czy na gołym metalu? Czy korzystasz ze starożytnego systemu operacyjnego, czy nowoczesnego?

Martin C. Martin
źródło
1
Tak, doszedłem do wniosku. Wydaje mi się, że miałem nadzieję, że istnieje jakieś badanie, które można wykorzystać jako wskazówkę lub praktyczną zasadę.
blesh
9

Async ma 3 główne zalety:

  1. Obniża wykorzystanie procesora. Może to być przydatne, jeśli wykonujesz również operacje obciążające procesor z właśnie odczytanymi danymi.
  2. Korzystanie z infrastruktury asynchronicznej sprawia, że ​​kod jest łatwy do sparaliżowania. Zwłaszcza jeśli czytasz dużo plików.
  3. Wysyłając wiele żądań odczytu i zapisu do systemu operacyjnego, OS i sprzęt mogą ponownie zamówić te operacje, aby były wykonywane szybciej. SATA2 ma taką funkcję.

Uważam, że główną zaletą odczytu asynchronicznego jest praca z dużą ilością plików lub potrzeba dużej mocy procesora.

Euforyk
źródło
Zwróć uwagę na punkt 2, że niczego nie zoptymalizuje, jeśli wąskim gardłem jest operacja We / Wy. Sprawy wyglądają inaczej, jeśli korzystasz z równoległego dostępu poprzez RAID lub sieć, pliki znajdujące się na różnych dyskach.
Arseni Mourzenko
5
Hmm, mam problem ze zrozumieniem, co masz na myśli z numerem 1. Powiedziałbym, że w praktyce jest odwrotnie. Ponieważ w przypadku asynchronicznym zmieniasz teraz swój wątek z blocked waiting for I/O(0% procesora) na continue normal processing(> 0% procesora).
Isak Savo,
3

To zależy

Należy pamiętać o tym, jak kosztowne jest przełączanie kontekstu między procesami. Node.JS został zaprojektowany tak, jak jest, ponieważ zakłada, że ​​wykonanie przełącznika kontekstu jest bardzo drogie i w przeciwnym razie będziesz mieć wiele procesów oczekujących na IE, które spowodują błąd komputera.

Z drugiej strony Erlang sprawia, że ​​przełącznik kontekstu procesu jest bardzo tani, więc wszystko może być synchroniczne, a czas działania Erlang może śledzić całość.

Czynniki do rozważenia:

  • Koszt operacji zmiany kontekstu
  • prędkość dysku dla operacji wyszukiwania
  • prędkość dysku dla operacji odczytu
  • są pliki w pamięci podręcznej

I jestem pewien, że pomijam pół tuzina czynników

Zachary K.
źródło
2

Nie jestem pewien, czy jest jakiś konkretny „punkt”, ale ma to sens, gdy masz wiele wątków, ponieważ pozwala na nakładanie I / O na inne prace. Jeśli masz zapasowe wątki bezczynne, czytanie asynchroniczne nie przyniesie ci żadnej korzyści. Tylko wtedy, gdy zapełniają się kolejki robocze i wątek może przydać się do wykonywania innych zadań zamiast czekać na operacje we / wy, dostęp do pliku asynchronicznego daje jakąkolwiek korzyść.

TMN
źródło
tak, to jest cały sens wielowątkowości!
Vlad
1

Myślę, że problemem nie są tak duże prędkości odczytu, ale opóźnienie.

Jeśli czytasz z dysku sieciowego lub z powolnego mechanicznego dysku twardego z długimi kolejkami, wydajność wymaga szybkiego odczytu. A jeśli twoja aplikacja również czyta w wątku GUI, w takim przypadku jest to bardzo zła aplikacja, to będzie okropne dla użytkownika.

Koder
źródło