Next: Porównanie mojego rozwiązania z
Up: Poprawa wydajności systemu NFS
Previous: Implementacja obsługi schowka w
W przestrzeniu użytkownika działa proces cacheCleaner, który zarządza
danymi w schowku. Jest on celowo oddzielony od jądra. Dzięki temu:
- jądro nie jest obciążone potencjalnie kosztowną operacją jaką jest wyszukanie
najmniej potrzebnych danych;
- jądro ma mniejszy rozmiar;
- wykorzysuje się mniej pamięci jądra, ewentualnie jego struktur;
- w łatwy sposób można tworzyć różne algorytmy zarządzające schowkiem;
- możliwie duża część zadań jądra jest wykonana w trybie użytkownika. Inne zadania
jądra też są wspomagane programami działającymi w tym trybie ( bdflush, mountd).
Są one uruchamiane przy starcie systemu.
Do usuwania danych ze schowka niezbędny jest oddzielny proces. Gdyby takiego
procesu nie było, to funkcja read, po sprawdzeniu, że nie ma wolnego miejsca
w schowku (przekroczony twardy limit), musiałaby usunąć z niego część starych
danych. Opóźniałoby to powrót z tej funkcji do procesu, który ją wywołał, a
tym samym zwiększyłoby czas oczekiwania na dane. W przypadku zastosowania oddzielnego
procesu, po przekroczeniu twardego lub miękkiego limitu, funkcja budzi proces
cacheCleaner i jeżeli nie jest przekroczony twardy limit, to umieszcza
dane w schowku i powraca do wywołującego ją procesu. Nie powoduje to znacznego13 zwiększenia czasu oczekiwania na dane. Co najwyżej, może to spowodować, że
część bloków pliku nie zostanie umieszczona w schowku. Alternatywnym rozwiązaniem
byłoby zaimplementowanie procesu cacheCleaner w przestrzeni jądra. Prawdopodobnie
zwiększyłoby to jego wydajność. Mogłoby się to jednak odbyć kosztem innych procesów,
gdyż trudno jest wywłaszyczć proces działający w przestrzeni jądra. Jednym z
moich założeń było jednak utworzenie schowka, który w możliwie najmniejszym
stopniu wpływa na wydajność reszty systemu.
Proces cacheCleaner nasłuchuje łącza nfsCacheFull. W chwili, gdy
jądro wyśle procesowi nazwę katalogu przechowującego dane schowka, proces budzi
się i sprawdza, ile jest danych w schowku i jaki jest miękki limit. Dane te
odczytuje z pliku cacheInfo. Następnie przegląda wszystkie pliki schowka
i usuwa te najmniej ważne. W obecnej implementacji oznacza to usunięcie plików
najdłużej nie używanych. CacheCleaner może realizować mniej trywialną
politykę zarządzania schowkiem wykorzystując metadane jakie przechowuje każdy
plik znajdujący sie w schowku.
Dostęp do sekcji krytycznej, jaką jest plik cacheInfo jest ograniczony
przez stosowanie blokad pliku zakładanych funkcją flock.
Komunikacja między jądrem a procesem cacheCleaner jest jednostronna --
od jądra do procesu.
Next: Porównanie mojego rozwiązania z
Up: Poprawa wydajności systemu NFS
Previous: Implementacja obsługi schowka w
root
2000-08-18