Chciałbym zadać pytanie, a następnie podążać za jego własną odpowiedzią, ale zobacz także, jakie odpowiedzi mają inni ludzie.Jak uzyskać dobrą równoczesną wydajność odczytu z dysku
Mamy dwa duże pliki, które chcielibyśmy czytać jednocześnie z dwóch oddzielnych wątków. Jeden wątek będzie kolejno czytał plik A, podczas gdy drugi wątek będzie kolejno czytał plik B. Nie ma blokowania ani komunikacji między wątkami, obie sekwencyjnie czytają tak szybko, jak tylko mogą, a obie natychmiast odrzucają dane, które odczytali.
Nasze doświadczenia z tą konfiguracją w systemie Windows są bardzo słabe. Łączna przepustowość tych dwóch wątków jest rzędu 2-3 MiB/s. Wydaje się, że większość czasu spędzają na wyszukiwaniu w tył i w przód między dwoma plikami, prawdopodobnie po bardzo trudnym czytaniu.
Jeśli wyłączymy jeden z wątków i tymczasowo spojrzymy na wydajność pojedynczego wątku, otrzymamy znacznie lepszą przepustowość (~ 45 MiB/s dla tego komputera). Tak więc zła wydajność dwubajtowa jest artefaktem programu planującego dyski OS.
Czy jest coś, co możemy zrobić, aby poprawić wydajność jednoczesnego odczytu wątku? Być może za pomocą różnych interfejsów API lub w inny sposób modyfikując parametry programu planującego dysku OS.
Niektóre szczegóły:
Pliki są w kolejności 2 GiB każdym na maszynie z 2GiB RAM. Na potrzeby tego pytania uważamy, że nie są one buforowane i doskonale defragmentowane. Wykorzystaliśmy narzędzia do defragmentacji i zrestartowaliśmy system, aby to zagwarantować.
Nie używamy specjalnych API do odczytu tych plików. Zachowanie jest powtarzalne dla różnych standardowych interfejsów API, takich jak CreateFile, C's fopen Win32, C++ std :: ifstream, Java FileInputStream, itp.
Każdy wątek obraca się w pętli, wykonując połączenia z funkcją odczytu. Zmieniliśmy liczbę bajtów żądanych z API w każdej iteracji z wartości od 1KB do 128 MB. Zmiana tego nie przyniosła żadnego efektu, tak wyraźnie, ile system operacyjny odczytywał fizycznie po tym, jak każde szukanie dysku nie jest podyktowane tym numerem. Dokładnie tego należy się spodziewać.
Drastyczna różnica między wydajnością jednego i dwóch wątków jest powtarzalna w systemach Windows 2000, Windows XP (32-bit i 64-bit), Windows Server 2003, a także z macierzą RAID5 i bez niej.
Witamy w firmie Microsoft. –