Edited at

PHPからのDynamoDBアクセスを高速化する

More than 3 years have passed since last update.

このドキュメント(Performance Guide)を見ていて、何かDynamoDBのアクセスをチューニングできないかと思って試してみたメモです。

試してみたのは、 下記の3種類とその組み合わせです。


  1. pecl の uri_templateを入れてみる

  2. validation を falseにしてみる

  3. http接続にする (httpsをやめる)

(httpにすると早くなるらしいというのは、どこかで見かけたのだけど、覚えてない…)


テスト内容


  • $client->getItem() で 1件取得 を1000回繰り返して、1件ごとに消費した秒数の平均を計算

  • Read Capacityは予め多めにしておく。


結果

パターン
平均秒数

normal
0.282

uri_template
0.262

validation=false
0.268

scheme=http
0.087

uri_template と、validation = false は少し早くなりました。

が、断然早くなったのは、「http接続にする」で、約3.2倍の速度がでました。

次に、上記の組み合わせで試してみました。

パターン
平均秒数

scheme=http, uri_template
0.058

scheme=http, uri_template, validation=false
0.056

http接続+uri_template にすると、通常の4.8倍程度の速度になりました。

validation=falseも組み合わせてみましたが、あまり変わらず。

何度か試していると逆に遅くなるケースもあり、誤差の範囲のようです。

DynamoDB-Performance-Test.png


コード


http接続にする

$client = Aws\DynamoDb\DynamoDbClient::factory(array(

'region' => 'ap-northeast-1',
'scheme' => 'http',
));


validation を offにする

$client = Aws\DynamoDb\DynamoDbClient::factory(array(

'region' => 'ap-northeast-1',
'validation' => false
));


uri_template

$ sudo pecl install uri_template

$ sudo echo "extension=uri_template.so" > /etc/php.d/uri_template.ini


まとめ


  • http接続 + uri_template にすると、通常の4.8倍くらいになるよ。

  • 当然ながら暗号化されないので、ご利用は自己責任で。


追記(2015/03/07)

DynamoDBへのアクセスに 200ミリsecとかかかってて、遅すぎじゃね?と思って調べたら、

Aws\DynamoDb\DynamoDbClient::factory でインスタンス生成して、初回のgetItemのみ、200msくらいかかって、それ以降は数msになった。

0.228

0.007
0.013
0.013
0.01
0.007
0.015
0.013
0.012
0.018

https でも http でも同様に2回め以降は 数msから数10msの範囲だったので、ほぼ差はみられなかった。

「初回の遅さ」が何に起因しているのか調査が必要。