Hiroyuki Sato
hiroy****@gmail*****
2015年 8月 26日 (水) 22:02:39 JST
佐藤です。
下記のことについて教えて下さい。
質問概要
1, groonga-clientでread_timeoutを伸ばす方法
2, クエリのどの部分に時間がかかっているか確認する方法
3, syscall error 'sendmsg' (Protocol wrong type for socket)[41] について
4, クエリのselect時にunlimitedで全件取得というのは可能でしょうか?
概要
groonga-clientを使って、groongaに検索をして結果を取得しています。
できの悪いクエリですが、遅くても良いのでタイムアウトしないで(とりあえず)検索を
できるようにしたいと思っています。
今困っているのは、ヒットする件数が多いクエリだと次のように、タイムアウトをしまうことがあることです。
/path/to/groonga-client-0.1.8/lib/groonga/client/protocol/http/synchronous.rb:54:in
`rescue in send': Net::ReadTimeout
(Groonga::Client::Protocol::WrappedError)
from /path/to/groonga-client-0.1.8/lib/groonga/client/protocol/http/synchronous.rb:36:in
`send'
from /path/to/groonga-client-0.1.8/lib/groonga/client/protocol/http/thread.rb:39:in
`block in send'
なお検索内容を全部掲載することはできないですが、
概ね次のようなクエリを出力しています。
select --table XXX \
--command_version=2 \
--filter=( フィルタ条件1 && フィルタ条件2 )
--limit=9999
--match_columns=検索対象カラム1,検索対象カラム2
--output_columns=出力カラム1,
出力カラム2,highlight_html(出力カラム3),highlight_html(出力カラム4),... \
--query=((( 条件1 OR 条件2 OR 条件3 OR ... ) OR (別の条件 + 別の条件))) - また違う条件 \
--sortby=ソートカラム1,ソートカラム2,ソートカラム3..
条件1..条件3のORがやたらと多いです。
1, タイムアウトを伸ばすのは,Open時にread_timeoutを設定すれば良いでしょうか?
grn_conf = { :host => 'localhost',
:port => 1234,
:protocol => 'http'
:read_timeout => 360 }
@aggregates = var['aggregates']
@client = Groonga::Client.open(grn_conf)
2, クエリのどの部分に時間がかかっているか確認する方法
ORをたくさん繋いでいるのでなんとなく遅くなるのはわかるのですが、
実際どの部分に時間がかかっているか確認したいと思っています。
ログのどの辺を見れば良いでしょうか?
例えば次のクエリだと、ソートに15秒かかっているという理解でよいのでしょうか?
2015-08-26 21:54:03.413553|0x10a88fd70|>/d/select
2015-08-26 21:54:03.448127|0x10a88fd70|:000000034591000 filter(10234)
2015-08-26 21:54:03.453527|0x10a88fd70|:000000039991000 filter(10234)
2015-08-26 21:54:03.482513|0x10a88fd70|:000000068968000 filter(10234)
2015-08-26 21:54:03.484300|0x10a88fd70|:000000070751000 filter(10234)
2015-08-26 21:54:03.493638|0x10a88fd70|:000000080089000 filter(10255)
2015-08-26 21:54:03.532504|0x10a88fd70|:000000118972000 filter(9194)
2015-08-26 21:54:03.535103|0x10a88fd70|:000000121555000 filter(9173)
2015-08-26 21:54:03.537450|0x10a88fd70|:000000123903000 filter(9173)
2015-08-26 21:54:03.537477|0x10a88fd70|:000000123929000 select(9173)
2015-08-26 21:54:03.573637|0x10a88fd70|:000000160103000 sort(9173)
2015-08-26 21:54:18.676723|0x10a88fd70|:000015263184000 output(9173)
2015-08-26 21:54:18.681831|0x10a88fd70|<000015268299000 rc=0
3, syscall error 'sendmsg' (Protocol wrong type for socket)[41]について
この遅いクエリを実行しているとサーバ側で上記のメッセージがでるのですが、
これはサーバ側の問題なのかクライアント側がコネクションが切れたのか
わかりますでしょうか?
4, クエリのselect時にunlimitedで全件取得というのは可能でしょうか?
select時に--limit 0とすれば検索件数が取得できるのは知っていますが。
一回のクエリで全件簡単に取得することはできますでしょうか?
今は9999と大きな数値を指定しています。
環境
* OSX 10.10.5
* Groonga 5.0.6
* groonga-client 1.0.8
参考までにその他のログを一部gistにのせました。
https://gist.github.com/hiroyuki-sato/a185469981de42de86b4
よろしくお願いします。
--
Hiroyuki Sato