Różnica wydajności między ramfs i tmpfs

23

Muszę skonfigurować system przechowywania w pamięci dla około 10 GB danych, składający się z wielu pojedynczych plików (obrazów) o wielkości 100 kb. Będzie wiele odczytów i dość okresowych zapisów (dodawanie nowych plików, usuwanie niektórych starych).
Teraz wiem, że tmpfs zachowuje się jak zwykły system plików, dla którego możesz na przykład sprawdzić wolne / zajęte miejsce za pomocą df , co jest przyjemną funkcją. Jestem jednak zainteresowany, czy ramfs oferowałby pewne korzyści w odniesieniu do szybkości operacji IO. Wiem, że nie mogę kontrolować rozmiaru zajętej pamięci podczas korzystania z ramfs i że mój system może zawiesić się, jeśli całkowicie zużyje wolną pamięć RAM, ale nie będzie to problemem w tym scenariuszu.

Podsumowując, jestem zainteresowany:
- Pod względem wydajności, który jest szybszy: ramfs lub tmpfs (i ewentualnie dlaczego)?
- Kiedy tmpfs używa przestrzeni wymiany? Czy przenosi już zapisane dane do zamiany (w celu zwolnienia pamięci RAM dla innych aktualnie uruchomionych programów) czy tylko nowe dane, jeśli w tym momencie nie ma już wolnej pamięci RAM?

Ivan Kovacevic
źródło
Um, ile pamięci RAM jest na serwerze?
ewwhite
1
Serwer ma łącznie 16 GB pamięci RAM. Warto również zauważyć, że nie mam pamięci SSD, ale pojedynczy dysk twardy o prędkości 7200 obr./min. Właśnie dlatego rozważam użycie jakiegoś rodzaju pamięci RAM.
Ivan Kovacevic

Odpowiedzi:

21

Moja rekomendacja:

Zmierz i obserwuj rzeczywistą aktywność w normalnych warunkach.

Te pliki prawdopodobnie nie będą WSZYSTKIE potrzebne i będą zawsze podawane z pamięci podręcznej. Ale istnieje ładne narzędzie o nazwie vmtouch, które może powiedzieć ci, co jest w pamięci podręcznej w danym momencie. Możesz go również użyć do zablokowania niektórych katalogów lub plików w pamięci podręcznej. Zobacz, jak wyglądają rzeczy po regularnym użyciu. Korzystanie z tmpfs i ramfs nie jest konieczne w tej sytuacji.

Zobacz: http://hoytech.com/vmtouch/

Myślę, że będziesz zaskoczony, widząc, że najbardziej aktywne pliki prawdopodobnie będą już rezydować w pamięci podręcznej.


Jeśli chodzi o tmpfs kontra ramfs, nie ma znaczącej różnicy wydajności. Istnieją różnice operacyjne. Prawdziwym przypadkiem użycia jest Oracle, w którym użyto ramfs, aby umożliwić Oracle zarządzanie danymi w pamięci RAM bez ryzyka zamiany. Dane tmpfs można wymieniać pod presją pamięci. Istnieją również różnice w zmianie rozmiaru i modyfikacji ustawień w locie.

ewwhite
źródło
1
Niesamowite małe narzędzie! +1
Janne Pikkarainen
1
@ewwhite Doskonała odpowiedź. W jednym z naszych przypadków kilka lat temu rzeczywiście odkryliśmy, że najczęściej używane pliki są już przechowywane w pamięci podręcznej. Wskazówka: dzisiejsze systemy plików są o wiele bardziej inteligentne niż mój, moim zdaniem.
giannisapi
13

Nie przesadzaj z tym. Umieść wystarczającą ilość pamięci RAM w systemie i pozwól, aby pamięć podręczna dysku jądra zajęła się Twoimi sprawami. W ten sposób możesz czerpać korzyści z odczytów pochodzących bezpośrednio z pamięci, zachowując jednocześnie możliwość przechowywania danych na dysku.

EEAA
źródło
1
Mój system ma obecnie 16 GB pamięci RAM. Jest to zwykła instalacja Debiana z uruchomionym Nginx do obsługi tych obrazów. Mam połączenie sieciowe 1 Gbit, które będzie stale obciążone w 100%, obsługując te obrazy bez określonej kolejności. Czy uważasz, że w tym scenariuszu jądro załaduje wszystkie te 10 koncertów obrazów do pamięci podręcznej?
Ivan Kovacevic
3
Tak, jeśli w systemie jest wystarczająca ilość pamięci RAM, a inne aplikacje na serwerze nie konkurują o zasoby pamięci RAM, pliki te pozostaną w pamięci podręcznej.
EEAA
2
Jestem w administracji Unixa przez ~ 15 lat i nigdy nie spotkałem się z sytuacją, w której tmpfs / ramfs zapewniłby jakąkolwiek korzyść w porównaniu z natywną pamięcią podręczną jądra. Nie oznacza to, że nie istnieją sytuacje, w których byłyby uzasadnione, ale są one dość rzadkie. Zazwyczaj, jeśli potrzebujesz pamięci podręcznej RAM na rzeczy, używa się specjalnie utworzonej warstwy pamięci podręcznej (Redis / Memcache / itp.).
EEAA
4
Buforowanie dysku z pewnością będzie działać w przypadku, gdy obrazy muszą zostać odczytane, ale tmpfs lub ramfs mogą być nadal przydatne, jeśli chcesz przyspieszyć wiele losowych / małych zapisów, ale są powiązane z dyskiem, który jest wolny z losowym I / O. Należy pamiętać, że jeśli maszyna ulegnie awarii lub ulegnie awarii zasilania, zawartość tmpfs zniknie, ponieważ są one (tylko) w pamięci.
Martijn
1
@Martijn ma rację. tmpfs i ramfs są rzeczywiście przydatne. Na przykład robię intensywne przepisywanie (gałąź filtra) repozytorium git. Robienie tego w pamięci jest o wiele szybsze niż na moim dysku SSD. Buforowanie pomaga w odczytach, a nie w zapisach, ponieważ (zwykle) Linux musi spełniać pewne gwarancje dotyczące trwałości operacji dyskowych.
Paul Draper,
7

1) Wskaźnik wydajności.

Wykorzystując tę stronę jako odniesienie, zrobiłem porównanie I / O między tmpfs i ramfs, a wyniki są takie, że są prawie identyczne pod względem wydajności:

# !mount
mount | grep -E "tmp|ram"
tmpfs on /dev/shm type tmpfs (rw)
ramfs on /mnt/ram type ramfs (rw,size=1G)

# dd bs=1M count=1024 if=/dev/zero of=/dev/shm/test conv=fdatasync
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.634054 s, 1.7 GB/s

# dd bs=1M count=1024 if=/dev/zero of=/mnt/ram/test conv=fdatasync
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.559557 s, 1.9 GB/s

# dd bs=1M count=4096 if=/dev/zero of=/dev/shm/test conv=fdatasync
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 2.5104 s, 1.7 GB/s

# dd bs=1M count=4096 if=/dev/zero of=/mnt/ram/test conv=fdatasync
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 2.36923 s, 1.8 GB/s

2) Zgodnie z tą stroną tmpfs używa swap, a ramfs nie używa swap.

Michael Martinez
źródło
2
Twoja odpowiedź jest na dobrej drodze. Jednak nie zgodziłbym się z twoją konkluzją dotyczącą wydajności, twoje testy pokazują, że istnieją różnice 0,2 GB / s i 0,1 GB / s na korzyść ramfs. Uważam, że należy to jeszcze bardziej przetestować, aby zapewnić prawidłową próbę statystyczną. Odnośnie 2) Tak, to jest znane, jednak żałuję, że nie mogę uzyskać lepszego wglądu w to, kiedy jest używany swap.
Ivan Kovacevic
jeśli przeprowadzilibyśmy ten test wiele razy z plikami o różnych rozmiarach, nie sądzę, żebyśmy zobaczyli różnicę. zauważysz, że kiedy czterokrotnie podniosłem rozmiar, różnica faktycznie się zmniejszyła, a nie powiększyła.
Michael Martinez
1
Co z przypadkiem, w którym masz kilka małych plików. Na przykład zapisywanie milionów plików 100-200 kb. Czy otrzymujesz również różnicę 0,2 GB / s wielokrotnie dla tego samego rozmiaru pliku? Co zdecydowanie wskazywałoby na różnicę wydajności. Prawdopodobnie sam to przetestuję, kiedy będzie to w moim harmonogramie. Ale dlatego zapytałem tutaj, więc może mógłbym przekreślić go z listy rzeczy do zrobienia, jeśli ktokolwiek już to zrobił.
Ivan Kovacevic
tak, jedynym sposobem, aby się upewnić, jest wykonanie testów.
Michael Martinez
1

Jeśli masz zainstalowaną wystarczającą ilość pamięci RAM do obsługi różnych buforów jądra, stosu aplikacji i stosów, zwykłej pamięci podręcznej systemu plików i wszystkich plików, które zamierzasz w niej umieścić, ramfsnigdy nie powinno być wolniejsze niż, tmpfsponieważ nie będzie ryzyka fizyczne we / wy według projektu. Fizyczne wejścia / wyjścia są niewątpliwie główną przyczyną obniżenia wydajności w tym obszarze.

Jeśli jednak nie masz zainstalowanej takiej ilości pamięci RAM, użycie ramfsmoże i prawdopodobnie będzie wolniejsze niż tmpfsw przypadku, gdy ten drugi korzysta z heurystyki pamięci wirtualnej, aby zdecydować, co powinno być lepiej na dysku (tj. W obszarze wymiany) w porównaniu do tego, co powinno być na pamięci RAM podczas gdy tmpfsdane systemu plików utknęły w pamięci RAM, co może być marnotrawstwem zasobów.

Aby odpowiedzieć na drugie pytanie, tak, tmpfsnajpierw przenieś stare dane do obszaru wymiany, a nie do ostatniego „gorącego”.

jlliagre
źródło