next up previous
Next: Porównanie mojego rozwiązania z Up: Poprawa wydajności systemu NFS Previous: Implementacja obsługi schowka w

Proces czyszczący schowek

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:

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 up previous
Next: Porównanie mojego rozwiązania z Up: Poprawa wydajności systemu NFS Previous: Implementacja obsługi schowka w
root
2000-08-18