Jak pamięć podręczna zapisu działa z systemem plików obejmującym dyski o różnych prędkościach?


9

W nowoczesnym systemie Linux z wieloma dyskami i programową macierzą RAID obejmującą zarówno dyski wolne (HDD), jak i szybkie (SSD), w jaki sposób zapisy do systemu plików są buforowane?

Dla MD-raid RAID1 tablica może być skonfigurowany z dyskami jak --write-mostlyi --write-behindco sugeruje, że czyta wykonywane są z szybszym dysku, a który zapisuje do wolniejszego dysku może tyle. Ale jak to jest buforowane na poziomie jądra? Czy jądro cache zapisuje dysk przed lub po warstwie RAID? Czy na końcu wywołania write () dane są gwarantowane, że zostaną zapisane na jednym z non- --write-behinddysków?

W przypadku btrfsRAID1, jak wyglądałaby ta sama sytuacja? Brak --write-behindfunkcji, więc czy brudne strony są liczone na poziomie urządzenia lub systemu plików? W którym momencie zwracałaby się funkcja write ()?

Jak vm.dirty_*ratioprzestrajanie wpływają na te ustawienia?

Odpowiedzi:


7

--write-mostly, --write-behindJest obsługiwany przez mdkierowcę wewnętrznie. mdprzechowuje metadane, takie jak bitmapa z zamiarem zapisu (która jest obowiązkowa dla funkcji zapisu z tyłu), która zasadniczo rejestruje, które dane zostały już zapisane, a które jeszcze brakuje. Jest to konieczne w przypadku utraty zasilania, gdy dane nie dotarły jeszcze do urządzeń głównie zapisujących. W takim przypadku obszar danych, którego dotyczy problem, zostanie ponownie zsynchronizowany (w Twoim przypadku odczytany z dysku SSD, zapisz na dysku twardym).

Ale jak to jest buforowane na poziomie jądra?

W przypadku zapisu do tyłu sterownik md zasadniczo powiela żądanie zapisu wewnętrznie. Główne żądanie zapisu trafia na dyski podstawowe i mówi górnym warstwom „OK, już to zrobiłem”; skopiowane żądanie zapisu pozostaje wtedy po stronie macierzy RAID, która zajmuje najwięcej miejsca w zapisie, i może potrwać dłużej, miejmy nadzieję, że nikt tego nie zauważy.

Następnie warstwa rajdowa wykonuje wiele kroków, aby upewnić się, że żadne dane nie zostaną odczytane z urządzenia głównie do zapisu, podczas gdy w kolejce nadal oczekują żądania zapisu. Dlaczego dane byłyby odczytywane z urządzenia głównie zapisującego? Cóż, dysk SSD mógł się nie powieść, więc to wszystko, co zostało. Jest to skomplikowane, a zapisywanie wprowadza niektóre narożne przypadki.

Prawdopodobnie dlatego jest obsługiwany tylko na poziomie RAID-1, a nie na żadnym innym. Chociaż teoretycznie sensowne może być posiadanie dysków SSD zasadniczo jako RAID-0 i dwóch parzystych dysków HDD w trybie zapisu z opóźnieniem, nie ma wsparcia dla takiego zapisu RAID-6. Jest tylko RAID-1 i rzadko używany nawet tam.

Nie ma to wpływu na inne ustawienia pamięci podręcznej, w zasadzie ogólny mechanizm buforowania nie dba o to, jak mdsterownik zaimplementował rzeczy wewnętrznie. Pamięć podręczna robi swoje, a MD robi swoje. Pamięć podręczna systemu plików działa tak samo dla systemu plików na szczycie MD i systemu plików na gołym dysku. (Rzeczywistość jest odrobinę bardziej skomplikowana, ale możesz o tym myśleć w ten sposób.)


3

Dla MD-raid RAID1 tablica może być skonfigurowany z dyskami jak --write-mostlyi --write-behindco sugeruje, że czyta wykonywane są z szybszym dysku, a który zapisuje do wolniejszego dysku może tyle. Ale jak to jest buforowane na poziomie jądra? Czy jądro cache zapisuje dysk przed lub po warstwie RAID?

Po, ponieważ ta funkcja jest specyficzna dla md-raid.

Powinieneś pomyśleć o tej funkcji md-raid jako buforowaniu, a nie buforowaniu. Jest ograniczony przez następującą mdadmopcję:

--write-behind =

Określ, że tryb zapisu za powinien być włączony (dotyczy tylko RAID1). Jeśli zostanie podany argument, ustawi maksymalną dozwoloną liczbę zaległych zapisów. Wartość domyślna to 256.

Mogę tylko myśleć, że jest on również ograniczony przez normalne buforowanie jądra i sprzętu (tj. Jeśli jest mniejsze). Normalne buforowanie jądra jest ograniczone przez nr_requestsi max_hw_sectors_kb. Zobaczyć /sys/class/block/$write_behind_device/queue/. Przez buforowanie sprzętowe mam na myśli pamięć podręczną zapisu na dysku.

Czy na końcu wywołania write () dane są gwarantowane, że zostaną zapisane na jednym z non- --write-behinddysków?

Oczywiście, zakładając, że masz na myśli, że write () był na pliku otwartym za pomocą O_SYNC / O_DSYNC, lub faktycznie miałeś na myśli write () + fsync (). Jeśli nie, nie obowiązują żadne gwarancje.


Dzięki, ale to stwarza kolejne pytanie: jeśli plik został otwarty za pomocą O_SYNC, czy funkcja write () powraca po zapisaniu pierwszego dysku lub zapisaniu wszystkich dysków w tym przypadku?
Steve

3
zapisy podrzędne na dyskach bez zapisu muszą zostać zakończone jako pierwsze
sourcejedi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.