インスタンスタイプと EBS 性能を変えて rsync + parallel の速度を比較してみた
はじめに
テクニカルサポートの 片方 です。
以前ブログで、Amazon Linux 2023 環境で EBS ボリューム間の並列データ転送 (GNU parallel と rsync を組み合わせ) を実装して確認しました。
その際に、インスタンスタイプや EBS ボリュームの IOPS, スループット値の変更により、転送速度がどの様に変化するのか気になりましたので、検証してみました。
GNU parallel と rsync を組み合わせた実装方法については、以下をご参考ください。
先に結論から(速度計測の結果)
最も高速だったのは m5.2xlarge(8 vCPU)で並列数 32 の場合で、約 6 秒弱で完了しました。
一方で、m5.large(2 vCPU)では並列数を増やしても 17 秒前後が頭打ちとなり、明確な差が出ています。
また、EBS を gp3 の 3,000 IOPS / 125 MBps から 6,000 IOPS / 250 MBps に引き上げても、処理時間はほぼ変わらず、小さいファイルを大量に処理する本検証環境では、EBS の性能よりも CPU コア数の方が処理時間に影響しやすい結果となりました。
検証環境
- OS : Amazon Linux 2023
- インスタンスタイプ : m5.large, m5.2xlarge
- ルート EBS ボリューム (ソース) : 50 GB, gp3, 3,000 or 6,000 IOPS, 125 or 250 MB/秒
- 追加 EBS ボリューム (コピー先) : 25 GB, gp3, 3,000 or 6,000 IOPS, 125 or 250 MB/秒
- テストファイル : 2,000 個
表にまとめると以下の通りです。
| 検証環境 | インスタンスタイプ | vCPU | ルートEBS (ソース) | 追加EBS (コピー先) | 備考 |
|---|---|---|---|---|---|
| 1. m5.large(標準 EBS) | m5.large | 2 | gp3 / 3,000 IOPS / 125 MB/s | gp3 / 3,000 IOPS / 125 MB/s | ベースライン構成 |
| 2. m5.large(EBS 性能アップ) | m5.large | 2 | gp3 / 6,000 IOPS / 250 MB/s | gp3 / 6,000 IOPS / 250 MB/s | EBS のみ強化 |
| 3. m5.2xlarge(標準 EBS) | m5.2xlarge | 8 | gp3 / 3,000 IOPS / 125 MB/s | gp3 / 3,000 IOPS / 125 MB/s | vCPU 数アップ |
| 4. m5.2xlarge(EBS 性能アップ) | m5.2xlarge | 8 | gp3 / 6,000 IOPS / 250 MB/s | gp3 / 6,000 IOPS / 250 MB/s | vCPU 数 + EBS 共に強化 |
検証コマンド
#!/bin/bash
echo "=========================================="
echo "2,000 ファイル並行度比較テスト"
echo "=========================================="
# 並行度: 1(非並列)
echo ""
echo "【並行度 1】非並列処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 1 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 4
echo ""
echo "【並行度 4】4 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 4 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 8
echo ""
echo "【並行度 8】8 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 8 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 16
echo ""
echo "【並行度 16】16 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 16 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 32
echo ""
echo "【並行度 32】32 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 32 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
echo ""
echo "=========================================="
echo "比較完了"
echo "=========================================="
※ 利用する際は適宜修正してください
使用した検証コマンドは、2,000 個の小さなファイルを rsync と GNU parallel を使ってコピーし、並行度(同時実行数)による処理速度の違いを測定しています。
具体的には次のことをしています。
- /tmp に作成した test_file_*.txt(2,000個)を対象にする
- 並行度(1 / 4 / 8 / 16 / 32)ごとにコピー処理を実施
- parallel -j <並行数> で コピー処理を複数並列で実行
- rsync の -R オプションで元のパス構造を保持したまま /mnt/data に転送
- time コマンドで 処理にかかった実行時間を計測
- 転送後の /mnt/data/tmp/ にあるファイル数を数えて コピーの完了を確認
計測してみた
前途で紹介している通りの、検証環境で計測しています。


1. m5.large(標準 EBS)
| 検証環境 | インスタンスタイプ | vCPU | ルートEBS (ソース) | 追加EBS (コピー先) | 備考 |
|---|---|---|---|---|---|
| 1. m5.large(標準 EBS) | m5.large | 2 | gp3 / 3,000 IOPS / 125 MB/s | gp3 / 3,000 IOPS / 125 MB/s | ベースライン構成 |
計測結果
sh-5.2$ df -h /mnt/data
Filesystem Size Used Avail Use% Mounted on
/dev/nvme1n1 25G 24K 24G 1% /mnt/data
sh-5.2$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme1n1 259:0 0 25G 0 disk /mnt/data
nvme0n1 259:1 0 50G 0 disk
├─nvme0n1p1 259:2 0 50G 0 part /
├─nvme0n1p127 259:3 0 1M 0 part
└─nvme0n1p128 259:4 0 10M 0 part /boot/efi
sh-5.2$ ls -1 /tmp/test_file_*.txt | wc -l
2000
sh-5.2$ seq 1 2000 | xargs -I {} -P 32 bash -c 'echo "Test file {}" > /tmp/test_file_{}.txt'
sh-5.2$ ls -1 /tmp/test_file_*.txt | wc -l
2000
sh-5.2$ #!/bin/bash
echo "=========================================="
echo "2,000 ファイル並行度比較テスト"
echo "=========================================="
# 並行度: 1(非並列)
echo ""
echo "【並行度 1】非並列処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 1 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 4
echo ""
echo "【並行度 4】4 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 4 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 8
echo ""
echo "【並行度 8】8 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 8 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 16
echo ""
echo "【並行度 16】16 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 16 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 32
echo ""
echo "【並行度 32】32 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 32 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "=========================================="file_*.txt 2>/dev/null | wc -l)"
==========================================
2,000 ファイル並行度比較テスト
==========================================
【並行度 1】非並列処理
開始: 05:16:17
real 1m54.780s
user 0m19.555s
sys 0m10.825s
終了: 05:18:11
転送ファイル数: 2000
【並行度 4】4 並行処理
開始: 05:18:12
real 0m27.636s
user 0m21.030s
sys 0m11.652s
終了: 05:18:39
転送ファイル数: 2000
【並行度 8】8 並行処理
開始: 05:18:40
real 0m18.453s
user 0m23.118s
sys 0m12.091s
終了: 05:18:58
転送ファイル数: 2000
【並行度 16】16 並行処理
開始: 05:18:59
real 0m17.160s
user 0m22.586s
sys 0m11.186s
終了: 05:19:16
転送ファイル数: 2000
【並行度 32】32 並行処理
開始: 05:19:16
real 0m17.122s
user 0m22.353s
sys 0m11.333s
終了: 05:19:33
転送ファイル数: 2000
==========================================
比較完了
==========================================
sh-5.2$
| 並列数 | real | user | sys |
|---|---|---|---|
| 1 | 1m54.780s | 0m19.555s | 0m10.825s |
| 4 | 0m27.636s | 0m21.030s | 0m11.652s |
| 8 | 0m18.453s | 0m23.118s | 0m12.091s |
| 16 | 0m17.160s | 0m22.586s | 0m11.186s |
| 32 | 0m17.122s | 0m22.353s | 0m11.333s |
2. m5.large(EBS 性能アップ)
| 検証環境 | インスタンスタイプ | vCPU | ルートEBS (ソース) | 追加EBS (コピー先) | 備考 |
|---|---|---|---|---|---|
| 2. m5.large(EBS 性能アップ) | m5.large | 2 | gp3 / 6,000 IOPS / 250 MB/s | gp3 / 6,000 IOPS / 250 MB/s | EBS のみ強化 |
計測結果
sh-5.2$ ls -1 /tmp/test_file_*.txt | wc -l
2000
sh-5.2$ #!/bin/bash
echo "=========================================="
echo "2,000 ファイル並行度比較テスト"
echo "=========================================="
# 並行度: 1(非並列)
echo ""
echo "【並行度 1】非並列処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 1 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 4
echo ""
echo "【並行度 4】4 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 4 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 8
echo ""
echo "【並行度 8】8 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 8 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 16
echo ""
echo "【並行度 16】16 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 16 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 32
echo ""
echo "【並行度 32】32 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 32 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "=========================================="file_*.txt 2>/dev/null | wc -l)"
==========================================
2,000 ファイル並行度比較テスト
==========================================
【並行度 1】非並列処理
開始: 05:32:57
real 1m52.991s
user 0m19.035s
sys 0m9.278s
終了: 05:34:50
転送ファイル数: 2000
【並行度 4】4 並行処理
開始: 05:34:50
real 0m26.870s
user 0m20.687s
sys 0m10.447s
終了: 05:35:17
転送ファイル数: 2000
【並行度 8】8 並行処理
開始: 05:35:17
real 0m18.140s
user 0m22.055s
sys 0m12.408s
終了: 05:35:36
転送ファイル数: 2000
【並行度 16】16 並行処理
開始: 05:35:36
real 0m16.934s
user 0m22.109s
sys 0m11.272s
終了: 05:35:53
転送ファイル数: 2000
【並行度 32】32 並行処理
開始: 05:35:53
real 0m17.328s
user 0m22.927s
sys 0m11.180s
終了: 05:36:11
転送ファイル数: 2000
==========================================
比較完了
==========================================
sh-5.2$
| 並列数 | real | user | sys |
|---|---|---|---|
| 1 | 1m52.991s | 0m19.035s | 0m9.278s |
| 4 | 0m26.870s | 0m20.687s | 0m10.447s |
| 8 | 0m18.140s | 0m22.055s | 0m12.408s |
| 16 | 0m16.934s | 0m22.109s | 0m11.272s |
| 32 | 0m17.328s | 0m22.927s | 0m11.180s |
3. m5.2xlarge(標準 EBS)
| 検証環境 | インスタンスタイプ | vCPU | ルートEBS (ソース) | 追加EBS (コピー先) | 備考 |
|---|---|---|---|---|---|
| 3. m5.2xlarge(標準 EBS) | m5.2xlarge | 8 | gp3 / 3,000 IOPS / 125 MB/s | gp3 / 3,000 IOPS / 125 MB/s | vCPU 数アップ |
計測結果
sh-5.2$ ls -1 /tmp/test_file_*.txt | wc -l
2000
sh-5.2$ #!/bin/bash
echo "=========================================="
echo "2,000 ファイル並行度比較テスト"
echo "=========================================="
# 並行度: 1(非並列)
echo ""
echo "【並行度 1】非並列処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 1 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 4
echo ""
echo "【並行度 4】4 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 4 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 8
echo ""
echo "【並行度 8】8 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 8 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 16
echo ""
echo "【並行度 16】16 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 16 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 32
echo ""
echo "【並行度 32】32 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 32 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "=========================================="file_*.txt 2>/dev/null | wc -l)"
==========================================
2,000 ファイル並行度比較テスト
==========================================
【並行度 1】非並列処理
開始: 05:29:59
real 1m50.453s
user 0m16.370s
sys 0m7.614s
終了: 05:31:49
転送ファイル数: 2000
【並行度 4】4 並行処理
開始: 05:31:49
real 0m24.909s
user 0m16.550s
sys 0m7.771s
終了: 05:32:14
転送ファイル数: 2000
【並行度 8】8 並行処理
開始: 05:32:15
real 0m12.570s
user 0m16.731s
sys 0m8.066s
終了: 05:32:27
転送ファイル数: 2000
【並行度 16】16 並行処理
開始: 05:32:28
real 0m6.570s
user 0m18.351s
sys 0m9.430s
終了: 05:32:34
転送ファイル数: 2000
【並行度 32】32 並行処理
開始: 05:32:34
real 0m5.854s
user 0m19.134s
sys 0m9.838s
終了: 05:32:40
転送ファイル数: 2000
==========================================
比較完了
==========================================
sh-5.2$
| 並列数 | real | user | sys |
|---|---|---|---|
| 1 | 1m50.453s | 0m16.370s | 0m7.614s |
| 4 | 0m24.909s | 0m16.550s | 0m7.771s |
| 8 | 0m12.570s | 0m16.731s | 0m8.066s |
| 16 | 0m6.570s | 0m18.351s | 0m9.430s |
| 32 | 0m5.854s | 0m19.134s | 0m9.838s |
4. m5.2xlarge(EBS 性能アップ)
| 検証環境 | インスタンスタイプ | vCPU | ルートEBS (ソース) | 追加EBS (コピー先) | 備考 |
|---|---|---|---|---|---|
| 4. m5.2xlarge(EBS 性能アップ) | m5.2xlarge | 8 | gp3 / 6,000 IOPS / 250 MB/s | gp3 / 6,000 IOPS / 250 MB/s | vCPU 数 + EBS 共に強化 |
計測結果
sh-5.2$ ls -1 /tmp/test_file_*.txt | wc -l
2000
sh-5.2$ #!/bin/bash
echo "=========================================="
echo "2,000 ファイル並行度比較テスト"
echo "=========================================="
# 並行度: 1(非並列)
echo ""
echo "【並行度 1】非並列処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 1 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 4
echo ""
echo "【並行度 4】4 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 4 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 8
echo ""
echo "【並行度 8】8 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 8 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 16
echo ""
echo "【並行度 16】16 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 16 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "転送ファイル数: $(ls -1 /mnt/data/tmp/test_file_*.txt 2>/dev/null | wc -l)"
# 並行度: 32
echo ""
echo "【並行度 32】32 並行処理"
sudo rm -rf /mnt/data/tmp 2>/dev/null
echo "開始: $(date '+%H:%M:%S')"
time find /tmp/test_file_*.txt -type f | \
parallel -j 32 rsync -avR {} /mnt/data/ > /dev/null 2>&1
echo "終了: $(date '+%H:%M:%S')"
echo "=========================================="file_*.txt 2>/dev/null | wc -l)"
==========================================
2,000 ファイル並行度比較テスト
==========================================
【並行度 1】非並列処理
開始: 05:40:36
real 1m52.262s
user 0m17.107s
sys 0m8.816s
終了: 05:42:28
転送ファイル数: 2000
【並行度 4】4 並行処理
開始: 05:42:28
real 0m25.595s
user 0m17.821s
sys 0m9.282s
終了: 05:42:54
転送ファイル数: 2000
【並行度 8】8 並行処理
開始: 05:42:54
real 0m12.823s
user 0m18.222s
sys 0m8.850s
終了: 05:43:07
転送ファイル数: 2000
【並行度 16】16 並行処理
開始: 05:43:08
real 0m6.623s
user 0m18.515s
sys 0m10.034s
終了: 05:43:14
転送ファイル数: 2000
【並行度 32】32 並行処理
開始: 05:43:14
real 0m5.987s
user 0m18.978s
sys 0m10.587s
終了: 05:43:20
転送ファイル数: 2000
==========================================
比較完了
==========================================
sh-5.2$
| 並列数 | real | user | sys |
|---|---|---|---|
| 1 | 1m52.262s | 0m17.107s | 0m8.816s |
| 4 | 0m25.595s | 0m17.821s | 0m9.282s |
| 8 | 0m12.823s | 0m18.222s | 0m8.850s |
| 16 | 0m6.623s | 0m18.515s | 0m10.034s |
| 32 | 0m5.987s | 0m18.978s | 0m10.587s |
まとめ
今回の検証より、rsync + parallel(2,000 ファイル)の処理時間を比較 (real) すると、以下の通りでした。
| 検証環境 | 並列 1 (real) | 並列 4 (real) | 並列 8 (real) | 並列 16 (real) | 並列 32 (real) |
|---|---|---|---|---|---|
| 1. m5.large(標準 EBS) | 1m54.780s | 0m27.636s | 0m18.453s | 0m17.160s | 0m17.122s |
| 2. m5.large(EBS 性能アップ) | 1m52.991s | 0m26.870s | 0m18.140s | 0m16.934s | 0m17.328s |
| 3. m5.2xlarge(標準 EBS) | 1m50.453s | 0m24.909s | 0m12.570s | 0m6.570s | 0m5.854s |
| 4. m5.2xlarge(EBS 性能アップ) | 1m52.262s | 0m25.595s | 0m12.823s | 0m6.623s | 0m5.987s |
主なポイントは以下の通りです。
-
m5.large(2 vCPU)では、並列度を 16〜32 に増やしても約 17 秒で頭打ち
→ vCPU 数が少ないため、parallel の同時実行数を増やしても効果が伸びにくい -
m5.2xlarge(8 vCPU)では、並列32で約6秒と大幅に高速化
→ vCPU 数が増えることで、parallel の効果がそのまま速度に反映されやすくなる -
EBS を 3,000 IOPS → 6,000 IOPS にしても速度はほぼ変わらない
→ user / sys の傾向もほぼ同じで、小ファイル 2000 個程度では EBS の性能がボトルネックにならない
処理速度に課題がある場合は、今回のように vCPU 数が影響するケースもあるため、インスタンスタイプのスケールアップを先ずは選択肢の一つとして検討してみてください。
本ブログが誰かの参考になれば幸いです。
参考資料
- Amazon Linux 2023 環境で EBS ボリューム間の並列データ転送を実装~確認してみた | DevelopersIO
- Amazon EBS の Amazon CloudWatch メトリクス - Amazon EBS
- EBS ボリュームの平均スループットと IOPS を計算する | AWS re:Post
- NAME — GNU Parallel 20251122 documentation
- インスタンスタイプ - Amazon EC2 | AWS
- Amazon EC2 インスタンスタイプの変更 - Amazon Elastic Compute Cloud
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。







