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.
Antworten:
"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).
quelle
mmap
scheint es, dass es ziemlich viel niedriger und chirurgischer ist, als ich suche. Ich habe bereits einen Speicherort, über den die Daten gespeichert werden könnenmount 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.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
losetup
und 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).
quelle
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:
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:
** Beachten Sie, dass dies eine
genisoimage
einfache Installation über erfordertapt-get
.Um die Datei direkt im Speicher zu speichern, habe ich eine Ramdisk im
/tmp
Dateisystem erstellt:Das Abrufen des Containers kann mit einem mehrteiligen Übertragungsdienstprogramm relativ schnell erfolgen. Ich habe einen verwendet, der
axel
auf diese Weise aufgerufen wurde:Schließlich mounten wir die Datei in ein lokales Dateisystem:
Der Montagevorgang erfolgt nahezu augenblicklich, sodass das System die Daten schnell für die Verarbeitung verwenden kann.
quelle