Basho Riakが遅すぎる件について
NoSQLの中でも,耐障害性・無単一障害点などの点から本命だと思っていたRiakなんですが,RESTなAPIでベンチマークを取ってみると,とてつもなく遅いことが分かって困っています.
5年前のノートPCを使ったのでハードが余りにも貧弱という可能性はあるのですが,とりあえず結果だけ残そうと思います.
ベンチマークプログラムは,ライブラリPOCOを使ったソケット通信をやる感じで,
Riak用は次のような感じです.
// HTTP module version // g++45 riak_bench2.cc -o riak_bench2 -I/usr/local/include -L/usr/local/lib -lPocoFoundation -lPocoNet -g -fopenmp -Wall #include "basic_header.h" int main(int argc, char *argv[]) { int suc = 0, i; time_t start, set_end, get_end; int n = omp_get_max_threads(); vector<Poco::Net::HTTPClientSession *> pool(n); Poco::Net::SocketAddress server("192.0.0.1", 8098); for(vector<Poco::Net::HTTPClientSession *>::iterator i=pool.begin(); i!=pool.end();++i){ *i = new Poco::Net::HTTPClientSession(server); (*i)->setKeepAlive(true); } start = time(NULL); #pragma omp parallel for shared(suc,i) for(i=0;i<MAX_LOOP;++i) { Poco::Net::HTTPClientSession *client=pool.at((int)(i/(MAX_LOOP/n))); Poco::MD5Engine con; string key, val; size_t sent_len, recv_len; set_key_val(con, (int)(i/REP), key, val); char write_buffer[BUFFER_SIZE], read_buffer[BUFFER_SIZE]; snprintf(write_buffer, BUFFER_SIZE, "/riak/test/%s",key.c_str()); Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_PUT, write_buffer, Poco::Net::HTTPMessage::HTTP_1_1); Poco::Net::HTTPResponse res; req.setHost(client->getHost(), client->getPort()); req.setContentLength(val.size()); req.setContentType("text/plain"); std::ostream &requestStream = client->sendRequest(req); requestStream<<val; std::istream & responseStream = client->receiveResponse(res); if (res.getStatus() != Poco::Net::HTTPResponse::HTTP_OK && res.getStatus() != Poco::Net::HTTPResponse::HTTP_NO_CONTENT) { fprintf(stderr, "set: %s: riak error %s\n", key.c_str(), res.getReason().c_str()); }else { ++suc; } } set_end = time(NULL); #pragma omp parallel for shared(suc, i) for(i=0;i<MAX_LOOP;++i){ Poco::Net::HTTPClientSession *client=pool.at((int)(i/(MAX_LOOP/n))); Poco::MD5Engine con; string key, val; int sent_len, recv_len; set_key_val(con, (int)(i/REP), key, val); char read_buffer[BUFFER_SIZE]; std::string write_buffer; char confirm_buffer[BUFFER_SIZE]; write_buffer = "/riak/test/"+key+"?r=1"; Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, write_buffer, Poco::Net::HTTPMessage::HTTP_1_1); Poco::Net::HTTPResponse res; req.setHost(client->getHost(), client->getPort()); req.add("Accept","*/*"); req.add("User-Agent","Firefox9.0"); std::ostream &requestStream = client->sendRequest(req); std::istream &responseStream = client->receiveResponse(res); size_t total_len = val.size(); recv_len = res.getContentLength(); std::ostringstream readBuffer; Poco::StreamCopier::copyStream(responseStream, readBuffer); if(recv_len!=0){ if(recv_len == val.size()) { if (val != readBuffer.str()) { printf("get: %s(%d bytes): riak error: %s(%d bytes)\n", val.c_str(),val.size(), readBuffer.str().c_str(),readBuffer.str().size()); }else { ++suc; } }else { cout<<"receive length["<<recv_len<<"] != expected length["<<val.size()<<"]"<<endl; } }else { cout<<"response size="<<recv_len<<endl; } } #include "basic_footer.h" return(0); }
stringsクラスやchar*をいろいろ使っていることは特に意味はありません.色々変化させても同じでした.
確かに,Riakは同時アクセス数が増えるとどんどん速くなっています.しかし,RiakのRESTインターフェースは読み込みが書き込みの5倍から10倍遅い,ましてやRedisと比べると,読み書きが1スレッドの場合,1000倍もRiakが遅い...
それでもRiakのサイト
http://wiki.basho.com/
では強気の発言がありますし,似たプロダクトを評価したサイトの翻訳サイト
へ〜たのめも:Riak と Cassandra と HBase、あらまー! - livedoor Blog(ブログ)
を見ても,評価は高いようなので,引き続き調べてみようかと思います.
Calbee ポテトチップス 焙煎ラー油味
こいつはピリ辛で止まらなくなりますね...
飲み物必須でしょう.
辛い白ワインなんかが合いますよ.
原材料名は,「じゃがいも(遺伝子組み換えでない)」「植物油」「食塩」「唐辛子」「ガーリックパウダー」「還元水あめ」「コーンスターチ」「チキンパウダー」「デキストリン」「砂糖」「オニオンパウダー」「酵母エキスパウダー」「醗酵調味料(小麦を含む)」「粉末みそ」「チキンエキスパウダー」「乳糖」「粉末しょうゆ」「ごま」「フライドガーリックオイル」「ジンジャーパウダー」「ラー油」「調味料(アミノ酸等)」「パプリカ色素」「甘味料(ステビア)」等で,エネルギーは70グラム当たり388kcal,ナトリウムの食塩相当量は1.0グラムだそうです.
UQ WiMAX 1日利用プランを試してみた
長らくb-mobileを使っていたのですが,
b-mobile ホーム|スマホの月額料金を安く。世界初のMVNO-日本通信
b-mobileは年間プラン等が多く,150時間プランでも480日で使い切らないと失効してしまう等,速くて単発で使えるプランが無いため,UQ WiMAXを申し込んでみました.
単発ということで,24時間プランを試してみました.が,ちょっとややこしいです.
通常はこの辺から購入に進むのですが...
WiMAX製品を同時購入の場合(個人)|UQWiMAX|超高速モバイルインターネットWiMAX2+
私のノートPCはWiMAX対応なのでルータの購入は必要ないのですが,ルータ等を購入せずにプランだけ購入しようとすると,
と怒られます.
正解は,まずはノートPCに入っていた「インテルPROSET/Wireless WiMAX接続ユーティリティー」を立ち上げます.
そしてWebブラウザを立ち上げると,自動的にUQ WiMAXの契約画面が現れます.
この際,Firefoxだと
Operaでも
というようなエラー画面が出るので,仕方がなくIEを立ち上げます.
もしくは,FirefoxのアドオンのIE TAB等でもOKです.
UQ WiFiサービスは無料なので,忘れずに申し込みましょう.
クレジットカードで申し込むと,数秒で申込終了画面が現れ,
数分後にはメールで通知も届きます.
受付番号,UQ Wi-FI SSID,WEPキー,ログインID等が出ていたので念のために画面を保存しておいたのですが,全てメールでも届きました.
ちょっとハマったのがこの画面.申し込み終了とあるので,もう使えるのかと思ったら使えない.
申し込んだだけでは料金は一切取られず,その代わり一切ネットは使えないので,「ご利用時間の購入」が必要でした.
最初のクレジットカード番号入力は,単なる身分確認だったようです.
たまたまN700系新幹線に乗ったばかりだったので,JR東海のWiFiサービス画面が出ました.
試しに,UQ WiFiじゃなくてUQ WiMAXにつなぎ,下り速度を計ってみました.
2メガ?! 40メガじゃなかったのか!?
と思いつつ,使っていると,東海道新幹線はトンネルが多いので公衆無線は途切れまくりなので...仕方がなく新幹線内のUQ WiFiに繋ぎ変えました.
速度は当然落ちて,
82キロ...無いよりは遥かにマシって感じです.
WiFiとWiMAXが使えて24時間600円ってのは,かなりお得に感じました.