Patrzę na tę konfigurację:
- Windows Server 2012
- Dysk NTFS 1 TB, klastry 4 KB, pełne ~ 90%
- ~ 10 mln plików przechowywanych w 10 000 folderów = ~ 1000 plików / folder
- Pliki w większości dość małe <50 KB
- Dysk wirtualny hostowany na macierzy dyskowej
Gdy aplikacja uzyskuje dostęp do plików przechowywanych w losowych folderach, odczytanie każdego pliku zajmuje 60–100 ms. Za pomocą narzędzia testowego wydaje się, że opóźnienie występuje podczas otwierania pliku. Odczyt danych zajmuje wtedy ułamek czasu.
Podsumowując, oznacza to, że odczyt 50 plików może z łatwością zająć 3-4 sekundy, czyli znacznie więcej niż oczekiwano. Pisanie odbywa się wsadowo, więc wydajność nie jest tutaj problemem.
Postępowałem już zgodnie z zaleceniami dotyczącymi SO i SF, aby dojść do tych liczb.
- Korzystanie z folderów w celu zmniejszenia liczby plików w folderze ( Przechowywanie miliona obrazów w systemie plików )
- Uruchom,
contig
aby defragmentować foldery i pliki ( https://stackoverflow.com/a/291292/1059776 ) - 8.3 nazw i czasu ostatniego dostępu wyłączone ( Konfigurowanie systemu plików NTFS pod kątem wydajności )
Co zrobić z czasami czytania?
- Uważaj, że 60-100 ms na plik jest w porządku (tak nie jest, prawda?)
- Wszelkie pomysły, w jaki sposób można ulepszyć konfigurację?
- Czy istnieją narzędzia monitorowania niskiego poziomu, które mogą powiedzieć, na co dokładnie spędza czas?
AKTUALIZACJA
Jak wspomniano w komentarzach, system uruchamia Symantec Endpoint Protection. Jednak wyłączenie go nie zmienia czasów odczytu.
PerfMon mierzy 10-20 ms na odczyt. Oznaczałoby to, że każdy odczyt pliku wymaga ~ 6 operacji odczytu I / O, prawda? Czy byłoby to wyszukiwanie MFT i kontrole ACL?
Rozmiar MFT wynosi ~ 8,5 GB, czyli więcej niż pamięć główna.