2012-01-09 11 views
5

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ć.

+2

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. –

Odpowiedz

6

Mooing Duck - komentarz jest tuż. System operacyjny rozpoczyna od założenia sekwencyjnego dostępu jako opcja "miękka" - dopóki nie zostanie udowodniony szkodliwy. Jednak losowe dostępy powodują, że odczyt z wyprzedzeniem może pogorszyć wydajność, a "inteligentne" zachowanie w pamięci podręcznej zmienia odczyt z wyprzedzeniem.

Można by pomyśleć, że kilka dostępów sekwencyjnych spowoduje, że system Windows ponownie go włączy. Ale niestety flaga nie jest już "miękka" w tym momencie. Od tego momentu system Windows uważa dostęp losowy za udowodniony, tak jak gdybyś zmusił go do tego trybu.

Możesz podać CreateFile opcję FILE_FLAG_SEQUENTIAL_SCAN, aby zmusić ją do dalszego czytania bez względu na wszystko. Ale twoje ponowne otwarte rozwiązanie jest prawdopodobnie tak dobre, jak wszystko. I to jest jedyny sposób, jeśli nie zadzwonisz bezpośrednio pod numer CreateFile.

+0

niesamowite! Dzięki! Cieszę się, że rozumiem teraz, co się teraz dzieje. – Nerdtron

+0

+1, dobrze wiedzieć. – lapk

+1

Zastanawiam się, czy użycie flagi "skanowanie sekwencyjne" może spowolnić część o dostępie swobodnym. – Nerdtron