AWS CLI S3 Configurationを試したら想定以上にaws s3 syncが速くなった話

aws-cli

西澤です。みんな大好きAWS CLIですが、このようなオプションがあることは把握していたものの、今更ながら試してみたところ、期待していた以上に良い結果が出たのでご紹介したいと思います。

AWS CLI S3 Configurationとは

AWS CLIには、S3コマンド専用にファイル転送オプションを指定することができます。今回試したのは、下記のオプションです。max_concurrent_requestsが特に実行時間に大きく影響がありそうです。

オプション デフォルト 説明 備考
max_concurrent_requests 10 最大同時リクエスト数 実行時間、CPU使用率、ネットワーク帯域に影響あり
max_queue_size 1000 最大タスクキュー数 メモリ使用量に影響あり

設定方法は、公式ドキュメントの通りですが、~/.aws/configに直接記載するか、aws configure setコマンドを利用して設定します。

$ cat ~/.aws/config
[profile default]
s3 =
  max_concurrent_requests = 20
  max_queue_size = 10000
$ aws configure set default.s3.max_concurrent_requests 20
$ aws configure get default.s3.max_concurrent_requests
20

$ aws configure set default.s3.max_queue_size 10000
$ aws configure get default.s3.max_queue_size
10000

検証環境

今回は余裕のあるインスタンスでテストを行ってみました。また、サイズの大きなファイルが多い場合には、multipart_thresholdmultipart_chunksizeオプションも調整する必要がありそうですが、今回はaws s3コマンドで取り扱うファイル数が多い場合のパフォーマンスについて調べました。念の為prefixを分散させた8KBのファイルを9999個用意して、"aws s3 rm"と"aws s3 sync"を繰り返して性能を確認してみました。

  • Amazon Linux AMI 2017.03.0.20170417 x86_64 HVM GP2
  • c4.xlarge

デフォルト設定のままでの実行結果

以下のような結果となりました。

[2017/05/02 07:48:49] aws configure get default.s3.max_concurrent_requests
10
[2017/05/02 07:48:49] aws configure get default.s3.max_queue_size
1000
[2017/05/02 07:48:49] aws s3 rm s3://aws-cli-s3-sync-test-bucket/ --recursive --quiet

real    2m9.117s
user    1m2.212s
sys 0m10.952s
[2017/05/02 07:50:58] aws s3 sync /home/ec2-user/data/ s3://aws-cli-s3-sync-test-bucket/ --quiet

real    6m41.344s
user    3m3.184s
sys 0m12.944s

念の為、サーバのリソース状況も一部取得しておきました。以下は、topコマンドとvmstatコマンドの結果です。

top - 07:52:10 up 51 min,  3 users,  load average: 0.44, 0.32, 0.23
Tasks: 105 total,   1 running, 104 sleeping,   0 stopped,   0 zombie
Cpu(s): 10.5%us,  0.6%sy,  0.0%ni, 88.6%id,  0.0%wa,  0.0%hi,  0.1%si,  0.2%st
Mem:   7660576k total,   492220k used,  7168356k free,    19936k buffers
Swap:        0k total,        0k used,        0k free,   237156k cached
[ 2017/05/02 07:51:40 ] procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
[ 2017/05/02 07:51:40 ] r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
[ 2017/05/02 07:51:40 ] 2  0      0 7176104  19936 237156    0    0     0     0 13297 13359 10  1 89  0  0
[ 2017/05/02 07:51:41 ] 0  0      0 7176228  19936 237156    0    0     0     0 13731 13623 11  1 88  0  0
[ 2017/05/02 07:51:42 ] 0  0      0 7174400  19936 237156    0    0     0     0 13275 13160  9  1 90  0  0
[ 2017/05/02 07:51:43 ] 1  0      0 7174276  19936 237156    0    0     0     0 12157 12211  9  1 90  0  0
[ 2017/05/02 07:51:44 ] 0  0      0 7174276  19936 237156    0    0     0     0 13176 13048 10  1 89  0  0
[ 2017/05/02 07:51:45 ] 1  0      0 7174028  19936 237156    0    0     0     0 15778 15887 10  1 89  0  0
[ 2017/05/02 07:51:46 ] 0  0      0 7174028  19936 237156    0    0     0     0 11540 11684  9  1 90  0  0
[ 2017/05/02 07:51:47 ] 0  0      0 7173316  19936 237156    0    0     0     0 13673 13710 11  1 88  0  0
[ 2017/05/02 07:51:48 ] 0  0      0 7173220  19936 237156    0    0     0     0 12876 13034 10  1 89  0  0
[ 2017/05/02 07:51:49 ] 0  0      0 7173128  19936 237156    0    0     0     0 14214 14403 11  1 89  0  0
[ 2017/05/02 07:51:50 ] 0  0      0 7172076  19936 237156    0    0     0     0 14109 14284 11  0 89  0  1
[ 2017/05/02 07:51:51 ] 0  0      0 7171952  19936 237156    0    0     0     0 12900 13026 11  2 87  0  0
[ 2017/05/02 07:51:52 ] 1  0      0 7171764  19936 237156    0    0     0     0 15625 15844 10  1 89  0  0
[ 2017/05/02 07:51:53 ] 0  0      0 7171952  19936 237156    0    0     0     0 14987 14683  8  1 90  0  0
[ 2017/05/02 07:51:54 ] 0  0      0 7172044  19936 237156    0    0     0     0 14765 14908 12  1 87  0  0
[ 2017/05/02 07:51:55 ] 0  0      0 7171704  19936 237156    0    0     0     0 12651 12670  9  1 90  0  0
[ 2017/05/02 07:51:56 ] 2  0      0 7171516  19936 237156    0    0     0     0 15197 15489 10  1 88  0  0
[ 2017/05/02 07:51:57 ] 0  0      0 7171144  19936 237156    0    0     0     0 11379 11387  8  0 92  0  0
[ 2017/05/02 07:51:58 ] 0  0      0 7170896  19936 237156    0    0     0     0 15090 14876 11  1 87  0  0
[ 2017/05/02 07:51:59 ] 0  0      0 7170896  19936 237156    0    0     0     0 12253 12292  8  1 91  0  0
[ 2017/05/02 07:52:00 ] 0  0      0 7170648  19936 237156    0    0     0     0 14063 13902 11  1 88  0  0

S3オプションを変更して実行した結果(デフォルトの10倍)

2つのオプションをデフォルトの10倍にして試してみたところ、7m近くかかっていたsyncがなんと2mかからずに終わりました。

[2017/05/02 07:58:27] aws configure get default.s3.max_concurrent_requests
100
[2017/05/02 07:58:27] aws configure get default.s3.max_queue_size
10000
[2017/05/02 08:01:37] aws s3 rm s3://aws-cli-s3-sync-test-bucket/ --recursive --quiet

real    1m13.080s
user    1m49.032s
sys 0m19.848s
[2017/05/02 08:02:50] aws s3 sync /home/ec2-user/data/ s3://aws-cli-s3-sync-test-bucket/ --quiet

real    1m55.279s
user    4m4.736s
sys 0m30.452s

そもそもtimeコマンドの結果において、"user"が"real"より大きくなることがある、ということを把握していませんでしたが、マルチスレッドで処理されるプログラムでは、このような結果になるそうです。ロードアベレージも2〜3を示すようになり、CPU負荷がかなり大きくなっていることがわかります。他のサービスと相乗りした環境でここまでやるのは危険ですが、とにかく急ぎでファイル転送をしたい、というときには積極的に使うと良さそうです。

top - 08:02:22 up  1:01,  3 users,  load average: 3.45, 2.12, 1.02
Tasks: 105 total,   1 running, 104 sleeping,   0 stopped,   0 zombie
Cpu(s): 22.7%us,  3.8%sy,  0.0%ni, 71.9%id,  0.0%wa,  0.0%hi,  0.1%si,  1.6%st
Mem:   7660576k total,   572928k used,  7087648k free,    20108k buffers
Swap:        0k total,        0k used,        0k free,   237164k cached
[ 2017/05/02 08:02:10 ] procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
[ 2017/05/02 08:02:10 ] r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
[ 2017/05/02 08:02:10 ] 5  0      0 7099004  20108 237164    0    0     0     0 116551 124922 20  6 72  0  2
[ 2017/05/02 08:02:11 ] 2  0      0 7096668  20108 237164    0    0     0     0 109249 115986 27  9 63  0  2
[ 2017/05/02 08:02:12 ] 5  0      0 7096352  20108 237164    0    0     0     0 116125 124426 22  5 71  0  2
[ 2017/05/02 08:02:13 ] 5  0      0 7095220  20108 237164    0    0     0    20 48486 50969 21  2 76  0  1
[ 2017/05/02 08:02:14 ] 1  0      0 7093184  20108 237164    0    0     0     0 102217 107928 33  6 59  0  2
[ 2017/05/02 08:02:15 ] 27  0      0 7091164  20108 237164    0    0     0     0 92784 97135 39  6 53  0  1
[ 2017/05/02 08:02:16 ] 2  0      0 7092300  20108 237164    0    0     0     0 79580 83405 44  4 51  0  1
[ 2017/05/02 08:02:17 ] 3  0      0 7091028  20108 237164    0    0     0     0 94618 100140 35  6 58  0  2
[ 2017/05/02 08:02:18 ] 1  0      0 7088328  20108 237164    0    0     0     0 107055 113728 29  7 62  0  2
[ 2017/05/02 08:02:19 ] 2  0      0 7088128  20108 237164    0    0     0     0 114145 122381 22  5 71  0  2
[ 2017/05/02 08:02:20 ] 0  0      0 7088040  20108 237164    0    0     0     0 64698 69115 14  2 83  0  1
[ 2017/05/02 08:02:21 ] 9  0      0 7087680  20108 237164    0    0     0     0 88598 94163 34  4 60  0  2
[ 2017/05/02 08:02:22 ] 2  0      0 7087684  20108 237164    0    0     0     0 114224 121950 24  5 69  0  2
[ 2017/05/02 08:02:23 ] 4  0      0 7084824  20108 237164    0    0     0     4 103335 109253 32  6 60  0  2
[ 2017/05/02 08:02:24 ] 4  0      0 7084452  20108 237164    0    0     0     0 106940 113736 25  6 67  0  2
[ 2017/05/02 08:02:25 ] 3  0      0 7085948  20108 237164    0    0     0     0 115580 122544 22  6 70  0  2
[ 2017/05/02 08:02:26 ] 4  0      0 7086148  20108 237164    0    0     0     0 112407 120005 24  6 68  0  2
[ 2017/05/02 08:02:27 ] 13  0      0 7089528  20108 237164    0    0     0     0 52096 55161 12  2 85  0  1
[ 2017/05/02 08:02:28 ] 3  0      0 7089024  20112 237164    0    0     0     4 104077 110626 30  8 61  0  2
[ 2017/05/02 08:02:29 ] 8  0      0 7089024  20112 237164    0    0     0     0 117652 126884 18  5 75  0  2
[ 2017/05/02 08:02:30 ] 3  0      0 7089024  20112 237164    0    0     0     0 115954 124271 22  6 70  0  2

S3オプションを変更して実行した結果(デフォルトの100倍)

今度はデフォルトの100倍にしてみたのですが、これはやり過ぎのようです。あまり大きくは改善しませんでした。

[2017/05/02 08:09:41] aws configure get default.s3.max_concurrent_requests
1000
[2017/05/02 08:09:41] aws configure get default.s3.max_queue_size
100000
[2017/05/02 08:09:41] aws s3 rm s3://aws-cli-s3-sync-test-bucket/ --recursive --quiet

real    1m12.672s
user    1m49.636s
sys 0m20.716s
[2017/05/02 08:10:54] aws s3 sync /home/ec2-user/data/ s3://aws-cli-s3-sync-test-bucket/ --quiet

real    1m55.939s
user    4m9.896s
sys 0m31.080s

性能データにもほぼ大きな変化はありませんでした。どこにボトルネックがあるかまでは調査していませんが、ただ大きくするだけでも意味が無いことは確認できました。

top - 08:11:59 up  1:11,  3 users,  load average: 3.33, 3.27, 2.14
Tasks: 105 total,   1 running, 104 sleeping,   0 stopped,   0 zombie
Cpu(s): 48.8%us,  6.1%sy,  0.0%ni, 43.4%id,  0.0%wa,  0.0%hi,  0.6%si,  1.1%st
Mem:   7660576k total,   722128k used,  6938448k free,    20212k buffers
Swap:        0k total,        0k used,        0k free,   237164k cached
[ 2017/05/02 08:11:37 ] procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
[ 2017/05/02 08:11:37 ] r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
[ 2017/05/02 08:11:37 ] 3  0      0 6943668  20204 237164    0    0     0     0 77785 84459 50  6 43  0  1
[ 2017/05/02 08:11:38 ] 4  0      0 6943272  20204 237164    0    0     0     0 75168 81444 50  6 43  0  1
[ 2017/05/02 08:11:39 ] 4  0      0 6942400  20204 237164    0    0     0     0 80213 87936 48  7 44  0  1
[ 2017/05/02 08:11:40 ] 9  0      0 6941684  20204 237164    0    0     0     0 79141 85584 49  7 43  0  1
[ 2017/05/02 08:11:41 ] 4  0      0 6940176  20204 237164    0    0     0     0 78742 85576 49  6 44  0  1
[ 2017/05/02 08:11:42 ] 15  0      0 6940064  20204 237164    0    0     0     0 77918 84760 49  7 43  0  1
[ 2017/05/02 08:11:43 ] 4  0      0 6940064  20204 237164    0    0     0     0 80229 87549 47  6 45  0  1
[ 2017/05/02 08:11:44 ] 2  0      0 6940292  20204 237164    0    0     0     0 77897 84741 50  6 43  0  1
[ 2017/05/02 08:11:45 ] 6  0      0 6938184  20204 237164    0    0     0     0 70815 76438 47  7 45  0  1
[ 2017/05/02 08:11:46 ] 9  0      0 6937904  20204 237164    0    0     0     0 69902 75918 54  5 40  0  1
[ 2017/05/02 08:11:47 ] 3  0      0 6937748  20204 237164    0    0     0     0 76731 83184 50  5 43  0  1
[ 2017/05/02 08:11:48 ] 5  0      0 6937780  20204 237164    0    0     0     0 77797 84806 51  6 41  0  1
[ 2017/05/02 08:11:49 ] 5  0      0 6936880  20204 237164    0    0     0     0 77258 84264 50  6 43  0  1
[ 2017/05/02 08:11:50 ] 3  0      0 6936848  20204 237164    0    0     0     0 79650 86644 48  7 44  0  1
[ 2017/05/02 08:11:51 ] 9  0      0 6936320  20204 237164    0    0     0     0 77429 83948 49  6 43  0  1
[ 2017/05/02 08:11:52 ] 2  0      0 6935608  20204 237164    0    0     0     0 78056 84699 49  6 44  0  1
[ 2017/05/02 08:11:53 ] 2  0      0 6935392  20204 237164    0    0     0     0 79062 86064 49  7 44  0  1
[ 2017/05/02 08:11:54 ] 12  0      0 6937016  20204 237164    0    0     0     0 69693 74490 48  6 44  0  1
[ 2017/05/02 08:11:55 ] 10  0      0 6936748  20204 237164    0    0     0     0 73804 80068 51  6 42  0  1
[ 2017/05/02 08:11:56 ] 1  0      0 6938976  20204 237164    0    0     0     0 78895 85601 48  7 44  0  1
[ 2017/05/02 08:11:57 ] 4  0      0 6938792  20212 237164    0    0     0    12 78680 85892 49  7 43  0  1

まとめ

並列度を高めてaws s3コマンドのパフォーマンスを上げたいときには、非常に効果の高いオプションであることが確認できました。ご利用の際には、環境に合わせた形で調整しつつご利用いただければと思います。

どこかの誰かのお役に立てば嬉しいです。