2009-04-21 17 views
5

Obecnie pracuję nad aplikacją MFC, która odczytuje i zapisuje na dysku. Czasami ta aplikacja działa niesamowicie szybko i czasami jest cholernie wolno. Zgaduję, że dzieje się tak z powodu dostępu do dysku, dlatego chcę go profilować. Oto kilka pytań w tym zakresie:Profilowanie dostępu do dysku

(1). Aktualnie używam profilera AQTime do profilowania aplikacji. Czy ktoś próbował profilowania dostępu do dysku za pomocą tego? czy jest jakieś inne narzędzie, z którego mogę skorzystać?

(2). Jakie są najważniejsze parametry dysku, na które powinienem zwrócić uwagę?

(3). Czy jeśli mam wiele wątków próbujących odczytać i zapisać dane z dysku, czy ma to wpływ na wydajność? tj. czy lepiej mieć dostęp do dysku z jednym gwintem?

Odpowiedz

2

Możesz użyć do tego Windows Performance Toolkit. Można włączyć dostawców śledzenia zdarzeń dyskowych we/wy i sprawdzić czas operacji we/wy i czas dyskowy dla każdego z nich. Ma jednak trochę krzywej uczenia się. Pozwoli to również określić, które operacje wejścia/wyjścia pliku faktycznie uzyskują dostęp do dysku i nie są obsługiwane przez menedżera pamięci podręcznej.

Najważniejsze parametry to czas obsługi dysków i długość kolejki. Czas serwisowania dysku to czas, jaki zajęł dysk w celu obsługi żądania. Długość kolejki wskazuje, czy kopia zapasowa dysku jest tworzona za innymi żądaniami.

Dla wielu wątków w/czyta & pisze - Wiele dysków ma słabą wydajność w obliczu odczytów z zapisami w tle. Jeśli masz różne wątki wykonujące wiele operacji wejścia/wyjścia dysku na losowe lokalizacje na dysku, możesz skończyć z wygłodzeniem niektórych żądań.

1

Aby pomóc (2):

  1. Spróbuj partia swoje zapisy na dysku, aby uniknąć wielu małych połączeń pisać. Po zakończeniu płukania swojego bufora wywołaj commit. commit (aka fsync) jest kosztowną operacją, więc staje się jeszcze bardziej, gdy jest wiele małych zapisów.
  2. W przypadku uchwytów plików systemu Windows można eksperymentować z FILE FLAG WRITE THROUGH, aby zwiększyć szybkość zapisu. Podobno commit nie musi być wywoływany z uchwytami używającymi tej flagi.
  3. Jeśli dane, które zapisujesz na dysku, będą również dostępne poprzez odczyt, należy najpierw napisać do struktury pamięci, mając kolejny wątek odczytany ze struktury i zapisać go na dysk. Pomoże to uniknąć wywołań odczytu danych z dysku, który właśnie napisałeś.

Mam nadzieję, że to pomaga ....

0

Co chciałbym zrobić to, jeśli nie można wstrzymać wszystkie wątki w tym samym czasie i zbadać ich stan, koncentrują się na jednym z nich i wstrzymywać, że choć jest "cholernie wolno". This is a little known but effective technique.

Ponieważ jest bardzo powolny w porównaniu do tego, co może być, cokolwiek na to czeka, czeka prawdopodobnie 99% czasu, więc gdy go zatrzymasz, zobaczysz to. To prawda, czy to jedno wielkie oczekiwanie, czy miliardy maleństw. Spójrz na cały stos wywołań. Winowajca może znajdować się gdzieś pośrodku stosu.

Jeśli nie jesteś pewien, zatrzymaj go dwa lub trzy razy. Winowajca będzie na wszystkich próbkach stosu.