Warum ist ein dateisystemintensives Skript auf einer RAM-Disk nicht schneller?

Warum ist ein dateisystemintensives Skript auf einer RAM-Disk nicht schneller?

Ich habe ein Skript, das viele Dateien und Verzeichnisse erstellt. Das Skript führt Blackbox-Tests für ein Programm durch, das mit vielen Dateien und Verzeichnissen arbeitet. Die Anzahl der Tests stieg und die Tests dauerten zu lange (über 2 Sekunden). Ich dachte, ich führe die Tests auf einer RAM-Disk aus.

Ich habe den Test in ausgeführt /dev/shm. Seltsamerweise lief er nicht schneller. Die durchschnittliche Laufzeit war ungefähr die gleiche wie auf einer normalen Festplatte. Ich habe es auch in einem versuchtFuse-basierte RAM-Disk, geschrieben in Perl. Die Website ist weg, aber ich habe sie imInternetarchiv. Die durchschnittliche Laufzeit auf der Fuse-Ram-Disk ist sogar noch langsamer. Vielleicht liegt es an der suboptimalen Implementierung des Perl-Codes.

Hier ist eine vereinfachte Version meines Skripts:

#! /bin/sh

preparedir() {
  mkdir foo
  mkdir bar
  touch bar/file
  mkdir bar/baz
  echo qux > bar/baz/file
}

systemundertest() {
  # here is the black box program that i am testing
  # i do not know what it does exactly
  # but it must be reading the files
  # since it behaves differently based on them
  find $1 -type f -execdir cat '{}' \; > /dev/null

singletest() {
  mkdir actual
  (cd actual; preparedir)
  systemundertest actual
  mkdir expected
  (cd expected; preparedir)
  diff -qr actual expected
}

manytests() {
  while read dirname; do
    rm -rf $dirname
    mkdir $dirname
    (cd $dirname; singletest)
  done
}

seq 100 | manytests

Das eigentliche Skript führt etwas mehr Fehlerprüfungen durch, sammelt Ergebnisse und erstellt eine Zusammenfassung. Dies findist ein Dummy für das eigentliche Programm, das ich teste.

Ich frage mich, warum mein dateisystemintensives Skript auf einem speichergestützten Dateisystem nicht schneller ausgeführt wird. Liegt es daran, dass der Linux-Kernel den Dateisystem-Cache so effizient handhabt, dass es sich praktisch um ein speichergestütztes Dateisystem handelt?

Antwort1

Ganz allgemein gesagt werden alle Vorgänge zunächst im RAM ausgeführt – Dateisysteme werden zwischengespeichert. Es gibt Ausnahmen von dieser Regel, aber diese eher speziellen Fälle ergeben sich normalerweise aus ganz bestimmten Anforderungen. Daher werden Sie den Unterschied erst bemerken, wenn Sie mit dem Leeren des Caches beginnen.

Eine andere Sache ist, dass die Leistung davon abhängteine Mengevom genauen Dateisystem ab - einige zielen auf einen einfacheren Zugriff auf große Mengen kleiner Dateien ab, andere sind effizient bei der Echtzeit-Datenübertragung von und zu großen Dateien (Multimedia-Erfassung/-Streaming), einige legen Wert auf Datenkohärenz und andere können so konzipiert werden, dass sie einen geringen Speicher-/Codebedarf haben.

Zurück zu Ihrem Anwendungsfall: In nur einem Schleifendurchlauf erzeugen Sie etwa 20 neue Prozesse, von denen die meisten nur ein Verzeichnis/eine Datei erstellen (beachten Sie, dass ()eine Sub-Shell erstellt und für jede einzelne Übereinstimmung finderzeugt wird cat) - der Engpass ist in der Tat nicht das Dateisystem (und wenn Ihr SystemASLRund Sie haben keine gute, schnelle Entropiequelle, dann wird der Zufallspool Ihres Systems auch ziemlich schnell erschöpft). Dasselbe gilt für FUSE, das in Perl geschrieben ist – es ist nicht das richtige Werkzeug für diese Aufgabe.

Antwort2

Eine etwas längere Antwort als mein Kommentar, dass die Tests hauptsächlich aus kleinen Transaktionen bestehen.

Arbeitsbelastung reicht nicht zum Testen aus

Wenn Sie Ihr Dateisystem einem Stresstest unterziehen möchten, benötigen Sie größere Arbeitspakete.

Je nachdem, wie viel Speicher Sie auf Ihrem Rechner haben, werden Sie selbst bei Zehntausenden von Ordnererstellungsvorgängen keinen merklichen Unterschied zwischen den beiden feststellen. Passen Sie daher Ihre Arbeitslast an, um die Dateisysteme ausreichend zu testen, und berücksichtigen Sie dabei Ihren Speicher, der als Puffer verwendet wird.

Es gibt zahlreiche Möglichkeiten, einen Test zu konzipieren, der die Vorteile Ihres System-RAMs und andere Faktoren zunichte macht, die Ihre Testergebnisse verfälschen.

Oder Sie können eine standardisierte Testsuite verwenden, wie bonnie++

verwandte Informationen