🐕
S3とDynamoDBの読み込み速度を調べる(lambdaで)
はじめに
S3もDynamoDBも無料枠があり、小さなテキストを格納する場合どちらも利用できます。
自分はS3しか利用していなかったのですが、DynamoDBはレイテンシーに優れているとして、AWSのベストプラクティスによく出てきます。
一体どれくらい早いの?
ということが気になって調べてみました。
結論
S3の読み取り平均時間 0.14秒
DynamoDBの読み取り平均時間 0.03秒
なので、S3の4倍くらい早い
環境や条件、コードなど
測った時間 2021/11/10 21:00~21:05JST
lambda デフォルト(メモリ 128MB)
DynamoDBの設定
キャパシティーモード プロビジョンド
読み込みキャパシティーの Auto Scaling オフ
プロビジョンされた読み込みキャパシティーユニット 5
書き込みキャパシティーの Auto Scaling オフ
プロビジョンされた書き込みキャパシティーユニット 5
テーブルの中身
client_id | NewValue2 |
---|---|
s | z |
読み込みキャパシティユニット5なら、一回あたり20KBの読み込みができるはずです。
この小さなテーブルなら、読み込み一回分の時間が計測できているというつもりでいます。
DynamoDB読み込みコード
import time
import boto3
from boto3.dynamodb.conditions import Key, Attr
dynamodb = boto3.resource('dynamodb')
def lambda_handler(event, context):
# 開始時間
start_time = time.time()
table_name = "device_properties"
partition_key = {"client_id": "s"}
dynamotable = dynamodb.Table(table_name)
res = dynamotable.get_item(Key=partition_key)
item = res["Item"]
# 終了時間
end_time = time.time()
print("経過時間")
print(end_time-start_time)
return item
10回計測した結果
0.1777
0.0192
0.0045
0.0135
0.0114
0.0059
0.0182
0.0094
0.0169
0.0045
S3の設定
バージョニング オフ
暗号化 オフ
リージョン 東京
オブジェクトサイズは1KB
S3読み込みコード
import boto3
import time
BUCKET_NAME = 'test43245'
OBJECT_KEY_NAME = 's.txt'
s3 = boto3.resource('s3')
def lambda_handler(event, context):
# 開始時間
start_time = time.time()
bucket = s3.Bucket(BUCKET_NAME)
obj = bucket.Object(OBJECT_KEY_NAME)
response = obj.get()
body = response['Body'].read()
# 終了時間
end_time = time.time()
print("経過時間")
print(end_time-start_time)
return body
10回計測した結果
0.2805
0.1945
0.2005
0.1903
0.0369
0.1984
0.0323
0.0319
0.1843
0.0235
おわりに
最小サイズでの取得を試してみました。この条件ならDynamoDBがかなり早いみたいです。
このレイテンシーを活かしてみたいですね。
DynamoDBを使ったことがなかったのでいい経験になりました。
参考リンク
Discussion