Linux-tmpfs-Schreibgeschwindigkeit ist langsamer als die RAM-Geschwindigkeit

885
atreyu

Ich habe einen HPE ProLiant DL360 Gen9-Server.

  • CPU: Intel Xeon 2-CPUs E5-2687W v3 bei 3,10 GHz, 25 MB L3-Cache, 10 Cores ea
  • RAM: 8 x 32 GB PC4-17000 DDR4 2133 MHz CAS-15 1,2-V-SDRAM-DIMM (256 GB insgesamt)

(vollständige Server-Spezifikationen hier )

Der Server läuft CentOS 7.2mit dem Kernel 3.10.0-327.36.3.el7.x86_64.

Ich habe eine tmpfs-Ramdisk auf dem Server mit folgendem Eintrag in eingebunden /etc/fstab:

tmpfs /ramdisk tmpfs noauto,user 0 0 

Um das Schreiben auf diese Ramdisk zu testen, führe ich dann den folgenden Befehl aus:

time sh -c "dd if=/dev/zero of=/ramdisk/120GB_testfile bs=4k count=30000000 && sync" 

Es berichtet, dass es in 88.857 Sekunden 122.880.000.000 Bytes geschrieben hat, was einer Schreibgeschwindigkeit von 1991 MiB / Sek entspricht.

Wenn man bedenkt, dass die Schreibgeschwindigkeit dieses Speichers 17 GB / s beträgt (entsprechend dieser Beschreibung der Speicherdatenraten), überrascht mich die erheblich geringere Geschwindigkeit beim Schreiben auf meine tmpfs-Ramdisk. Kann jemand die Ungleichheit erklären und einen anderen Weg vorschlagen, in eine Datei im Speicher zu schreiben, die schneller ist?

Vielen Dank.

AKTUALISIEREN

Ich habe deaktiviert vm.swappiness, aber das brachte keinen Nutzen (1712 MiB / Sek).

Ich habe auch versucht, die Blockgröße zu erhöhen ( bs=256k count=468750), aber nicht viel (2087 MiB / Sek.).

1
Was ist, wenn Sie die Blockgröße erhöhen (und dabei die Anzahl reduzieren)? Tmpfs wird durch Swap-Speicher gesichert. Wie sicher sind Sie, dass Ihre Daten nicht ausgelagert werden und sich somit verlangsamen? Haben Sie "vm.swappiness" auf 0 oder 1 gesetzt? Mokubai vor 5 Jahren 1
@Mokubai, Swappiness wurde auf Standard gesetzt (60). Ich dachte, ich würde das Tauschen vermeiden, indem ich eine Datei so klein mache, dass sie vollständig in den Arbeitsspeicher passt. Ich werde versuchen, Swappiness zu deaktivieren, und werde meinen Beitrag mit diesen Ergebnissen aktualisieren. Vielen Dank. atreyu vor 5 Jahren 0
Wenn Sie wiederholt auf tmpfs schreiben (wie Ihr Test), ergeben sich für mich unterschiedliche Geschwindigkeiten, die normalerweise zunehmen, aber ich verwende kleinere Größen. Ich bin mir nicht sicher, ob dies die Ursache ist. Ich schätze, es könnte vom Speicher für tmpfs freigegeben werden. Änderungen, wenn derselbe Test mehrmals hintereinander ausgeführt wird? Oder mit Ramfs? (Zu Ihrer Information, RAMs sollten * wirklich * im RAM bleiben und eine genauere "Ramdisk" sein, aber sie haben kein Größenlimit, also achten Sie darauf.) Xen2050 vor 5 Jahren 0

1 Antwort auf die Frage

3
Austin Hemmelgarn

Wenn Sie ein In-Memory-Dateisystem verwenden, läuft mehr als nur Daten in den Arbeitsspeicher. Sie müssen immer noch mit den Datenstrukturen umgehen, die der Datei zugeordnet sind, einschließlich der Nachverfolgung, wo sich alle Zuordnungen im Speicher befinden. Das Schreiben dieser Informationen erfordert ebenfalls Zeit (insbesondere wird für die von Ihnen durchgeführten Tests die Dateigröße bei jedem Schreibvorgang aktualisiert, wodurch sofort die Anzahl der Stellen verdoppelt wird, in denen sich die Daten im Speicher befinden).

Das Zuweisen von Speicher ist außerdem extrem langsam. In der Tat handelt es sich dabei um eines der langsamsten Dinge, die Sie auf den meisten Systemen tun können, bei denen keine E / A-Operationen erforderlich sind. Das einzig wesentlich langsamere ist das Erstellen eines neuen Threads oder Prozesses. Tools wie ramspeedder gesamte Speicher, den sie gleich beim Start verwenden, vorab reservieren, damit sie die tatsächliche Speicherleistung testen können. Im Vergleich dazu hat tmpfs keine Ahnung, wie groß eine Datei sein wird, die Sie erstellen werden. Daher muss alles nach Bedarf zugewiesen werden. Dies geschieht in ddBlöcken, die nicht größer als die Blockgröße sind (ich denke, es liegt bei 64 KB, aber Ich bin mir nicht sicher). Aus diesem Grund haben Sie in jedem Block einen Aufwand für die Zuweisung von Speicher, um diesen Block zu speichern.

Denken Sie, dass das Kopieren einer Datei möglicherweise schneller ist, da sie weiß, wie groß die Datei sein wird, während dd dies nicht tut? Oder wie man die Geschwindigkeit von "cp" misst oder sogar eine Datei mit fester Größe aus etwas wie / dev / zero erstellt, ohne dass bereits eine andere Datei in tmpfs / ramfs kopiert werden muss (der Test wird durch das Hinzufügen von Lesevorgängen verlangsamt)? Xen2050 vor 5 Jahren 0
Im Grunde machen "cp" und "dd" im Wesentlichen dasselbe, sie lesen Daten aus der Quelle und schreiben sie dann an das Ziel. "cp" ist normalerweise etwas schneller, aber das liegt daran, dass automatisch die optimalen Blockgrößen ermittelt werden, mit denen gearbeitet werden kann. "cp" kann unter bestimmten Umständen auch erheblich schneller sein, da es verschiedene Copy-Offload-Mechanismen verwenden kann (z. B. Rückkopplungen in Dateisystemen, die es unterstützen, oder den SCSI-Befehl XCOPY auf Hardware, die es unterstützen). Austin Hemmelgarn vor 5 Jahren 0