Pracuję nad natywną aplikacją C++/Win32/MFC w systemie Windows 7. Używam oprogramowania Cile do otwierania pliku przechowywanego na serwerze zdalnym (z flagami, CFile :: modeRead | CFile :: shareDenyWrite). Na serwerze działa system Windows Server 2008, a ja uzyskuję dostęp do pliku na udostępnionym dysku za pomocą zwykłego udostępniania plików systemu Windows. Kiedy otworzę plik, czytam go w sposób opisany poniżej.wydajność przy uzyskiwaniu dostępu do pliku na serwerze sieciowym sekwencyjnie po uzyskaniu dostępu do niego losowo
Po pierwsze, szukam wielu lokalizacji w pliku (10 lokalizacji) i czytania małych (128 bajtowych) sekcji. Następnie szukam początku i czytam sekwencyjnie cały plik.
Zauważyłem, że wykonanie powyższego było DUŻE wolniejsze niż samo otwarcie pliku i przeczytanie go. Początkowe losowe poszukiwania i pobieranie próbek jest bardzo szybkie, niemal natychmiastowe nawet przy dużym pliku. Co ciekawe, pomimo tego, że jest to szybkie, następna część, skanowanie pliku jest bardzo powolne w porównaniu z zwykłym skanowaniem bez początkowego losowego dostępu.
Próbując dowiedzieć się, co się dzieje, podniosłem monitor wydajności i obserwowałem ruch sieciowy. Jeśli po prostu wykonuję sekwencyjny odczyt pliku, otrzymuję pobieranie 3.5MB/s przez adapter sieci bezprzewodowej. Jeśli najpierw losowo szukam, a potem czytam sekwencyjnie, otrzymuję 300kB/s podczas czytania sekwencyjnego.
Rozwiązaniem było zamknięcie i ponowne otwarcie pliku po wykonaniu części dostępu losowego. Kiedy to zrobiłem, sekwencyjny odczyt przyspieszył.
Wygląda więc na to, że wykonywanie odczytów dostępu losowego (szukanie i odczytywanie) powodowało, że coś na serwerze powodowało, że sekwencyjny odczyt był powolny. Zastanawiam się, czy ktoś wie na pewno, co się tu dzieje i jaka jest prawdziwa przyczyna zachowania, które widzę? Chociaż mam na to poprawkę, chciałbym lepiej zrozumieć, co się dzieje pod maską, aby to spowodować.
Czy możliwe jest spekulacje, że system Windows może być używany do uzyskiwania dostępu losowego, a więc uniemożliwić wstępne ładowanie kolejnych stron pliku? Wątpię w to. –