
Ich erstelle eine Shim-Schicht über einem In-Memory-Dateisystem (tmpfs), damit ich die Dateisystembefehle abfangen und zusätzliche Verarbeitungsvorgänge durchführen kann (das Endziel besteht darin, die Schreibvorgänge über das Netzwerk zu replizieren, um Fehlertoleranz zu gewährleisten). Zum Abfangen der Dateisystembefehle verwende ich FUSE. Für das In-Memory-Dateisystem verwende ich tmpfs. Um die geringe Speichergröße auszugleichen, habe ich über SSD genügend Swap-Speicherplatz für tmpfs erstellt.
Zusammenfassend habe ich ein Verzeichnis dir
, das mit tmpfs gemountet ist. Ich habe ein weiteres Verzeichnis erstellt shim
, in das alle Anwendungen schreiben. FUSE ist gemountet shim
und leitet alle Vorgänge dorthin um dir
.
Bei einigen Mikrobenchmarks mit Filebench, die direkt in schreiben dir
, habe ich festgestellt, dass tmpfs + Swap eine extrem niedrige Latenz hat, insbesondere im Vergleich zu ext4 auf der Festplatte. Es gibt keine wahrnehmbare Verlangsamung, wenn tmpfs vom Schreiben in den RAM zum Schreiben in den Swap-Speicher wechselt, was vermutlich auf einige clevere Readaheads zurückzuführen ist.
Wenn ich es mit FUSE überlagere mitpassthrough_hp.c, allerdings wird die Dateierstellung selbst bei aktiviertem Multithreading super langsam, etwa 60-mal höhere Latenz als bei tmpfs + Swap. Bei der Verwendung von htop
ist mir aufgefallen, dass es nur langsamer wird, wenn es in den Swap statt in den Speicher schreibt (der Speicher füllt sich sehr schnell, dann steigt der Swap langsam an). Ansonsten hat FUSE selbst recht wenig Overhead.
Weiß jemand, warum es bei FUSE zu Latenzeinbußen kommt, wenn Swap verwendet wird, was bei alleiniger Verwendung von tmpfs jedoch nicht der Fall ist, und wie ich diesen zusätzlichen Overhead eliminieren kann?