a group powered by ototoy blog

ブラジル!

カレンダー

2005/2
27 28          
2005/3
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 19
20 21 22 23 24 25 26
27 28 29 30 31    
2005/4
          1 2

最近の記事

RSS

月別アーカイヴ

カテゴリー

プロフィール

2005年03月14日

xangoについて独語するスレ  

汎用クローラーxangoに関して独語するスレ。

| Posted By あかべこ 投稿日: 2005年3月14日 16時35分 更新日: 2005年8月4日 23時52分

コメント

というわけで森さんの要請に従ってスレ作成。

ただいまの実装されている仕様としては
- イベント型
- クローラー1プロセスで約6000~12000 urls/hを取得。
- フーレムワークとしてはどんなタイプのクローラーでも実装できる感じ。

xango-blog (ブログ検索用データ収集)
- RSS/Atomフィードを定期的にチェック+インデックス
- Postgresバックエンド
- robots.txt 対応
- RSS/Atom自動発見

問題点
- 数時間おきに何故か落ちる。静かに。エラー無しで。なんでじゃあ
- sf.livedoor.comと同じように、フィードを取りに行く前にユーザーがフィードの長さより多い数の記事を書くとインデックス漏れが起きる
- 関係ないコンテンツをいっぱい取ってきてる。


今まず何故落ちるのかを考察中・・・
by あかべこ - 2005年3月14日 16時48分
関係ないコンテンツをいっぱい取って来るのはホップ数が大きすぎるからかなぁ。。?
by ゆげ - 2005年3月14日 17時2分
ふむふむ。
by nt - 2005年3月15日 16時6分
愛しきEvent Driven Multitasking Frameworkが捨てられるのはもはや時間の問題ですか?
by ゆげ - 2005年3月15日 22時53分
ポェは音はすきなんだけどなぁ。
by nt - 2005年3月16日 4時38分
とりあえず捨てる事もできるように、開発進行中。
今さっきようやくポェに頼らない、HTTP Fetcherフレームワーク書きました。あんまりevent drivenではないけれども、非同期でソケットに読み書きできる感じで、DNSをローカルにキャッシュしたり。

こちらの課題としては
- 30X のリダイレクトに対応してない
- DNS応答が非同期ではない
- 現存のxango-blogとの結合部分が全然違う。

・・・という感じです。
by あかべこ - 2005年3月16日 14時50分
で、今は何をしているかというと、そちらがとりあえずまがりなりにもHTTP Fetcherとして稼働してるのでちょっと安心して、既存のヤツが違うプラットフォームで動かないかテストしてみてます。

現在xango.razil.jpのDBを使いつつ、おいらのマシンからガンガンアクセスしてます。これで落ちなければDebianが悪い、ということで・・・
by あかべこ - 2005年3月16日 14時52分
あと技術的補足。

なんでポェが落ちるのか詳細を追って行ったところ、どうもPerl内部のバグっぽい感じが・・・。一応わけわかめなのでMLに投稿してみたりしました。

誰も返信してくれなさそうな予感のMLスレはここ

http://aspn.activestate.com/ASPN/Mail/Message/Perl-POE/2520960

メソッドコールがうまく行ってないのですよねぇ。これでコアファイルでも落としてくれればなんとかデバッグのしようもあるんですが、残念ながらコアファイルはナシです。
by あかべこ - 2005年3月16日 14時55分
Hi all だって。。 カコいい!! ≧▽≦
by ゆげ - 2005年3月16日 14時59分
関係ないコンテンツについて。

ホップ数はエントリ毎のプライオリティで決定されていて、プライオリティはリンクもとのプライオリティx係数で決めてます。これでプライオリティが0だったら取得そのものを行いません

で、今この係数が0.1。つまり100 - 10 - 1 - 0と4ホップくらいは可能なわけなんですが・・・

3ホップくらいは妥当なんじゃないかなぁ、とは思うんですよ。
あとはなんかHTMLをパースしてから追加するリンクをもっとスマートにコントロールするとかかなぁ。今は結構とりあえず足してる、って感じもあるので。
by あかべこ - 2005年3月16日 14時59分
ホスト間リンクとホスト内リンクのメリハリはどのようにしてますか?
極端な話、当初は大手有名blogサイトを網羅できればかなりサービスとしてイケてる感が見えて来ると思うのです。
ですから、ホスト間リンクは係数を小さく、ホスト内リンクは係数を大きくするのが良いと思います。
by ゆげ - 2005年3月16日 22時54分
おお、そうか!うっかり忘れてました。
by あかべこ - 2005年3月17日 8時39分
Mac OS Xでは"Broken pipe"となって落ちた・・・ということはソケットを切断されてたりするんだろうか、と。

つまりそれってサーバー側でソケットを切っちゃったとかかなぁ・・・

正直ポェのほうが後々楽だからポェにしたほうがいいと思うんだけどなぁ・・・
by あかべこ - 2005年3月17日 10時31分
ホスト間リンク云々はやりましたー。
by あかべこ - 2005年3月17日 14時39分
課題メモ:もしあるブログにRSSとAtomと両方のフィードが見つけられた場合、Atomを優先したい。しかしこのためにはこのRSSはどこのページに対するRSSか、という情報を持ってなければいけない。逆かな。このページはどのRSSでフィードしてるか、かな。

まぁともかく。そのカラムを見て、どっちを優先するか見るべし。もしAtomとRSSと両方ある場合はRSSのほうはクロールしないようにしちゃったほうがよろし。
by あかべこ - 2005年3月18日 14時11分
ありゃりゃ、Many-to-Many か・・・・カラムじゃなくてもうひとつテーブルが必要でつか?
by あかべこ - 2005年3月18日 14時15分
n:nなの? どーもatomとか良くわかってなくて。。今度教えて。
by ゆげ - 2005年3月18日 14時50分
例えば、話題のH江氏のブログ

http://blog.livedoor.jp/takapon_jp

のソースを見てみると、上のほうに<link>タグが4つくらいあるでしょ?そこのapplication/rdf+xmlとかatom+xmlみたいなヤツがRSS/Atomですよね。

で、これで過去記事に行くと

http://blog.livedoor.jp/takapon_jp/archives/....

とかいうURIになるんだけれども、同じAtom+RSSにリンクするんですなぁ。

まぁ、一般的にはブログ(N):RSS(1)+Atom(1)になるんですが。
この先どんなフィード方式が出てくるかわからないし、一応一般化しておかないといけないなぁ、と。
by あかべこ - 2005年3月18日 16時42分
この間から色々リファクタリングとかバグフィックス入れてるんだけど、DBのほうがもう限界かもなぁ。

普通にクロールしてる分にはたいした問題ではないのだけど、メンテする時に激しく遅いです。vacuumしても、vacuumしても、遅い。ぐほ。
by あかべこ - 2005年3月23日 14時34分
mysqlのが速いってぇ。。
by ひろゆき - 2005年3月23日 15時13分
mysqlも同じだポ

やっぱり分散化するのがスジだぽ
by あかべこ - 2005年3月23日 16時44分
weblogUpdatesに対応〜。
by あかべこ - 2005年3月24日 1時23分
今までis_blog (boolean) だったカラムをblog_base (text)にして、ブログの「元」でグループ化できるようにしてます。

ちょっとどう使うかまだよく考えてないんですが、あったら便利なような気が。
by あかべこ - 2005年3月24日 9時18分
ナイス!
by ゆげ - 2005年3月24日 10時17分
あー、でもblog_baseが抽出できなくてもそれをブログだと認識できるようにis_blogは残しておいたほうがいいような気がしてきた。

atomやrssからデータを拾ってくるのはあくまでblog_baseが入ってるものだけにして(=信用できるデータ)、残りのis_blog = trueだけどblog_base = NULLのヤツは後でそれを抽出できるようにheuristicsを変更するって感じでいいかな・・・
by あかべこ - 2005年3月24日 10時40分
xango-blogではなく、xango本体のほう、そろそろフリーズしていいかなぁ、と思うのですが。いいですかー。

あと、ふと思ったんだけどxango-blogのほう、dev.razil.jpからソース降ろしときます。
by あかべこ - 2005年3月24日 11時37分
最終的にPOEでfixでつか? 作りかけだった、べこ謹製のevent driven frameworkも勿体ないなぁ。。

xango-blogのソースは非公開が良いですね。

http://dev.razil.jp/の「汎用Webクローラー(名称未定)」がカッコ悪。。
by ゆげ - 2005年3月25日 11時57分
シードの取り方を変えてみたアル。前よりブログ行ってる予感。
by あかべこ - 2005年3月25日 11時59分
ポェでfix!はやいもん。
トップは直したー
by あかべこ - 2005年3月25日 12時1分
なんかjugemとはてなとりこぼしてた・・・あぶねーあぶねー
by あかべこ - 2005年3月25日 16時17分
クロールを始めた当初はひじょうに効率がいいのですが、それがだんだん落ちる。・・・なんでかと思ってたらタイムアウトでシードとなるchanges.xmlやらrssフィードがクロールできない状態になったりしてる・・・

というわけでis_seedカラムを足して、重要なシードと認識したURIはどんな状況でもクロールするようにしてみた。
by あかべこ - 2005年3月27日 9時45分
おお。。カラムいまいくつぐらいですか?
by ゆげ - 2005年3月27日 11時10分
17個ですね。
by あかべこ - 2005年3月28日 8時22分
postgres -> mysql にデータ渡す時にどうしてもポーリングしなくちゃいけないのですが、そのポーリングの周期をダイナミックに30秒から15分まで、受け渡すデータ量によって動的になるようにしてみた。

あと、どこかに「プロセス終了しますた」フラグをセットしてないところがあるんだけど、それでフラグがクリアされない少量のURIを定期的に拾ってクロール可能に戻すコードも入れたです。
by あかべこ - 2005年3月29日 10時37分
大変な事発見しました。bloggers.jpとnifty.comのchanges.xml、実は不正なXMLだった!

・・・どうりで全然こねぇなぁ、と思ってたのですよ・・・
by あかべこ - 2005年3月29日 16時29分
なんかデータベースが落ちてた・・・そういうこともあるんだな。
対応するコード作成中・・・
by あかべこ - 2005年3月31日 11時59分
5プロセスで稼働中ぅううう。おかげでApache遅いけど・・・
by あかべこ - 2005年4月1日 18時38分
一般的なクローリングは大分安定してきた。これからはどれだけシードを持ってくるかなんだけれども、それには高速で「最新記事」フィードを取ってくるかによるので、これがまず分散化第一候補。30個くらいのフィードを別サーバー、別プロセスにして、それだけを延々と取得し続けてメインのデータベースにフィードする形が望ましいかと思われまする。

ちなみに現在シードは他のURIに飲み込まれてしまって1時間に一回取得にいけるかどうか。(これでもその他フィードから一日10万件くらいは拾ってこれそう・・・)
by あかべこ - 2005年4月2日 9時25分
分散化、第一段階完成!詳細は後ほど。
by あかべこ - 2005年4月4日 11時9分
mysqlデータベースが挙動不審なのと新しいサーバーがまだ準備ができなかったので(ひーん)、今xango(本体)のほうをちょっと調整中。

ついでにxango-blogのほうでメモリを使いすぎるので(HTTPレスポンスが丸ごとメモリ内にあるので、changes.xmlとかでかいファイルだとやたらとスペースを食う)そこらへんを柔軟にカスタマイズできるように設定項目とかも増やします。
by あかべこ - 2005年4月5日 19時15分
いやーすみませんすみません。mysql構築急ぎます。
by ゆげ - 2005年4月6日 10時16分
Atomだった場合はほぼ無条件でブログのフィードだと信用してみると、すごい勢いでエントリーが溜まって行く。

あとメモリの問題だが、こっちはどうもHTTP fetch能力が、それ以降の処理能力を上まると起こるっぽいこと発見。ということは現在「稼働中」のジョブ数を常に把握してるのがグッドっぽい。
by あかべこ - 2005年4月12日 6時59分
RSS処理が強烈にリークしてるっぽい・・・
by あかべこ - 2005年4月14日 9時25分
あうあう。。
by ゆげ - 2005年4月14日 9時26分
RSS処理用に使ってるモジュールが強烈にリークしてました。
これからXML::LibXMLで自分で書き直します・・・しくしく。
by あかべこ - 2005年4月14日 9時39分
書き直した。同様のものをAtomでも実装します。
by あかべこ - 2005年4月15日 8時15分
走らせてみた。1プロセス22MBでだいたい固定!やたー
by あかべこ - 2005年4月15日 9時33分
ガーラ仕様で色々書いてみた。かなりいい感じ。プロセス5個でそれぞれ22MB〜25MBしかとってない。
by あかべこ - 2005年4月15日 13時8分
よしゃー
by ゆげ - 2005年4月15日 18時45分
一般URLを6つに分散してみた。
by あかべこ - 2005年4月19日 19時24分
DBIが遅くなってきたので今度はこっちを非同期化するか・・・研究中。
by あかべこ - 2005年4月20日 8時37分
POE::Component::EasyDBIで非同期化してみた。分散化する時にデータベースへのアクセスをかなり抽象化してたので変更はわりと簡単。

あとRSSとかはcreatorフィールドがない事が多いのを忘れてた。not null設定を取り払ったら結構また取り込める件数がのびましたよ。
by あかべこ - 2005年4月20日 16時45分
うぉ。。今まではerrorになって取りこぼしだったのれすね。。< not null
by ゆげ - 2005年4月20日 23時27分
DBって難しいれすね。今度はNULLがORDER BY では一番最後に来るのがわかって、しょうがないので200万件近いレコードの書き換え行ってます・・・

ちきしょー
by あかべこ - 2005年4月21日 13時40分
ORDER BYに二つカラムが入ってるとかかるコストが40倍になる・・・

え〜ん・・・
by あかべこ - 2005年4月22日 13時32分
order byの指定どおりに、2カラムにまたがるインデックス張ったら?
by ゆげ - 2005年4月22日 14時7分
レコードが200万とかあると、それなりのコストですねぇ。>マルチカラムインデクス
by nt - 2005年4月23日 2時55分
htmlコメントの内容がpagesに入ってしまってるようです。
今ってdescriptionの内容しか入ってないんじゃなかったっけ?

http://xango.razil.jp/search?q=shuffle%E7%94%A8HardCase%E3%81%8C%E5%B1%8A%E3%81%84%E3%81%9F
by ゆげ - 2005年4月25日 11時7分
order byなんだけど、base_priorityと、priorityって二つ作って、priority = base_priority + last_fetch_dt で保存しちゃうってのはどうかなぁ。
by あかべこ - 2005年4月25日 13時9分
あー、まて、どんどんdecayしていく値を保存なんてできるわけねーじゃん・・・
by あかべこ - 2005年4月25日 13時17分
うわあああ、難しい〜〜〜〜〜〜
by あかべこ - 2005年4月25日 18時21分
他の処理をしている間に裏で先にシードを読み込むようにしたー!これでタイムラグが大分なくなっていい感じかも。

マイナスポイントは、若干プライオリティによるページ取得の順番が乱れるのと、バッファする分メモリを食うって事かな。
by あかべこ - 2005年4月26日 9時7分
現在川崎のドトールでDB間の相互コネクションを無くすための作業中・・・

ところでxangoフレームワークのほうはそろそろCPANにあげちゃってもいいかな・・・?
by あかべこ - 2005年5月9日 8時23分
1プロセスの持つDB接続は3つで固定。

どうも一個遅いプロセスがあるとそれにひっぱられてるような気がする・・・なんでだろう。皆独立したプロセスなんだけどなぁ。
by あかべこ - 2005年5月10日 11時11分
一応昨日話したApache使ったマスターを書いてみた。
とりあえず結合試験はまだ。
by あかべこ - 2005年5月11日 13時7分
単体でマスターとクローラーの結合試験した。いい感じで早い。
暇があれば今夜中に全部結合してやってみますよ。
by あかべこ - 2005年5月11日 15時28分
おお。。よろしくですー
by ゆげ - 2005年5月12日 11時51分
今はマスターへの書き込みのほうが圧倒的に多いので、ログが溜まってしまってしょうがないっす。ちょうどいいバランスをえいや、っと決めようとしてる・・・
by あかべこ - 2005年5月12日 12時26分
ぐわわ、相互接続がまだ残ってた。くそー。
by あかべこ - 2005年5月12日 15時31分
メモ:新規(かもしれない)URIの書き込みが異常?に多い。DBに届いてしまうもっと手前である程度削除する必要あり。

アイデア:キャッシュを使う。先にcanonicalizeして、配列ではなくハッシュで保存等。
by あかべこ - 2005年5月13日 16時16分
すっげええええ発見!!!!

crawl_ready というboolean型のカラムにどうやってもインデックスが使われないのでなんでだろう、なんでだろうと試行錯誤していたところ、じゃあこれがbooleanじゃなくてintegerだったらどうなるんだろう?と思ってやったみた:


senna-feed01=# explain analyze select * from fetchdata_tmp where crawl_ready = 't';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
Seq Scan on fetchdata_tmp (cost=0.00..2028.91 rows=24450 width=176) (actual time=0.015..117.897 rows=24450 loops=1)
Filter: (crawl_ready = true)
Total runtime: 131.433 ms
(3 rows)

senna-feed01=# explain analyze select * from fetchdata_tmp where crawl_ready2 = 1;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------
Index Scan using fetchdata_tmp_crawl_ready2_idx on fetchdata_tmp (cost=0.00..1043.72 rows=288 width=176) (actual time=0.134..0.134 rows=0 loops=1)
Index Cond: (crawl_ready2 = 1)
Total runtime: 0.222 ms
(3 rows)

senna-feed01=#

なんじゃこりゃああああ!!!!!
by あかべこ - 2005年5月13日 19時26分
フィードからDBに登録する際の仕組みをこの前話してたApache形式に変換したー。
by あかべこ - 2005年5月20日 9時27分
遅い・・・未だにDBへの書き込みじゃないかと疑ってる。
これを非同期でやるべきなのか・・・?
軽くログを取ってみると44個のURIを登録するのに14秒かかってる。これってもっと秒殺できるべきなんじゃないのかなぁ。
by あかべこ - 2005年5月23日 10時37分
42個で4秒まで縮めてみた。
by あかべこ - 2005年5月23日 10時50分
後常時書き込むところと言ったらupdate_fetchdataくらいかなぁ。
by あかべこ - 2005年5月23日 11時54分
遅い原因の一因:update_fetchdataするデータをバッファして、ある程度溜まったら一気に処理する形にしたのと、queue_aheadで実際の処理が終了していないのに先に次に取りに行くURIを決定するため、必然的に*現在処理しているのと同じ*URIが一部含まれるリストが次回取得URIに回される。

これがある程度の大きいリストならいいけれども、処理するURIのリストが短く、かつ処理がqueue_aheadが始まる前に終わらない場合は同じURIを延々と処理し続けるハメになる事が有る。

一番簡単な回避方法は「ただいま処理中です」フラグを付ける事なのだけれども、これがまた小さいwriteが多発するので格段に効率が落ちる。

現在まだ処理中のURIがある間にqueue_aheadをする場合はLIMIT %d OFFSET %dを使うかなぁ。これももちろん完璧ではないけど、歩い程度は防げるのではないかと。
by あかべこ - 2005年5月23日 17時29分
あ、それとは別に、seed -> normal -> feedという流れはちょっと変えて、seed -> feedと一気に行くようにした。seedの処理能力がちょっと落ちるけど、feedデータが一気に増えるようになりやした。
by あかべこ - 2005年5月23日 17時49分
うおおお、あと偽物のDate:ヘッダー返してきてるヤツがいたああああ
by あかべこ - 2005年5月23日 18時42分
動くようになったと思ったらMySQLが落ちた・・・
by あかべこ - 2005年5月24日 0時42分
>>79
RSSのDateフィールドってなんであんなヘンチクリンなんだろう?といつも思います。だから、偽モノDateを作る気持がなんとなく分かる。
by nt - 2005年5月24日 1時9分
PostgreSQLでうまくインデクスを使うパターンを見つけるのって結構大変ですよ。バージョンがあがるとまあ、大抵賢くはなってるんだけど。どうにも定石が見えて来ません。

7.2あたりのときに経験したビックリパターンはintegerで"where hoge = 1"が何かの理由でseq scanだったのに、"where hoge between 1 and 1"にするとindex scanになったやつです。GAさん本当にお願いしますよ。

8でもSELECTで/* HINT */こういうヒントが使えるんだったら使うといいかもよ。
by nt - 2005年5月24日 1時15分
>>82
between 1 and 1ってすげーですな!それは思いつかないよ・・・

とりあえず、explainで正しいmultiple index作って、SET LOCAL seq_scan = 'off'するとある程度期待通りの動きしてくれてるっぽいっすわ

/* HINT */ってポスグレでも使えるのか・・・
by あかべこ - 2005年5月24日 3時4分
ちなみに、SEED -> NORMAL -> FEEdというラウンドトリップの他に、SEEDの巡回スピードを若干犠牲にして SEED 処理プロセス内でもう一回余計にGETすることで直接フィード取りに行くようにしたら少なくとも前より多くのコンテンツが登録されてる・・・と思われる。

なんでわからないかというと、MySQLにINSERTできない。とりあえずINSERT処理を待っているコンテンツが・・・20万件あるので、結構多いんじゃなかろうかと。
by あかべこ - 2005年5月24日 3時9分
↑重複データを(たくさん)含む>20万件
by あかべこ - 2005年5月24日 3時10分
なんかまたMySQLが文句言ってる・・・インデックスをまた貼り直すのかな
by あかべこ - 2005年6月1日 12時23分
シードの取り方改変中。無駄を少なく少なく。

あと何故かdoblogを取ってなかった事に気づく。おかしいなぁ。
by あかべこ - 2005年6月3日 12時34分
なんかまた性能が落ちてきたと思ったら、実はseedが持ってくるURIリストがでかいということらしい。feedのほうがリストに入れてくのが追いついていない。
by あかべこ - 2005年6月6日 16時5分
あと、ライブドアとはてなが同じフィードプロセッサにハッシュされてるのは結構きついなぁ。やっぱりもう一個作るか。
by あかべこ - 2005年6月7日 11時2分
昨夜11時40分頃から今さっき10時10分頃までで18万件ー。一日で今だいたい36万件ペースだ!このままいけるかなー。
by あかべこ - 2005年6月14日 10時13分
おおーー。。すごいっすー。
by ゆげ - 2005年6月14日 11時21分
ちなみに観測結果

06/13 23:49 - 821,684
06/14 00:01 - 828,619
00:09 - 832,900
00:20 - 837,407
00:35 - 842,381
01:02 - 850,065
01:30 - 859,168
02:00 - 866,967
02:33 - 876,782
08:18 - 974,290
09:19 - 989,152
09:31 - 992,234
10:00 - 997,824
10:30 - 1,005,309
11:49 - 1,017,144
12:10 - 1,022,670
12:31 - 1,026,352
by あかべこ - 2005年6月14日 12時32分
なんか増加ペースが復活してますね。昨日の対策案を実装したのかな? >べこ
by nt - 2005年7月14日 4時22分
新しいsupermicroをクローラに投入した成果っすかね
by ゆげ - 2005年7月14日 12時10分
870万件〜
by あかべこ - 2005年7月26日 16時48分
880万件〜
by あかべこ - 2005年7月26日 20時10分
890万件〜
by あかべこ - 2005年7月27日 2時25分
9,687,599件〜
by nt - 2005年8月1日 20時50分
10,123,365件
キ(゚∀゚)ター
by nt - 2005年8月2日 10時31分
10,311,899件
キ(゚Д゚)タ?
by nt - 2005年8月3日 3時39分
そういえばxangoでrecommunikkiがちゃんと検索できる件について
by nt - 2005年8月3日 3時40分
そういえば福岡さんが、タワーの新検索をたいへん気に入ってましたヨ。
by hirobow - 2005年8月3日 18時4分
10,466,733件
(゚Д゚)モヘー

>>102
なかなかデフォルト検索にしてもらえなくて悲しいですよ。とっくに実用段階に入ってるのに。
by nt - 2005年8月4日 2時45分
10,543,193件
今日はちょっと軟調だった(゚Д゚)ディスカ?
by nt - 2005年8月4日 23時52分

トラックバック