Прием данных Azure HPC Cache — метод копирования вручную

В этой статье приведены подробные инструкции по ручному копированию данных в контейнер хранилища Blob для использования с Azure HPC Cache. Он использует многопоточных параллельных операций для оптимизации скорости копирования.

Дополнительные сведения о перемещении данных в хранилище BLOB-объектов для Azure HPC Cache см. в статье "Перемещение данных в хранилище BLOB-объектов Azure".

Пример простого копирования

Вы можете вручную создать многопоточное копирование на клиенте, выполнив несколько команд копирования одновременно в фоновом режиме для предопределенных наборов файлов или путей.

Команда Linux/UNIX cp включает аргумент -p для сохранения владения и метаданных mtime. Добавление этого аргумента в приведенные ниже команды является необязательным. (Добавление аргумента увеличивает количество вызовов файловой системы, отправленных от клиента в целевую файловую систему для изменения метаданных.)

В этом простом примере два файла копируются параллельно:

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

После выдачи этой команды jobs команда покажет, что выполняются два потока.

Копирование данных с предсказуемыми именами файлов

Если имена файлов предсказуемы, можно использовать выражения для создания параллельных потоков копирования.

Например, если ваш каталог содержит 1000 файлов, которые нумерованы последовательно от 0001 до 1000, можно использовать следующие выражения для создания 10 параллельных потоков, которые копируют 100 файлов.

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/

Копирование данных с неструктурированными именами файлов

Если структура именования файлов не предсказуема, можно группировать файлы по именам каталогов.

В этом примере собираются все каталоги для отправки в команды cp, выполняемые как фоновые задачи.

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

После сбора файлов можно выполнить команды параллельного копирования, чтобы рекурсивно скопировать подкаталоги и все их содержимое:

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/ &

Когда добавлять точки подключения

После того как у вас достаточно параллельных потоков, идущих против одной точки подключения файловой системы назначения, будет точка, в которой добавление дополнительных потоков не дает больше пропускной способности. (Пропускная способность будет измеряться в файлах в секунду или байтах в секунду в зависимости от вашего типа данных.) Что еще хуже, чрезмерная многопоточность иногда может привести к снижению пропускной способности.

В этом случае можно добавить точки подключения на стороне клиента в другие адреса подключения Azure HPC Cache, используя тот же путь подключения к удаленной файловой системе:

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)

Добавление точек монтирования на стороне клиента позволяет выполнять дополнительные команды копирования в эти дополнительные /mnt/destination[1-3] точки монтирования, что способствует дальнейшему параллелизму.

Например, если файлы очень большие, можно определить команды копирования для использования различных путей назначения, отправляя дополнительные команды параллельно от клиента, выполняющего копирование.

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/ & \

В приведенном выше примере все три конечных точки подключения ориентированы на процессы копирования файлов клиента.

Когда добавлять клиентов

Наконец, когда вы достигли возможностей клиента, добавление дополнительных потоков копирования или дополнительных точек подключения не приведет к увеличению дополнительных файлов/с или байт/с. В этой ситуации можно развернуть другой клиент с тем же набором точек подключения, которые будут выполнять собственные наборы процессов копирования файлов.

Пример:

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/ &

Создание манифестов файлов

После того как вы изучите подходы, указанные выше (несколько потоков копирования на каждое место назначения, несколько мест назначения на одного клиента, несколько клиентов на одну сетевую файловую систему с доступом), рассмотрите эту рекомендацию: создайте списки файлов и используйте их вместе с командами копирования на нескольких клиентах.

В этом сценарии используется команда UNIX find для создания манифестов файлов или каталогов:

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

Перенаправьте этот результат в файл: find . -mindepth 4 -maxdepth 4 -type d > /tmp/foo

Затем можно выполнить итерацию манифеста с помощью команд BASH для подсчета файлов и определения размеров подкаталогов:

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

Наконец, необходимо создать фактические команды копирования файлов для клиентов.

Если у вас есть четыре клиента, используйте следующую команду:

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

Если у вас есть пять клиентов, используйте следующее:

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

И для шести.... Экстраполируйте по мере необходимости.

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

Вы получите N результирующих файлов, по одному для каждого из ваших клиентов N, содержащих имена путей к каталогам четвертого уровня, полученным в результатах команды find.

Используйте каждый файл для создания команды копирования:

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

В приведенной выше инструкции вы получите N файлов, каждый из которых содержит команду копирования на каждую строку и может выполняться в качестве скрипта BASH на клиенте.

Цель состоит в том, чтобы одновременно запускать несколько потоков этих скриптов на один клиент параллельно на нескольких клиентах.