Witam serdecznie
Dzięki za zainteresowanie tematem. Postaram się jeszcze rozszerzyć opis działania systemu by łatwiej było złapać w czym problem.
System jak wspominałem składa się z kilku (6-11) aplikacji , które to aplikacje mogą uruchomić w sobie dodatkowe wątki pracujące z dyskiem.
Każda aplikacja w ciągu jednej sekundy odczytuje/zapisuje z około 60 plików danych. Dane są dopisywane do plików na ich końcu , wszystkich plików jest około 2400 i z zawsze o północy jest tworzony nowy komplet ok 1200 plików. Dodatkowo zapisuje i odczytuje dane z 20 plików status mających stałą długość (struktura podobna do plików INI) jest ich razem około 3600 i jest to ilość w miarę stała. Oprócz tego w odpowiedzi na określone zdarzenia (żądania SQL , aktywność użytkowników końcowych , awarie sprzętowe monitorowanych systemów) program uruchamia wątki dodatkowe, które tworzą serie kilku plików tymczasowych (5-6 plików na jedno zdarzenie) , a na zakończenie swojej pracy wątki usuwają te pliki. Przykładowo jeśli na maszynie takich aplikacji pracuje np 6 to tylko jedna ma takie duże obciążenie (apka zbiorcza) pozostałe pracują w przybliżeniu z 30% podanych wcześniej wartości.
Pomysł ze strumieniem postaram się sprawdzić - myślę że przy nowym pustym dysku się sprawdzi i spowoduje dużo wolniejsze "unieruchamianie" systemu - dzięki.
Pomysł z defragmentatorami też przyszedł mi do głowy i wcześniej go spróbowałem ale w praniu okazało się, że:
Na 6 sprawdzonych programów tylko dwa dały radę przedrzeć się przez etap Analizy dysku (pozostał wykładały się z komunikatami typu , out of memory - 16GB RAM-u to dla nich za mało ?). Dwa, które dały radę w następnym etapie pracy poinformowały że spodziewany czas defragmentacji dysku to ~37.400 dni ( ! 102 lata ! ) w jednym i ~114.000 dni ( ! 312 lat ! )w przypadku drugiego programu. Zatrzymałem pracę tego kompa i przeniosłem prawie połowę danych z dysku na dysk zapasowy (external) - trwało to 7 dni ( to było coś koło 260 GB i 2.750.000 plików - zarejestrowane transfery na poziomie od 60 do 400 kb/s). Ponownie zapuściłem defragmentatory (tylko te dwa ca dały radę wcześniej - oczywiście nie razem) i efekt był taki: spodziewany czas ~13400 dni i ~43000 dni , ale tu ciekawostka jeden z programów podał tez informację, że największy dostępny ciągły blok pusty ma wielkość 786432b , wielkość średnia pliku to 260 kb, średnia ilość fragmentów na plik to ~6300, całkowita ilość plików ~846.000 sztuk.
Wiem dlaczego całość tak spowalnia i jest nadal wolna mimo dużej ilości "wolnego" par excellence ( uwielbiam ten zwrot) miejsca na dysku. To kwestia fragmentacji plików. Fragmentacja ta trochę paradoksalnie zwiększa się wraz z usuwaniem starych danych z dysku.
Pytanie jak temu zapobiec ?
- cały czas mieć uruchomiony defragmentator ? (są takie co mają taką opcję ale tam ustawia się , że mają pracować gdy wykryją Idle time, a u mnie system spowalnia tylko w godzinach 22:00- 02:00 i obciążenie spada do 30% podstawowego),
- dodać defragmentację do harmonogramu systemu ? ( programy żądają za pierwszym razem pełnej defragmentacji - nie do przyjęcia ze względu na czas trwania , lub nie żądają ale wtedy analiza trwa 7h - co nie jest dopuszczalne bo mam tylko 4h okienka o obniżonym obciążeniu)
- program powinien sam pilnować by pliki były tworzone od razu z maksymalną wielkością - to jest do wykonania
ale powinien też na koniec dnia potrafić przenieść przesunąć plik na dysku by był w jednym kawałku - tu nie znam sposobu jak to wykonać.
- pliki tymczasowe dla wątków dodatkowych ( oceniłem że co dzień powstaje ich ok 360 i tyle jest kasowanych a wielkości tych plików są pomiędzy 12.8Kb a 330Mb) należało by tworzyć na jakimś wirtualnym dysku (może RAM-dysk) albo jakiś plik wymiany o stałe wielkości
Może jakieś inne lepsze propozycje ?
Ps.
Ciekawe w jaki sposób załatwiają to producenci defragmentatorów - bo chyba nie odwołują się do dysków nisko poziomowo na poziomie sprzętu (bo by musieli znać wszystkie typy dysków) , a z drugiej strony Microsoft chyba nie pozwala na taki dostęp na poziomie sprzętu ? To musi jakoś przechodzić przez sterownik dysku (kontroler IDE ,ATA, SATA, SAS) czyli powinno być chyba jakieś Win API do tego służące ? Może ktoś coś takiego robił albo chociaż widział to i wie jak to może się nazywać po "hamerykańsku" ?
Dodam tylko , że pojedyncza aplikacja systemu była projektowana na obsługę max 256 źródeł danych (optymalnie =<128) a aktualnie każda z nich obsługuje ponad 400 , a ta zbiorcza nawet i 1200 źródeł danych.