« Skypeなどでマイクの感度が悪いときの設定メモ | メイン | 夜型エンジニアが朝会社に来てすぐ作業に取り掛かるコツ »

2008年11月29日

Amazon SimpleDB のパフォーマンス測定メモ あとで読む

Amazon EC2 を本格的に使おうかと考えて、いろいろ調べている中で Amazon SimpleDB のパフォーマンス測定などをしてみました。


Amazon SimpleDB とは、スキーマ定義が不要な Web データベースです。
アイテム名とその属性名・属性値のペアでデータベースに情報を格納するだけでインデックス化され、いろいろな Query により格納したアイテムを検索することができます。

Amazon のページにある例だと、次のテーブルのようなイメージですね。SimpleDB ではテーブルに該当するものをドメインと呼びます。

105385110._V1309942_.gif


属性の型も一定である必要はなく(あるアイテムは数値、あるアイテムは文字列とかもOK)、またあるアイテムのある属性に複数の値を格納することもできます(それぞれ独立した属性値として検索できる)


この SimpleDB は REST API や SOAP から制御します。
そのため、Amazon S3 と同じく EC2 から利用する必要はありません。
が、Amazon EC2 から使うと「高速に」アクセスできる、という噂もあり、EC2 とセットで試してみました。

EC2 は一番小さな Small Instance を利用し、アイテムの追加、アイテムの取得、アイテムの検索、アイテムの削除を行ってみました。


結果は以下の通り。1000リクエストあたりの処理時間(秒・平均値)です。
アイテムは、属性を 3 つ持たせた合計 100バイトほどの小さなものを利用しました。
また検索は、[属性値 > 数値] という単純なものを用いています。


・アイテムの追加 - 116 sec
・アイテムの取得 - 23 sec
・アイテムの検索 - 29 sec
・アイテムの削除 - 107 sec


この数値を見ると、リアルタイムなアプリケーションでガリガリ(たとえばセッション情報の管理とか)というほど速くはないですね。
ただ、REST API なので、ソケットを非ブロックモードで開いて並列にクエリを投げるなどの工夫をすることで、もう少しクリティカルな用途にも使える可能性があると思います。


なお、REST API は単純に file_get_contents() で実施したのですが、https://sdb.amazonaws.com/ への https 接続のオーバーヘッドだけを測定してみると、1000リクエストあたり 15 秒かかっていることがわかりました。EC2以外のサーバーからより速いことは確かです。

データ量が少ないので微妙ではありますが、このパフォーマンスを念頭において設計するといろいろと使い道があると思います。

永続ストレージサービスである Amazon EBS も同時にはひとつのインスタンスにしか接続できないので、複数インスタンスからガンガン使える SimpleDB はそれはそれとして便利ではあると思うので。


ということで参考になれば。


あと、テストで使ったPHPのサンプルコードも晒しておきます。
Amazon が配布しているサンプルコードから必要なところだけを抜き取っただけの適当なものですが、簡単にアクセスできるのが分かるかと思いますので。


まず、こんな関数を用意しておいて・・・

function send_sdb_request($params){

    $access_key = "<< AWS Access ID >>";
    $secret_key = "<< AWS Secret Key >>";
    
    $params["AWSAccessKeyId"] = $access_key;
    $params["SignatureVersion"] = 1;
    $params["Timestamp"] = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time());
    $params["Version"] = "2007-11-07";
    
    uksort($params, 'strcasecmp');
    $data = "";
    $query = "";
    foreach ($params as $parameterName => $parameterValue) {
        $data .= $parameterName . $parameterValue;
        if ($query) $query .= "&";
        $query .= $parameterName . "=" . urlencode($parameterValue);
    }
    $signature = base64_encode(hash_hmac('sha1', $data, $secret_key, true));
    $url = "https://sdb.amazonaws.com/?" .  $query . "&Signature=" . urlencode($signature);
    return file_get_contents($url);
}


ドメイン(テーブルみたいなもの)を作成するにはこんな感じ。

function createDomain($domain){

    $params = array(
        "Action" => "CreateDomain",
        "DomainName" => $domain
    );
    return send_sdb_request($params);
}
$result = createDomain("MyDomain");


検索するにはこんな感じ。

function query($domain, $expression){

    $params = array(
        "Action" => "Query",
        "DomainName" => $domain,
        "QueryExpression" => $expression
    );
    return send_sdb_request($params);
}
$result = query("MyDomain", "['price' > '800']");


その他のリクエストについては Amazon のマニュアル を見てください。

投稿者 aka : 2008年11月29日 17:40  / 2008年11月 / 開発系

トラックバック

人気ブログランキング - a++ My RSS 管理人ブログ

このエントリーのトラックバックURL:
http://133.242.136.64/mt-tb-sf.cgi/711

このリストは、次のエントリーを参照しています: Amazon SimpleDB のパフォーマンス測定メモ:

» Amazon Simple DBのPHPライブラリー(簡単な方)のテスト from twk @ ふらっと
新機能について、あらたにDBを導入しようと思い、Amazon Simple DBを試してみました。 申し込みは、awsの申し込みが済んでいれば、使用開始の... [続きを読む]

トラックバック時刻: 2010年04月16日 14:21

コメント

コメントしてください

あわせて読みたい




保存しますか?