このドキュメント(Performance Guide)を見ていて、何かDynamoDBのアクセスをチューニングできないかと思って試してみたメモです。
試してみたのは、 下記の3種類とその組み合わせです。
- pecl の uri_templateを入れてみる
- validation を falseにしてみる
- 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も組み合わせてみましたが、あまり変わらず。
何度か試していると逆に遅くなるケースもあり、誤差の範囲のようです。
コード
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の範囲だったので、ほぼ差はみられなかった。
「初回の遅さ」が何に起因しているのか調査が必要。