groonga / wikipedia-search

Wikipedia search system on Groonga families.
Creative Commons Zero v1.0 Universal
2 stars 2 forks source link

PGroongaとpg_trgmとtextsearchのベンチマークをとる #5

Closed kou closed 7 years ago

kou commented 7 years ago

英語版Wikipediaを使う。

kou commented 7 years ago

メモリー16GB+スワップ32GB+SSDの環境での結果。

PGroongaのインデックス作成時間がすごく遅かった。(約9.5時間。33869548.323 ms)

pg_trgmは約2.5時間(9308261.242 ms)

textsearchは文字列が長すぎてエラー。

en.all.txt

kou commented 7 years ago

textsearchのエラーは↓。(↑のログにある。)

ERROR:  string is too long for tsvector (1618908 bytes, max 1048575 bytes)
s-yata commented 7 years ago

DB 構築時間の参考になるかもしれないので,こちらに貼らせていただきます.

最新の Groonga にデータを投入するとき,およびに索引を静的構築するときのメモリ使用量を調べてみました.調査した環境は Ubuntu 16.04, RAM: 32GB,スワップなしで vm.overcommit_memory=0 です. DB は SSD 上に作成しました.

$ groonga --version
Groonga 6.1.0-16-g5ebb993 [linux-gnu,x86_64,utf8,match-escalation-threshold=0,nfkc,mecab,msgpack,mruby,onigmo,zlib,lz4,epoll]

configure options: < '--with-ruby=ruby' '--enable-mruby'>

screenshot from 2016-11-10 18-07-33

screenshot from 2016-11-10 18-19-13

構築された DB のサイズは 132GB でした.

$ du -h db
132G    db
kou commented 7 years ago

メモリー64GB+SSDの環境での結果。

日本語版Wikipedia全ページと英語版Wikipedia前ページの結果。りあえずテキストでまとめる。表にするとか見やすくするのは後で。

日本語版Wikipedia:

生データ:

データ:

データのロード時間:

データロード後のDBサイズ:

PGroongaインデックス作成時間:

PGroongaインデックスサイズ:(データ込み。zlib圧縮)

pg_bigmインデックス作成時間:

pg_bigmインデックスサイズ:

検索時間(同じ接続で5回連続で検索して1番速いやつ):

英語版Wikipedia:

生データ:

データ:

データのロード時間:

データロード後のDBサイズ:

PGroongaインデックス作成時間:

PGroongaインデックスサイズ:(データ込み。zlib圧縮)

pg_trgmインデックス作成時間:

pg_trgmインデックスサイズ:

textsearchインデックス作成時間:(本文全部を対象にすると失敗するので先頭1MBだけ)

textsearchインデックスサイズ:

検索時間(同じ接続で5回連続で検索して1番速いやつ):

kou commented 7 years ago

日本語版のまとめ。

環境:

CPU メモリー スワップ ストレージ OS
Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz (24コア) 64GiB 35GiB SSD(500GB) CentOS 7.2

バージョン:

PostgreSQL PGroonga pg_bigm
9.6.1 1.1.8 1.2-20161011

データ:

サイズ レコード数 タイトルの平均バイト数 本文の平均バイト数
約5.9GiB 約90万件 約21.6B 約6.7KiB

データロード:

時間 サイズ
約5分 約5GB

インデックス作成:

種類 時間 サイズ 備考
PGroonga 約21分 約9.8GB データもロードしている。データはzlibで圧縮している。
pg_bigm 約40分 約4.2GB maintenance_work_mem512MB

検索:

クエリー:テレビアニメ

種類 時間 件数 相対時間
PGroonga 約63ms 約2万件 約1.7
Groonga 約38ms 約2万件 1
pg_bigm 約2.8s 約2万件 約74

クエリー:データベース

種類 時間 件数 相対時間
PGroonga 約48ms 約1.5万件 約1.6
Groonga 約30ms 約1.5万件 1
pg_bigm 約1.3s 約1.5万件 約43

クエリー:PostgreSQL OR MySQL

種類 時間 件数 相対時間
PGroonga 約2ms 316件 約2
Groonga 約1ms 316件 1
pg_bigm 約47ms 311件 約47

クエリー:日本

種類 時間 件数 相対時間
PGroonga 約600ms 約53万件 約11
Groonga 約53ms 約53万件 1
pg_bigm 約504ms 約53万件 約10
kou commented 7 years ago

英語版のまとめ。

環境:

CPU メモリー スワップ ストレージ OS
Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz (24コア) 64GiB 35GiB SSD(500GB) CentOS 7.2

バージョン:

PostgreSQL PGroonga
9.6.1 1.1.8

データ:

サイズ レコード数 タイトルの平均バイト数 本文の平均バイト数
約33GiB 約530万件 約19.6B 約6.4KiB

データロード:

時間 サイズ
約26分 約21GB

インデックス作成:

種類 時間 サイズ 備考
PGroonga 約1時間38分 約39GB データもロードしている。データはzlibで圧縮している。インデックスのみだと約21GB。
pg_trgm 約1時間52分 約7.8GB maintenance_work_mem512MB
textsearch N/A N/A 「string is too long for tsvector (1618908 bytes, max 1048575 bytes)」というエラーがでてインデックスを作成できない。
textsearch(先頭1M文字のみ) 約4時間12分 約11GB maintenance_work_mem512MB

検索:

クエリー:animation

種類 時間 件数 相対時間 備考
PGroonga 約176ms 約4万件 約22
Groonga 約8ms 約4万件 1
pg_trgm 約44s 約3万件 約5500
textsearch 約1s 約42万件 約125 件数が1桁多いのはステミングして「anim」で検索しているから

クエリー:database

種類 時間 件数 相対時間
PGroonga 約668ms 約21万件 約37
Groonga 約18ms 約21万件 1
pg_trgm 約33s 約13万件 約1833
textsearch 約649ms 約19万件 約36

クエリー:PostgreSQL OR MySQL

種類 時間 件数 相対時間
PGroonga 約4ms 1636件 約1.3
Groonga 約4ms 1636件 約1.3
pg_trgm 約227ms 1484件 約57
textsearch 約3ms 1506件 1

クエリー:America

種類 時間 件数 相対時間
PGroonga 約1.3s 約47万件 約31
Groonga 約42ms 約47万件 1
pg_trgm 約1m32s 約141万件 約2190
textsearch 約1.3s 約48万件 約31
s-yata commented 7 years ago

メモリ使用量について気になったので, RAM 128GB の環境で追試してみました. load によるデータ投入(索引なし)では,メモリ上にすべて収まるようです. 静的索引構築では約 50% まで増えて落ち着くようです.

screenshot from 2016-11-14 13-36-04

screenshot from 2016-11-14 13-36-24

RAM 32GB の環境でも 50% で頭打ちになっていたので, OS により 50% で制限されているのだと思います. 怪しいのは以下です.

vm.overcommit_memory = 0
vm.overcommit_ratio = 50
kou commented 7 years ago

ありがとうございます! 物理メモリーがあるともっとメモリーを使って頑張るということですね。

kou commented 7 years ago

メモリー32GBの環境で再試した。再試の理由は英語版Wikipediaをコンテンツページだけにすると、1MiB未満のバイト数におさまりそうだったからである。おさまるならsubstringする必要はない。

で、substringなしにしてみたらエラーにならなかった。

また、maintenance_work_memをさらに増やすと効果があるかを測定するためである。512MBから2GBに増やしたがあまり変わらなかった。

en.all.txt

PGroongaのインデックス構築時間がpg_trgmより遅かったのでそれは再測定する。理由は64GBの環境だとPGroongaの方が速かったからである。

kou commented 7 years ago

静的索引構築時にPostgreSQLのメモリープールを細かく解放するようにしたら使用メモリーが素のGroongaと同じくらいになった。

kou commented 7 years ago

PGroongaのインデックス作成時間を再測定した。5041785.782 ms(1時間24分)なので15分くらい速くなった。

↑↑にtextsearchの検索結果が入っていなかったのでそれも再測定した。

en.all.pgroonga.txt

kou commented 7 years ago

日本語版も再測定した。

maintenance_work_memを2GBにしたらpg_bigmのインデックス構築時間が速くなった。4o分→33分

PGroongaは多少速くなった。21分→18分

ja.all.txt

kou commented 7 years ago

再:日本語版のまとめ。

環境:

CPU メモリー スワップ ストレージ OS
Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz (24コア) 32GiB 2GiB SSD(500GB) CentOS 7.2

バージョン:

PostgreSQL PGroonga pg_bigm
9.6.1 1.1.8+α 1.2-20161011

データ:

サイズ レコード数 タイトルの平均バイト数 タイトルの最長バイト数 本文の平均バイト数 本文の最長バイト数
約5.9GiB 約90万件 約21.6B 250バイト 約6.7KiB 約677KiB

データロード:

時間 サイズ
約5分 約5GB

インデックス作成:

種類 時間 サイズ 備考
PGroonga 約19分 約9.8GB データもロードしている。データはzlibで圧縮している。
pg_bigm 約33分 約4.2GB maintenance_work_mem2GB

検索:

クエリー:テレビアニメ

種類 時間 件数 相対時間
PGroonga 約65ms 約2万件 約1.1
Groonga 約38ms 約2万件 1
pg_bigm 約2.8s 約2万件 約48

クエリー:データベース

種類 時間 件数 相対時間
PGroonga 約49ms 約1.5万件 約1.6
Groonga 約31ms 約1.5万件 1
pg_bigm 約1.3s 約1.5万件 約41

クエリー:PostgreSQL OR MySQL

種類 時間 件数 相対時間
PGroonga 約2ms 316件 約2
Groonga 約1ms 316件 1
pg_bigm 約49ms 311件 約49

クエリー:日本

種類 時間 件数 相対時間
PGroonga 約563ms 約53万件 約10
Groonga 約59ms 約53万件 1
pg_bigm 約479ms 約53万件 約8
kou commented 7 years ago

再:英語版のまとめ。

環境:

CPU メモリー スワップ ストレージ OS
Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz (24コア) 32GiB 2GiB SSD(500GB) CentOS 7.2

バージョン:

PostgreSQL PGroonga
9.6.1 1.1.8+α

データ:

サイズ レコード数 タイトルの平均バイト数 タイトルの最長バイト数 本文の平均バイト数 本文の最長バイト数
約33GiB 約530万件 約19.6B 211バイト 約6.4KiB 約1MiB(1047190B)

データロード:

時間 サイズ
約26分 約21GB

インデックス作成:

種類 時間 サイズ 備考
PGroonga 約1時間24分 約39GB データもロードしている。データはzlibで圧縮している。インデックスのみだと約21GB。
pg_trgm 約1時間50分 約7.6GB maintenance_work_mem2GB
textsearch 約2時間53分 約12GB maintenance_work_mem2GB。インデックスできない単語が3923個ある。(*)

(*) エラーメッセージ:

NOTICE:  word is too long to be indexed
DETAIL:  Words longer than 2047 characters are ignored.

本文の最大バイト数が1047190Bで1MiB - 1(1048576B)にギリギリ収まっている。これを超えると以下のエラーメッセージがでてインデックスを作成できない。

string is too long for tsvector (1618908 bytes, max 1048575 bytes)

検索:

クエリー:animation

種類 時間 件数 相対時間 備考
PGroonga 約173ms 約4万件 約29
Groonga 約6ms 約4万件 1
pg_trgm 約44s 約3万件 約7333
textsearch 約1s 約42万件 約167 件数が1桁多いのはステミングして「anim」で検索しているから

クエリー:database

種類 時間 件数 相対時間
PGroonga 約698ms 約21万件 約37
Groonga 約19ms 約21万件 1
pg_trgm 約33s 約13万件 約1736
textsearch 約602ms 約19万件 約32

クエリー:PostgreSQL OR MySQL

種類 時間 件数 相対時間
PGroonga 約6ms 1636件 約2
Groonga 約3ms 1636件 1
pg_trgm 約241ms 1484件 約80
textsearch 約3ms 1506件 1

クエリー:America

種類 時間 件数 相対時間
PGroonga 約1.3s 約47万件 約29
Groonga 約45ms 約47万件 1
pg_trgm 約1m32s 約141万件 約2044
textsearch 約1.2s 約48万件 約26
kou commented 7 years ago

公式サイトにまとめた。