Benötigen Sie einen effizienten Datencontainer. So schnell wie möglich vom Speicher in den Speicher wechseln

7

Problem : Ich muss so schnell wie möglich einen großen Datenblock von einem Remotestandort in den Systemspeicher kopieren.

Szenario : Ich habe ein Datenverarbeitungssystem. Das System wird über Shell-Skripte im laufenden Betrieb mit mehreren Komponenten erstellt, die von entfernten Standorten abgerufen werden.

Eine dieser Komponenten ist ein großer Datenblock, der als Dateigruppen gespeichert wird.

Ich muss diesen großen Datenblock von einem Remotestandort abrufen und so schnell wie möglich im Systemspeicher installieren. Dies ist eine Voraussetzung, damit das System, das sich auf diese Daten stützt, sie so bald wie möglich nach dem Start für die Verarbeitung verwenden kann.


Frage : "Was wäre der effizienteste Container für meine Daten?"


Bereits erprobte / in Betracht gezogene Lösungen :

  • ISO-Datei: Erfordert Tools zum Erstellen und Lesen, die normalerweise nicht nativ sind
  • TAR-Datei: Das Extrahieren kann viel Zeit in Anspruch nehmen
  • Remote-Dateisystem als lokal bereitgestellt: langsam, da Inhalte in den Speicher kopiert werden müssen
  • LVM-Snapshot: Richten Sie sich mehr auf Backups aus, die nicht auf Geschwindigkeit bei der Wiederherstellung ausgelegt sind

Anmerkungen :

  • Datenverlust ist kein Hauptanliegen.
  • Das Remote-Dateiübertragungsverfahren ist kein Hauptanliegen, da ich bereits über ein geeignetes Tool verfüge.
  • Das System verwendet derzeit Ubuntu Linux.
SunSparc
quelle
2
Haben Sie versucht, ZFS zu senden / empfangen?
EEAA
Ich habe nicht, obwohl ich nur ZFS im Allgemeinen betrachtet habe. Ich werde mich speziell mit Senden / Empfangen befassen.
SunSparc
1
ZFS scheint ein großartiges aufstrebendes Dateisystem mit einigen netten Funktionen zu sein. Für dieses Projekt passt ZFS zumindest derzeit nicht gut. Darüber hinaus habe ich keine Hinweise darauf gesehen, dass ZFS übermäßig effiziente Datenübertragungscontainer bereitstellt.
SunSparc
1
ZFS ist kaum aufstrebend. btrfs? Das ist ein aufstrebendes Dateisystem. ZFS gibt es schon seit geraumer Zeit und es ist sehr stabil. Auf jeden Fall ist es schwierig, effizienter als das Senden / Empfangen von ZFS zu werden - es überträgt nur geänderte Bytes und wird bei Wahl komprimiert.
EEAA
1
Entschuldigung, mit Knospen habe ich einfach gemeint, dass es noch nicht so allgegenwärtig zu sein scheint wie andere Dateisysteme. Aber das ist nebensächlich. Die Übertragung, an der ich arbeite, ist keine vergleichende Übertragung, sondern jedes Mal eine erste Übertragung. Somit würde es aufgrund des Vergleichs keine "Beschleunigungs" -Vorteile geben. So viele Transfersysteme und Container scheinen auf Backups ausgerichtet zu sein, woran ich nicht arbeite.
SunSparc

Antworten:

4

"Das Remote-Dateiübertragungsverfahren ist kein Hauptanliegen, da ich bereits über ein geeignetes Tool verfüge."

Wenn Sie die Datei bereits übertragen haben, empfehle ich die Verwendung von mmap (2).

Mark Wagner
quelle
Diese Antwort fasziniert mich. Ich prüfe, ob dies für meine Situation funktioniert.
SunSparc
Nach der Überprüfung mmapscheint es, dass es ziemlich viel niedriger und chirurgischer ist, als ich suche. Ich habe bereits einen Speicherort, über den die Daten gespeichert werden können mount tmpfs. Ich bin eher auf der Suche nach einem Container, der sich schnell in die tmpfs entladen lässt. Bisher scheinen Schnappschüsse die beste Option zu sein.
SunSparc
2

Sie sollten eine Image-Datei mit einem Dateisystem in Betracht ziehen, das Ihre Daten enthält (legen Sie ein Loop-Gerät über die Datei mit losetupund mounten Sie das Loop-Gerät). Der schnellste Weg wäre wahrscheinlich ein komprimiertes schreibgeschütztes Dateisystem wie squashfs.

Dies würde sogar einige Tricks erlauben, wenn nicht alle Daten gleichzeitig benötigt werden. Anstatt das Loop-Gerät zu mounten, können Sie ein DM-Gerät darauf platzieren, ein Netzwerkdateisystem (oder ein Netzwerkblockgerät) mit der Image-Datei mounten, ein zweites Loop-Gerät über die Netzwerkversion der Datei legen und beide kombinieren Loop-Geräte mit dem DM-Gerät.

Nehmen wir an, Sie müssen 500 MiB Daten kopieren. Sie beginnen es zu kopieren. Sobald die ersten 100 MiB übertragen wurden, erstellen Sie die Loop-Geräte und das DM-Gerät. Das DM-Gerät zeigt für die ersten 100 MiB auf das Loop-Gerät der lokalen Datei und für den Rest auf das andere. Nach z. B. jedem übertragenen 10-MiB-Block setzen Sie das DM-Gerät aus und laden es neu, wobei der Rand um weitere 10 MiB verschoben wird.

Das Risiko ist: Wenn auf die Netzwerkversion zugegriffen wird, werden diese Daten zweimal übertragen. Wenn dies häufig vorkommt, dauert die Datenübertragung länger (der gesamte Vorgang kann jedoch je nach Zugriffseigenschaften früher abgeschlossen werden).

Bearbeiten 1:

In dieser Antwort von mir auf eine andere Frage finden Sie eine Erklärung zur Verwendung von DM-Geräten auf diese Weise (ohne jedoch anzuhalten / neu zu laden / fortzusetzen).

Hauke ​​Laging
quelle
Die Antwort fällt mir nicht leicht, schnell zu grillen. Ich muss darauf zurückkommen.
SunSparc
Die Bilddatei (ISO) ist das, wofür wir uns an dieser Stelle entschieden haben. Während die Verwendung von Teildaten, wie sie eingehen, theoretisch eine gute Idee für dieses spezielle System ist, ist für den Beginn der Verarbeitung der gesamte Datenblock erforderlich.
SunSparc
0

Meine ersten Untersuchungen zum ISO-Container waren anscheinend unvollständig. Der ISO-Container scheint der effizienteste zu sein, um schnell zum Inhalt zu gelangen. Dies basiert auf dem, was meine Forschung aufdecken konnte und natürlich ändern könnte.

Verpackt in einer ISO kann ich:

  • Speichern Sie die Daten aus der Ferne
  • Rufen Sie es sehr schnell per mehrteiliger Übertragung ab
  • Speichern Sie es lokal direkt im Speicher
  • montieren Sie es schnell

Mit diesem Container konnte ich den gesamten Prozess auf unter 1 Minute reduzieren, was für dieses Projekt ein akzeptables Toleranzniveau darstellt.

Das Erstellen dieses Containers ist in Ubuntu mit einem Befehl ähnlich dem folgenden einfach:

mkisofs -o /tmp/data.iso /opt/data/

** Beachten Sie, dass dies eine genisoimageeinfache Installation über erfordert apt-get.

Um die Datei direkt im Speicher zu speichern, habe ich eine Ramdisk im /tmpDateisystem erstellt:

mount -t tmpfs -o size=3G tmpfs /tmp/data

Das Abrufen des Containers kann mit einem mehrteiligen Übertragungsdienstprogramm relativ schnell erfolgen. Ich habe einen verwendet, der axelauf diese Weise aufgerufen wurde:

axel -a -n 128 -o /tmp/data/data.iso https://s3.amazonaws.com/bucket/data.iso

Schließlich mounten wir die Datei in ein lokales Dateisystem:

mount -o loop -r /tmp/data/data.iso /opt/data/

Der Montagevorgang erfolgt nahezu augenblicklich, sodass das System die Daten schnell für die Verarbeitung verwenden kann.

SunSparc
quelle