JAWS-UG 浜松 AWS 勉強会 2021#6 2021/06/25
EFS への書き込み速度を上げる(小ネタ)JAWS-UG 浜松 AWS 勉強会 2021#6 2021/06/25まつひさ(hmatsu47)
View Slide
自己紹介松久裕保(@hmatsu47)https://qiita.com/hmatsu47名古屋で Web インフラのお守り係をしています(ほかに書くことがなくなったので省略)2
今日の内容● EFS とは● EFS は書き込みが遅い○ Amazon Linux 2 の /usr/ を普通に rsync■ 1 ゾーンで約 15 倍、標準(1 リージョン)で約 29 倍遅い● 処理を並列化してみると…○ xargs を使って並列で rsync■ 1 インスタンスの EC2 からのアクセスでも高速化が可能3
EFS とは● フルマネージドの分散・共有ファイルシステム○ https://aws.amazon.com/jp/efs/● NFSv4 プロトコルでアクセス可能○ NFS v4.0 および v4.1 をサポート● 高可用性・高耐久性○ 1 ゾーンストレージクラスと標準ストレージクラス■ 1 ゾーン内または 1 リージョン内で冗長化○ 耐久性は 99.999999999%4
EFS の弱点● とにかく書き込みが遅い○ 分散・共有ファイルシステムなので…● 例えば、Amazon Linux 2 で普通に rsync してみると○ m5.large で /usr/(1.1GB)から別のファイルシステムにコピーrsync -avz /usr/ /mnt/【コピー先】/usr/○ 対 EBS(gp3 IOPS:3000) : 00 分 54 秒○ 対 EFS(1 ゾーン・バースト) : 13 分 51 秒(15.4 倍遅い)○ 対 EFS(標準・同) : 25 分 58 秒(28.9 倍遅い)5
処理を並列化してみる● rsync を xargs と組み合わせるls -1 /usr | xargs -I {arg} -P 【並列数】 -n 1 rsync -avz /usr/{arg}/mnt/【コピー先】/usr/6コピー先 通常(1 並列) 2 並列 4 並列EBS(gp3 IOPS:3000) 00:54 - 00:42 - 00:39 -EFS(1 ゾーン・バースト) 13:51 15.4 倍遅い 09:09 13.1 倍遅い 06:23 9.8 倍遅いEFS(標準・同) 25:58 28.9 倍遅い 16:35 23.7 倍遅い 11:28 17.6 倍遅い
処理を並列化してみる7
補足など● 並列数をもっと増やすとさらに高速化する○ m5.large (2vCPU)のように vCPU 数の少ないインスタンスでも 10 ~ 16 並列ぐらいは行ける■ /usr/ 直下のディレクトリの数が少なく中のファイル容量や数のバランスが悪いので今回は 4 並列まで(バランスが良いと線形に性能向上する)● 一部の NFS クライアントでは並列化の効果が出ない○ RHEL 6 など○ 処理を直列化してしまうため8
参考:読み取り(find)並列化● 通常 : find -type f -exec cat {} \;● 並列 : find -type f -print0 | xargs -0 -I {arg} -P 【並列数】 -n 1 cat {arg}※都度 OS を再起動し、OS のディスクキャッシュがクリアされた状態で計測9読み取り対象通常(1 並列)2 並列 4 並列 8 並列EBS(gp3 IOPS:3000) 00:46 00:24 00:17 00:16EFS(1 ゾーン・バースト) 02:43 01:05 00:36 00:28EFS(標準・同) 02:47 01:10 00:35 00:26
参考:読み取り(find)並列化10
まとめ● 処理を並列化すると速くなる○ 1 インスタンスからのアクセスでも○ vCPU 数が少なくても■ 一部 OS で速くならない点には注意● 書き込みと読み取りでは少し傾向が違う○ EBS との差は読み取りのほうが小さい○ 読み取りでは 1 ゾーンと標準の性能差はない■ 帯域の上限に達するまでは11