Mountpoint for Amazon S3のパフォーマンス検証

AWS

2023.12.13

Topics

はじめに

こんにちは!第一SAチームのshikaです。
この記事はNHN テコラス Advent Calendar 2023の13日目の記事です。

2023年8月に一般公開となったMountpoint for Amazon S3のパフォーマンスを調査してみたので執筆いたしました。

Mountpoint for Amazon S3について

Mountpoint for Amazon S3は、S3をLinuxにマウントし、バケット内のオブジェクトに対しLinuxファイルシステムでアクセスを可能にするファイルクライアントです。

<参考リンク>
Mountpoint for Amazon S3 – 一般公開されており、本番環境のワークロードにも対応可能

以前からs3fsというツールを用いてS3のマウントは可能でしたが、性能の面で課題があり、非推奨となっていました。

上記のドキュメントによると、Mountpoint for Amazon S3では、EC2インスタンスとS3間の伝送速度である最大100Gbpsのスループットが利用可能です。

パフォーマンス – マウントポイントは、各 EC2 インスタンスと S3 間の最大100 GB/秒のデータ転送など、S3が提供する柔軟なスループットを活用できます。

ただし、あくまで最大値なので、EC2とS3間のネットワークトラフィックの状況や選択するEC2インスタンスタイプによって、実際のパフォーマンスは異なります。

例えば、t3.mediumインスタンスを使用する場合、ネットワークの最大速度が5Gbpsに制限されているため、この部分がボトルネックとなる可能性があります。

また、シンボリックリンクやファイルロックがサポートされていない点には注意が必要です。

Amazon EFSの代替としての利用も考えられましたが、複数のインスタンス間でファイルの整合性を維持する必要があるユースケースには適していないようです。

導入

公式ドキュメント Mountpoint for Amazon S3 の使用 の手順に従ってS3をマウントしてみます。

詳細は割愛しますが、S3作成後、マウントしたいサーバ上で以下のコマンドを実行するだけ簡単にマウントが可能です。

$ wget https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm
$ sudo yum install ./mount-s3.rpm
$ mkdir /path/to/mount(任意)
$ mount-s3 バケット名 /path/to/mount

検証

環境

  • EC2のインスタンスタイプはc5.large(ネットワーク帯域幅は最大10Gbps)
  • EC2-S3間はインターネット経由

検証方法

fioコマンドは動作が不安定だった(コマンドがエラーになったりならなかったり)ので使用せず、簡単なスクリプトを用意して以下を検証しました。

ファイル書き込み速度

・1KBのファイル10個の作成速度
・1MBのファイル10個の作成速度
・10MBのファイル10個の作成速度
・100MBのファイル10個の作成速度

ファイル読み込み速度

・1KBのファイル10個の出力速度
・1MBのファイル10個の出力速度
・10MBのファイル10個の出力速度
・100MBのファイル10個の出力速度

Mountpoint for Amazon S3は、デフォルトでは1秒間メタデータとオブジェクトをキャッシュするようになっています。この仕様を踏まえ、実際のアプリケーションでの使用を想定して、連続して10個のファイルを作成、または出力するスクリプトを作成しました。

具体的なスクリプトは以下の通りです。

・create_file.sh 引数1(ファイルサイズ)

引数に指定したサイズ数のダミーファイルを10個作成し、それにかかった時間を計測。


#!/bin/bash

FILE_SIZE=$1

START_TIME=$(date +%s.%N) # 開始時間
# ファイルを10個生成
for ((i = 1; i <= 10; i++))
do
# ddを使用してファイルに書き込む
dd if=/dev/zero of="./s3/dummy$i" bs=$FILE_SIZE count=1 2>/dev/null
done
END_TIME=$(date +%s.%N) # 終了時間
TOTAL_WRITE_TIME=$(echo "$END_TIME - $START_TIME" | bc) # 終了時間と開始時間の差を計算

echo "$FILE_SIZEのファイル10個の作成にかかった時間:$TOTAL_WRITE_TIME秒"

・read_file.sh

特定ディレクトリ内のファイルを一つずつcatコマンドで出力し、それにかかった時間を計測。


#!/bin/bash

cd ./s3

FILE_SIZE=$(ls -lh dummy1 | awk '{print $5}')
FILE_COUNT=$(find ./ -type f | wc -l)

START_TIME=$(date +%s.%N)
for file in ./*
do
cat "$file" > /dev/null
done
END_TIME=$(date +%s.%N)
TOTAL_READ_TIME=$(echo "$END_TIME - $START_TIME" | bc)

echo "$FILE_SIZEのファイル10個の読み取りにかかった時間:$TOTAL_READ_TIME秒"

以下実行例です。


[root@ip-11-1-1-32 mount-test]# tree
.
├── s3  ← S3をマウントしているディレクトリ
└── script
├── create_file.sh
├── delete_file.sh
└── read_file.sh
2 directories, 3 files
[root@ip-11-1-1-32 mount-test]#
[root@ip-11-1-1-32 mount-test]#
[root@ip-11-1-1-32 mount-test]# ./script/create_file.sh 1K
1Kのファイル10個の作成にかかった時間:1.658998951秒
[root@ip-11-1-1-32 mount-test]#
[root@ip-11-1-1-32 mount-test]# ./script/read_file.sh
1.0Kのファイル10個の読み取りにかかった時間:1.366211161秒

結果

以下の表に各検証パターン5回の実行結果と平均をまとめました。

オブジェクトストレージなので小さいファイルの読み書きは苦手なようですが、100MB以上のサイズの大きいファイルの書き込み処理はEBSより高速でした!
(読み取りにはかなり時間がかかりました。)

参考としてEBSの結果も載せておきます。

また、以下のような手段を講じることで、データの処理速度と安定性が向上させることが可能かと思います。

・EC2のインスタンスタイプを大きなものへと変更する
・VPCエンドポイント経由でS3に接続する

まとめ

Mountpoint for Amazon S3は、s3fsよりかなり高速なっており、使い方によっては非常に便利なツールとなりそうです。

得手不得手はあるので、適切な利用シーンを見極め最大限に活用していきたいと思います。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら