Erfassung von Azure HPC-Cachedaten – manuelle Kopiermethode

Dieser Artikel enthält ausführliche Anweisungen zum manuellen Kopieren von Daten in einen BLOB-Speichercontainer zur Verwendung mit Azure HPC Cache. Es verwendet Multithread-parallele Vorgänge, um die Kopiergeschwindigkeit zu optimieren.

Weitere Informationen zum Verschieben von Daten in Blob Storage für Ihren Azure HPC-Cache finden Sie unter "Verschieben von Daten in Azure Blob Storage".

Beispiel für einfache Kopie

Sie können eine Multithreadkopie auf einem Client manuell erstellen, indem Sie mehrere Kopierbefehle gleichzeitig im Hintergrund für vordefinierte Gruppen von Dateien oder Pfaden ausführen.

Der Linux/UNIX-Befehl cp enthält das Argument -p zum Beibehalten des Besitzes und der mtime-Metadaten. Das Hinzufügen dieses Arguments zu den folgenden Befehlen ist optional. (Durch Das Hinzufügen des Arguments wird die Anzahl der Vom Client an das Zieldateisystem gesendeten Dateisystemaufrufe zur Änderung der Metadaten erhöht.)

In diesem einfachen Beispiel werden zwei Dateien parallel kopiert:

cp /mnt/source/file1 /mnt/destination1/ & cp /mnt/source/file2 /mnt/destination1/ &

Nach dem Ausgeben dieses Befehls zeigt der jobs Befehl an, dass zwei Threads ausgeführt werden.

Kopieren von Daten mit vorhersagbaren Dateinamen

Wenn Ihre Dateinamen vorhersagbar sind, können Sie Ausdrücke verwenden, um parallele Kopierthreads zu erstellen.

Wenn Ihr Verzeichnis beispielsweise 1000 Dateien enthält, die sequenziell 00011000nummeriert werden, können Sie die folgenden Ausdrücke verwenden, um 10 parallele Threads zu erstellen, die jeweils 100 Dateien kopieren:

cp /mnt/source/file0* /mnt/destination1/ & \
cp /mnt/source/file1* /mnt/destination1/ & \
cp /mnt/source/file2* /mnt/destination1/ & \
cp /mnt/source/file3* /mnt/destination1/ & \
cp /mnt/source/file4* /mnt/destination1/ & \
cp /mnt/source/file5* /mnt/destination1/ & \
cp /mnt/source/file6* /mnt/destination1/ & \
cp /mnt/source/file7* /mnt/destination1/ & \
cp /mnt/source/file8* /mnt/destination1/ & \
cp /mnt/source/file9* /mnt/destination1/

Kopieren von Daten mit unstrukturierten Dateinamen

Wenn ihre Dateibenennungsstruktur nicht vorhersehbar ist, können Sie Dateien nach Verzeichnisnamen gruppieren.

Dieses Beispiel sammelt ganze Verzeichnisse, die an cp-Befehle übergeben werden, die im Hintergrund ausgeführt werden.

/root
|-/dir1
| |-/dir1a
| |-/dir1b
| |-/dir1c
   |-/dir1c1
|-/dir1d

Nachdem die Dateien gesammelt wurden, können Sie parallele Kopierbefehle ausführen, um die Unterverzeichnisse und den gesamten Inhalt rekursiv zu kopieren:

cp /mnt/source/* /mnt/destination/
mkdir -p /mnt/destination/dir1 && cp /mnt/source/dir1/* mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1a /mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1b /mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1c /mnt/destination/dir1/ & # this command copies dir1c1 via recursion
cp -R /mnt/source/dir1/dir1d /mnt/destination/dir1/ &

Gründe für das Hinzufügen von Bereitstellungspunkten

Nachdem Sie genügend parallele Threads für einen einzelnen Bereitstellungspunkt des Zieldateisystems verwendet haben, gibt es einen Punkt, an dem das Hinzufügen weiterer Threads keinen weiteren Durchsatz bietet. (Der Durchsatz wird in Dateien/Sekunde oder Bytes/Sekunde gemessen, je nach Datentyp.) Oder schlimmer noch: Überthreading kann manchmal zu einer Durchsatzverschlechterung führen.

In diesem Fall können Sie clientseitige Bereitstellungspunkte zu anderen Azure HPC-Cache-Bereitstellungsadressen hinzufügen, indem Sie denselben Bereitstellungspfad des Remotedateisystems verwenden:

10.1.0.100:/nfs on /mnt/sourcetype nfs (rw,vers=3,proto=tcp,addr=10.1.0.100)
10.1.1.101:/nfs on /mnt/destination1type nfs (rw,vers=3,proto=tcp,addr=10.1.1.101)
10.1.1.102:/nfs on /mnt/destination2type nfs (rw,vers=3,proto=tcp,addr=10.1.1.102)
10.1.1.103:/nfs on /mnt/destination3type nfs (rw,vers=3,proto=tcp,addr=10.1.1.103)

Durch das Hinzufügen von clientseitigen Mountpunkten können Sie weitere Kopierbefehle zu den zusätzlichen /mnt/destination[1-3] Mountpunkten leiten und so weitere Parallelität erzielen.

Wenn Ihre Dateien z. B. sehr groß sind, können Sie die Kopierbefehle definieren, um unterschiedliche Zielpfade zu verwenden, und mehr Befehle parallel vom Client senden, die die Kopie ausführen.

cp /mnt/source/file0* /mnt/destination1/ & \
cp /mnt/source/file1* /mnt/destination2/ & \
cp /mnt/source/file2* /mnt/destination3/ & \
cp /mnt/source/file3* /mnt/destination1/ & \
cp /mnt/source/file4* /mnt/destination2/ & \
cp /mnt/source/file5* /mnt/destination3/ & \
cp /mnt/source/file6* /mnt/destination1/ & \
cp /mnt/source/file7* /mnt/destination2/ & \
cp /mnt/source/file8* /mnt/destination3/ & \

Im obigen Beispiel werden alle drei Ziel-Bereitstellungspunkte von den Kopiervorgängen des Clients angezielt.

Wann Clients hinzugefügt werden sollen

Wenn Sie die Funktionen des Clients erreicht haben, werden durch das Hinzufügen weiterer Kopierthreads oder zusätzlicher Bereitstellungspunkte keine zusätzlichen Dateien/s oder Bytes/Sek. erhöht. In dieser Situation können Sie einen anderen Client mit denselben Bereitstellungspunkten bereitstellen, die eigene Gruppen von Dateikopieprozessen ausführen.

Beispiel:

Client1: cp -R /mnt/source/dir1/dir1a /mnt/destination/dir1/ &
Client1: cp -R /mnt/source/dir2/dir2a /mnt/destination/dir2/ &
Client1: cp -R /mnt/source/dir3/dir3a /mnt/destination/dir3/ &

Client2: cp -R /mnt/source/dir1/dir1b /mnt/destination/dir1/ &
Client2: cp -R /mnt/source/dir2/dir2b /mnt/destination/dir2/ &
Client2: cp -R /mnt/source/dir3/dir3b /mnt/destination/dir3/ &

Client3: cp -R /mnt/source/dir1/dir1c /mnt/destination/dir1/ &
Client3: cp -R /mnt/source/dir2/dir2c /mnt/destination/dir2/ &
Client3: cp -R /mnt/source/dir3/dir3c /mnt/destination/dir3/ &

Client4: cp -R /mnt/source/dir1/dir1d /mnt/destination/dir1/ &
Client4: cp -R /mnt/source/dir2/dir2d /mnt/destination/dir2/ &
Client4: cp -R /mnt/source/dir3/dir3d /mnt/destination/dir3/ &

Erstellen von Dateimanifesten

Berücksichtigen Sie nach dem Verständnis der obigen Ansätze (mehrere Kopierthreads pro Ziel, mehrere Ziele pro Client, mehrere Clients pro Netzwerkzugriffsquelldateisystem) diese Empfehlung: Erstellen Sie Dateimanifeste, und verwenden Sie sie dann mit Kopierbefehlen über mehrere Clients hinweg.

In diesem Szenario wird der UNIX-Befehl find verwendet, um Manifeste von Dateien oder Verzeichnissen zu erstellen:

user@build:/mnt/source > find . -mindepth 4 -maxdepth 4 -type d
./atj5b55c53be6-01/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-01/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-01/support/trace/rolling
./atj5b55c53be6-03/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-03/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-03/support/trace/rolling
./atj5b55c53be6-02/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-02/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-02/support/trace/rolling

Dieses Ergebnis an eine Datei umleiten: find . -mindepth 4 -maxdepth 4 -type d > /tmp/foo

Anschließend können Sie das Manifest durchlaufen, mithilfe von BASH-Befehlen Dateien zählen und die Größen der Unterverzeichnisse bestimmen:

ben@xlcycl1:/sps/internal/atj5b5ab44b7f > for i in $(cat /tmp/foo); do echo " `find ${i} |wc -l` `du -sh ${i}`"; done
244    3.5M    ./atj5b5ab44b7f-02/support/gsi/2018-07-18T00:07:03EDT
9      172K    ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-18T05:01:00UTC
124    5.8M    ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-19T01:01:01UTC
152    15M     ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T01:01:00UTC
131    13M     ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T21:59:41UTC_partial
789    6.2M    ./atj5b5ab44b7f-02/support/gsi/2018-07-20T21:59:41UTC
134    12M     ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T22:22:55UTC_hpccache_catchup
7      16K     ./atj5b5ab44b7f-02/support/pcap/2018-07-18T17:12:19UTC
8      83K     ./atj5b5ab44b7f-02/support/pcap/2018-07-18T17:17:17UTC
575    7.7M    ./atj5b5ab44b7f-02/support/cores/armada_main.2000.1531980253.gsi
33     4.4G    ./atj5b5ab44b7f-02/support/trace/rolling
281    6.6M    ./atj5b5ab44b7f-01/support/gsi/2018-07-18T00:07:03EDT
15     182K    ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-18T05:01:00UTC
244    17M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-19T01:01:01UTC
299    31M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T01:01:00UTC
256    29M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T21:59:41UTC_partial
889    7.7M    ./atj5b5ab44b7f-01/support/gsi/2018-07-20T21:59:41UTC
262    29M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T22:22:55UTC_hpccache_catchup
11     248K    ./atj5b5ab44b7f-01/support/pcap/2018-07-18T17:12:19UTC
11     88K     ./atj5b5ab44b7f-01/support/pcap/2018-07-18T17:17:17UTC
645    11M     ./atj5b5ab44b7f-01/support/cores/armada_main.2019.1531980253.gsi
33     4.0G    ./atj5b5ab44b7f-01/support/trace/rolling
244    2.1M    ./atj5b5ab44b7f-03/support/gsi/2018-07-18T00:07:03EDT
9      158K    ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-18T05:01:00UTC
124    5.3M    ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-19T01:01:01UTC
152    15M     ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T01:01:00UTC
131    12M     ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T21:59:41UTC_partial
789    8.4M    ./atj5b5ab44b7f-03/support/gsi/2018-07-20T21:59:41UTC
134    14M     ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T22:25:58UTC_hpccache_catchup
7      159K    ./atj5b5ab44b7f-03/support/pcap/2018-07-18T17:12:19UTC
7      157K    ./atj5b5ab44b7f-03/support/pcap/2018-07-18T17:17:17UTC
576    12M     ./atj5b5ab44b7f-03/support/cores/armada_main.2013.1531980253.gsi
33     2.8G    ./atj5b5ab44b7f-03/support/trace/rolling

Schließlich müssen Sie die tatsächlichen Dateikopiebefehle für die Clients erstellen.

Wenn Sie über vier Clients verfügen, verwenden Sie diesen Befehl:

for i in 1 2 3 4 ; do sed -n ${i}~4p /tmp/foo > /tmp/client${i}; done

Wenn Sie fünf Clients haben, verwenden Sie etwas wie folgt:

for i in 1 2 3 4 5; do sed -n ${i}~5p /tmp/foo > /tmp/client${i}; done

Und für sechs.... Extrapolieren Sie bei Bedarf.

for i in 1 2 3 4 5 6; do sed -n ${i}~6p /tmp/foo > /tmp/client${i}; done

Sie bekommen N resultierende Dateien, eine für jeden Ihrer N Clients, die die Pfadnamen zu den Verzeichnissen auf der vierten Ebene enthalten, die Teil der Ausgabe des find-Befehls sind.

Verwenden Sie jede Datei, um den Kopierbefehl zu erstellen:

for i in 1 2 3 4 5 6; do for j in $(cat /tmp/client${i}); do echo "cp -p -R /mnt/source/${j} /mnt/destination/${j}" >> /tmp/client${i}_copy_commands ; done; done

Im obigen Beispiel werden N-Dateien mit jeweils einem Kopierbefehl pro Zeile bereitgestellt, die als BASH-Skript auf dem Client ausgeführt werden können.

Ziel ist es, mehrere Threads dieser Skripts gleichzeitig pro Client parallel auf mehreren Clients auszuführen.