CouchDBをメンテナンスするために作成したlscouchdbのパフォーマンスを考えてみました。
対象はDTI VPSにホスティングしているサーバー上のCouchDB 1.0.2です。
lscouchdbをコピーしてloopbackのCouchDBのポートに直接接続しているので、計測したデータの大部分はサーバのCPUとDisk I/Oのパフォーマンスに依存しています。
テストの概要
次のようなイディオムを使って、郵便番号DBに入っているView定義によるインデックス分を除く全データ(約220MB、約12万件)のコピーを作成しています。
$ sbin/mkdb testp
$ time bin/lsdocs postal -u 15 | grep -v "_design/" | bin/postdocs -u 15 testp
$ sbin/rmdb testp
何回か-u 15の数字を増やして様子をみてみます。
PhenomII X4 940 (Mem: 8GB)での結果
物理メモリの半分ほどはファイルキャッシュに使われていて、今回のデータは十分この範囲に収まるようになっています。手元のPCを使った場合の結果は次のようになりました。
real 18m13.589s
user 1m3.160s
sys 0m8.400s
real 17m43.949s
user 1m7.320s
sys 0m8.520s
real 61m45.391s
user 1m12.870s
sys 0m12.770s
読み出し単位を4倍にして時間が1/4になっているので、読み出し回数は低く抑える方が良さそうです。
ちなみにDTI@VPSのエントリーレベル(256MB)で実行すると次のようになります。 Muninで観察している範囲では使用メモリは、この時間帯は180-190MBの範囲で遷移していました。
real 22m51.496s
user 0m46.429s
sys 0m4.081s
ポイントは読み込み処理の効率化らしい
結局のところはデータを保存するパフォーマンスよりも、読み出しの単位を効率的なところにおさめるのが必要そうです。PhenomII X4 940 8GBで、データを取ってみました。
50〜3000件を一度に取得するようなコマンドラインの実行時間をtimeコマンドで取って、real時間をグラフにしてみました。
$ i=50; time bin/lsdocs postal -u $i -p 1 > /dev/null
/_all_docsの効率的な数字は環境によるはずですが、1秒辺りの処理件数は2000件で最高の836件になったので、2000前後にしておくのが良さそうです。
ここら辺を踏まえつつ、どうせ読み込み時間が線形に伸びるなら大きな数字にしてしまえと、やった結果が次のようになりました。
real 5m4.372s
user 0m59.750s
sys 0m6.710s
書き込みの単位を増やしても、ほとんど影響がみられませんでした。
real 4m57.758s
user 0m54.100s
sys 0m6.500s
Proxy的な中間層がある場合の処理
注意しなければならないのは、今回の作業はバックエンドに直接接続しているということです。
これがstunnelなどを介している場合には、中間層のオーバーヘッドが問題になって時には処理が滞留することもあります。
読み出し側はだいたい10%程度のパフォーマンスダウンですが、書き込み時の単位を50件にすると処理は進みません。
手元の環境では25程度の書き込みにしないとCouchDBへの書き込みが発生しませんでした。
real 12m5.389s
user 1m36.620s
sys 0m7.260s
0 件のコメント:
コメントを投稿