RSS

カレンダー

2005/2
2728     
2005/3
  12345
6789101112
1315161719
20212223242526
2728293031  
2005/4
     12

カテゴリー

    最近の記事

    月別アーカイヴ

    LINKS

    a group powered by ototoy blog

    ブラジル!

    2005年03月

    2005年 03月 18日

    p2のスレ 

    このスレでp2の開発状況を語ると聞いて、飛んできました。

    | Posted By あき 投稿日: 2005年3月18日 11時7分 更新日: 2008年11月14日 20時43分

    コメント

    おつですおつです。
    by ゆげ - 2005年3月18日 11時36分
    18日の22時頃よりp2.2ch.netが重くなる。
    メモリのfreeが底をつくあたりで、なぜか重くなってしまう症状があるのだ。
    今回で2度目である。
    MLに投げると、moriさんが援軍に来てくれた。
    moriさんによると、phpの中でstatとopenを大量に発行しているのが、原因ではないかとのこと。
    ユーザ数×読んだスレッド数と、扱うファイル数が大量な上に、PHPの発行するsystem callが冗長なようだ。
    たけなかさんもfileのcacheを指摘されており、また、ぼく自身もfile周りの負担を感じている。
    もはや全会一致の勢いで、DB化は必須であるとの結論に至った。
    ということで、ひとまず再起動して、動作の軽快さを取り戻そうとした時、問題発生が!
    先生!再起動に失敗して、サーバが起動しません!!
    by あき - 2005年3月19日 1時4分
    おつですおつです。
    by ゆげ - 2005年3月19日 1時14分
    PHP4はオブジェクトをコピーして渡すのに対して、PHP5はオブジェクトを参照渡しするのがデフォルトの動作だ。
    p2.2ch.netでは、PHP4を使っているので、基本動作として、オブジェクトをコピーしていたわけだけど、これを2日ほど前から、コードを書き換えて参照渡しするように変更してみた。PHPの場合、速度はあまり変わらないそうなのだが、多少はメモリの節約効果があるかもしれない…。
    by あき - 2005年4月19日 1時23分
    プロファイラとかあると便利なんですけどねー。関数毎に呼出回数と実行時間の統計がとれるとチューニングがめっさ楽なのに。

    結局いつも手動でやってます。
    Zendのツールでそういうのあるのかなぁ。
    by nt - 2005年4月19日 5時31分
    利用したことないですけど、Zend Studioでできるっぽいです。

    僕はこのクラスを使ってます。
    http://www.adepteo.net/profiler/
    手動でマーキングが必要ですけど、一応、関数毎に呼出回数と実行時間の統計がとれます。

    配列にたくさんのオブジェクトを放り込む処理を参照渡しにしたところ、値渡しに比べて30%以上速くなったのを確認できました。
    ただ、PHPの場合、参照渡しにすると必ず速くなるかというと、ケースバイケースな感じがします。
    by あき - 2005年4月20日 7時2分
    調べてみたら、上のprofiler.incよりも、PEARのProfiler.phpの方が、高機能っぽくて、良さっぽ。
    by あき - 2005年4月20日 8時16分
    たった今、xdebugというのを発見した!
    http://www.xdebug.org/docs-profiling.php
    これは使えそう。
    by あき - 2005年4月20日 8時30分
    apdというのも見つけた。これもxdebugと同じく自動統計が取れるらしい。
    http://jp.php.net/manual/ja/ref.apd.php

    あと、念のため、PEARのProfiler.phpというのは、Benchmark/Profiler.phpのこと。
    by あき - 2005年4月20日 11時44分
    なんか、一杯ありますね。心情的にはPEARかなぁぁぁ。でも、apdって組み込みっぽいし。。。悩むー。
    by nt - 2005年4月22日 2時8分
    メモメモ、、
    p2.2ch.netでfree memoryが底をつくと、cpu負荷が悪化する症状はまだ健在っぽい。しかし、以前に比べると我慢できないほどの重さではなくなっている。
    by あき - 2005年4月25日 2時53分
    次は、モリタポによるDAT取得を実装したい。
    既に準備環境は整っていたものの、課モリタポが絡むので、実装に慎重になっていたが、優先順位を高める。
    by あき - 2005年4月25日 16時43分
    また発見。PHP用高機能デバッガ/プロファイラ「dbg」
    http://itpro.nikkeibp.co.jp/members/ITPro/oss/20041110/152408/index3.shtml

    自動統計のできるのは全部組み込みになりますね。
    by あき - 2005年4月25日 20時20分
    アクティブユーザ数を調べてみた。
    過去3日以内に、p2.2ch.netを利用したユーザ数は1029人。
    総登録者数が2664人だから、アクティブな利用者は大体3分の1以上になる。
    思ったより多かった!(10分の1くらいかと思っていた)
    by あき - 2005年4月27日 18時29分
    クロスサイトリクエストフォージェリ(CSRF)の正しい対策方法
    http://takagi-hiromitsu.jp/diary/20050427.html#p01

    p2.2ch.netでも対策を強化しておいた。
    by あき - 2005年4月29日 4時25分
    試しに、pear install で xdebugを入れたら、重いしapache落ちるし不安定でとても使えなかった。。う〜ん。
    by あき - 2005年4月30日 17時28分
    xdebugは、PHPAとぶつかっていたようだ。PHPAを外すと、正常動作した。なかなかいい感じ。
    by あき - 2005年4月30日 18時12分
    p2.2ch.netのApacheが反応しない時は、自動で復帰するようなスクリプトを書いた。様子をみて、実際にうまく動くのを確認できたら、status mlにも自動報告メールを送るようにしたい。
    by あき - 2005年5月2日 10時47分
    linuxじゃないとP2って動かないんでしたっけ?
    by ひろゆき - 2005年5月2日 21時4分
    >>20
    PHPの動くWebサーバなら大体何でも動くはずです〜!
    by あき - 2005年5月2日 21時55分
    いっかい、FreeBSDに入れてみたりすると、バグの切り分けが出来たりするやも、、
    by ひろゆき - 2005年5月3日 16時3分
    そうだなぁ…
    その場合はやっぱり実運用してみた方がいいですよね。
    by あき - 2005年5月5日 21時49分
    そーですね。実運用重要。
    さっき、なぜかp2.2ch.netのサービスが止まってたので復活させときました。
    by nt - 2005年5月11日 1時21分
    PHPでセッションを使うとフレーム表示処理が順番待ちになって困ると思っていた件について、
    セッションデータの扱いを冒頭で処理してしまって、
    明示的に session_write_close() を行えば簡単に解決することに気付いた。

    http://jp.php.net/manual/ja/function.session-write-close.php
    にずばり書いていた。。

    >>24
    ありがとうございますー。

    サーバについては、まだもう少し、今のサーバ環境でも工夫の余地があるので、
    このままもうちょっと粘ってみようかな、と・・。
    以前のようには重くならなくなった気がします。
    ただたまにapacheが変になるのはまだ様子見。
    by あき - 2005年5月30日 9時41分
    eAcceleratorを利用すると、PHPでも簡単にデータのメモリ保存ができる。
    そこで、subject.txtの情報保持をメモリ内で扱ってみようと試みた。

    【1】
    まず、subject.txtからスレッドリスト情報を抽出したものを、
    メモリ内に保存しようとしたが、
    リスト情報にまとめると意外と多くのメモリを消費することがわかった。(750K→2M)
    メモリ消費量に対して、速度向上の期待値は0.1秒程度しかないので、
    ファイルでシリアライズキャッシュする方法も含めて、これはパスした。

    【2】
    で、subject.txtをそのまま、メモリ内で保持しようかとやってみたけれども、
    パフォーマンスがほとんど変わらなかったため、これもやめた。
    一応、コード自体は残している。
    by あき - 2005年6月7日 10時48分
    PHPを4.3.11から4.4.0にアップデートした。
    今回もメモリ関連のバグフィックスがあったようだ。

    php.2ch.netも、いろいろと手を入れたのが功を奏したのだろうか、初期の頃に比べると、ダウンする頻度が随分下がった。今回のアップデートでさらに安定するといいなぁ。

    現在の環境は PHP 4.4.0 + eAccelerator 0.9.3 となった。
    by あき - 2005年7月19日 21時32分
    PHPのmb_send_mail()を使う時に、文字コードの扱いがややこしかったので、まとめてみた。

    ■普通のメールの場合

    RFCに従うと、日本語メールの、
    文字コードは「ISO-2022-JP」、改行コードは「CR+LF」であり、
    ヘッダの日本語部分は、さらにMIMEエンコードを施したものとなる。


    ■mb_send_mail()を利用する場合

    ●改行コード

    ・ヘッダ

    PHPマニュアルのmb_send_mail()の項に、
    >改行(n)で区切ることにより複数のヘッダを指定可能です。
    と示されている。

    ・本文

    http://blog.poyo.jp/?id=1121710480
    のmail()の解説によると、

    >$bodyはUNIXの場合,通常そのままsendmailコマンドに渡ります.
    >sendmailコマンドはnを単純にrn変換する場合があるため
    >(「rn」が「rrn」になる場合がある)改行文字は「n」だけで行う必要があります.

    とのことなので、基本的には「n」でよいだろう。
    しかし、サーバの環境によっては、「rn」としなければならないケースも考えられる。

    ●文字コード

    mb_send_mail()は、PHPの内部エンコーディングから、
    メール送信用エンコーディングに自動で文字コードを変換してくれる。

    mb_send_mail()の変換後エンコーディングは、mb_language()の値に従い、
    'Japanese'なら「ISO-2022-JP」、'uni'なら「UTF-8」となる。

    ここで注意したいのは、php.ini で、
    mbstring.language = Japanese;
    としていれば、mb_language()も'Japanese'になっていそうなものだが、
    必ずしもそうはなっていないことである。PHPのバージョンにもよるのかもしれないが、
    なぜか'uni'になっていたりして、これが文字化けの原因となる。
    そのため、スクリプト中で明示的に、
    mb_language('Japanese');
    と指定しておくとよい。

    さらに注意したいこともあって、
    Subjectと本文は、自動で文字コード変換してくれるが、
    FromとToの名前の日本語部分は、変換してくれない。
    なので、自分で文字コードの変換とMIMEエンコードを施さねばならない。
    例えば、内部エンコーディングがEUCの場合は、以下のようにコードを書く。

    $FromName = '山田';
    $FromName = mb_encode_mimeheader(mb_convert_encoding($FromName, 'JIS', 'EUC'));
    $header = 'From: '.$FromName.' <'.$FromMail.'>'."n";

    さらにさらに注意すべきことには、
    mb_send_mail()を使う場合は、自らメールヘッダで文字コードを指定してはならない。
    こちらがどのように文字コードを指定しようと、
    mb_send_mail()が自動的に文字コードを指定してしまうため、二重に上書きされてしまう。


    以上、mb_send_mail()は、その挙動をわかってしまえば、便利な関数であるが、
    細かな仕様を知らなければ、実にわかりにくいものなのであった。

    ポイントは、mb_language('Japanese') の明示指定と、To,Fromの自力変換である。
    by あき - 2005年7月30日 4時8分
    ↑テスト環境は、PHP 4.4.0
    by あき - 2005年7月30日 4時15分
    あんまり関係ないけど、 http://www.php-accelerator.co.uk/

    > Going forward, PHPA may be replaced by a new accelerator product in the coming months.

    なんか楽しみ。PHP5にまともに対応してくれると嬉しいなー。
    by nt - 2005年8月1日 20時47分
    >>30
    もうcoming monthsですね…。
    ぼくは今は、待望だった5.1が安定してくれるのを待ってます。


    ところで実は、人から指摘も受けたのですが、
    >>28 には少し修正すべき点があります。

    $FromName = mb_encode_mimeheader(mb_convert_encoding($FromName, 'JIS', 'EUC'));
    は間違いです!!

    mb_convert_encoding() で文字コード変換も行ってくれるので、mb_convert_encoding()は不要です。
    一見 >>28 でも、動作するのですが、長い文字が入ると文字化けるようです。

    ですので単純に、
    $FromName = mb_encode_mimeheader($FromName);
    が正解です。

    間違った例文を書いてしまい大変申し訳ない。
    mb_send_mail() は予想以上に地雷だらけでした。。
    いろいろと変な挙動だけでなく、バージョンによって、PHPのバグもあったりするようなので、すごーく厄介なようです。

    ↓気になった関連URL
    http://lists.sourceforge.jp/mailman/archives/tep-j-develop/2003-March/000137.html
    http://blog.poyo.jp/archives.php/id+1129750505
    by あき - 2005年12月19日 14時36分
    PHPのmbstring関連のバグをまとめたものとして、以下のページがよくまとまっていた。
    http://d.hatena.ne.jp/t_komura/20051105
    by あき - 2005年12月20日 5時52分
    おつおつ
    by ゆげ - 2005年12月20日 15時6分
    p2用の新しいサーバ2台のセットアップを行った。Debianから今度はFreeBSDに。
    その時に、いくつかハマッタメモ。

    基本的にportsにあるものは、portsを利用した。PHPもports。

    まず、PHPのページの表示が途中で途切る症状が出た。
    しかもクライアントブラウザ(Sleipnir)のCPU使用率が100%になって止まってしまう。

    /var/log/htttpd-error.log をみると、

    [notice] child pid 52060 exit signal Abort trap (6)
    httpd in free(): error: junk pointer, too high to make sense

    とのエラーが残っている。
    いろいろ試行錯誤の結果、graphics/pecl-imagick を外したら直ったようだった。
    どうもPECLのバグっぽい。

    Apache、PHPのバージョンと、PHPのアクセレータは、いろいろ試した結果、Apache2.0系、PHP5.1系、Zend Optimizerとしてみた。

    Zend Optimizer のインストールでは、ライブラリがないとかいろいろ言われて、ln -s をいろいろ張る。
    で、インストールは完了したが、認識されていない。
    不思議に思って調べたところ、

    http://www.zend.com/store/products/optimizer-troubleshooting.php
    The phpinfo() output will indicate that ZEND_DEBUG is 'enabled'. Recompile PHP
    without the debug support.

    とのこと。そういうのはインストール前の文書で教えておくれ。
    再びPHPを入れ直して、動作OK。
    by あき - 2006年1月21日 16時52分
    >>34
    他の環境では、pecl-imagickがあってもエラーは出なかったのを確認した。
    これもデバッグオプションとか何かが複合的に関連していたのだろうか。
    by あき - 2006年1月22日 7時20分
    >>35
    やっぱりpecl-imagickは変。
    コマンドラインのphpを動かしたら、セグメンテーションエラーでコアダンプ吐いたりしてる。
    by あき - 2006年1月25日 10時16分
    新しいp2サーバ、mumumuさんが全面的に設定調整してくれたので、2chスレよりメモコピー。

    p2.2ch.net不具合報告スレ Part8
    http://qb5.2ch.net/test/read.cgi/operate/1137419892/

    ----------------------------------------------------

    208 :root▲ ★ :sage :2006/01/22(日) 00:47:01 ID:???0 (p)?
    >>207
    どもです。ログインできました。
    一台目と同じスペックですね。

    前のサーバ:
    CPU: Celeron 2.0GHz
    mem: 4GBytes
    disk: IDE
    NIC: 蟹
    接続速度: 10Mbps half-duplex

    新しいサーバ、これが2台:
    CPU: Xeon 3.4GHz
    mem: 4GBytes
    disk: U320 SCSI
    NIC: Intel
    接続速度: 100Mbps full-duplex

    ----------------------------------------------------

    244 :root▲ ★ :sage :2006/01/22(日) 07:09:03 ID:???0 (p)?
    器部分、概ねできました。

    <やったこと(2台共通)>
    ・FreeBSD 6.0-p3に更新
    ・タイムゾーンをJSTに設定(UTCだったというか、設定されていなかった)
    ・一部パッケージのインストール
    ・カーネル再構築(SMPあり、HTTあり)
    ・/etc/rc.conf, /etc/sysctl.conf, /boot/loader.conf 設定
    (メモリが多くてネットワークアクセスが多いサーバ用の設定)
    ・Apache 2.0.55再インストール
    (kqueue有効)
    ・PHP 5.1.2再インストール(4.xは削除)
    ・Zend Optimizer再インストール
    ・pear-Net_UserAgent_Mobile再インストール(これがないと動かない)
    ・httpd.confチューンナップ
    ・バーチャルホスト設定
    ・簡単な動作確認 ( phpinfo(); )
    ・PVをとるための設定

    (p)http://p2test1.peko.2ch.net/
    (p)http://p2test2.peko.2ch.net/ で、テストできるようにしておきました。

    それぞれ、p2.2ch.net という名前でアクセスされても(DNSが変わっても)
    大丈夫な設定を既に仕込んであります。

    バーチャルホストの設定に伴いDocumentRootが変わりました。
    このため、IPアドレスでのアクセスはできなくなっています。

    ということで動作確認は、あきさんのpublic_htmlでやっていただけると助かりますです。
    そんでは、そゆことで。

    ----------------------------------------------------

    247 :root▲ ★ :sage :2006/01/22(日) 07:22:34 ID:???0 (p)?
    #AddType application/x-httpd-php .php
    #AddType application/x-httpd-php-source .phps
    にし、

    AddHandler php5-script php
    AddType text/html php

    に設定。

    で、携帯PCとりまぜて来るみたいなので、

    #
    # The following directives modify normal HTTP response behavior to
    # handle mobile phones.
    #
    BrowserMatch "DoCoMo" nokeepalive
    BrowserMatch "KDDI" nokeepalive
    BrowserMatch "UP.Browser" nokeepalive
    BrowserMatch "Vodafone" nokeepalive
    BrowserMatch "J-PHONE" nokeepalive
    BrowserMatch "DDIPOCKET" nokeepalive
    BrowserMatch "WILLCOM" nokeepalive

    を httpd.conf に追加。

    これで、わたし的には作業終了のはず。

    ----------------------------------------------------

    269 :root▲ ★ :sage :2006/01/22(日) 18:57:01 ID:???0 (p)?
    PHP の設定ですが、

    (php.ini)
    ; added by mumumu, 1/22/2006
    include_path = ".:/usr/local/share/pear"

    [Zend]
    zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-2_6_2
    zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-2_6_2
    zend_optimizer.version=2.6.2

    zend_extension=/usr/local/Zend/lib/ZendExtensionManager.so
    zend_extension_ts=/usr/local/Zend/lib/ZendExtensionManager_TS.so

    (extensions.ini)
    extension=ctype.so
    extension=curl.so
    extension=dom.so
    extension=fileinfo.so
    extension=gd.so
    extension=gettext.so
    extension=iconv.so
    extension=mbstring.so
    extension=mysql.so
    extension=openssl.so
    extension=pcre.so
    extension=posix.so
    extension=session.so
    extension=simplexml.so
    extension=sqlite.so
    extension=tokenizer.so
    extension=xml.so
    extension=xmlreader.so
    extension=xmlwriter.so
    extension=zip.so
    extension=zlib.so

    となっているです。
    by あき - 2006年1月25日 12時52分
    続いて、サーバの監視についてのメモコピー。


    ----------------------------------------------------

    273 :root▲ ★ :sage :2006/01/22(日) 19:53:26 ID:???0 (p)?
    あと、アクセスログは、~/logs から参照できるはずです。


    ----------------------------------------------------

    829 :root▲ ★ :sage :2006/01/24(火) 01:40:39 ID:???0 (p)?
    p2.2ch.net http://mumumu.mu/mrtg/ でのチェックを開始しました。

    トラフィック
    http://mumumu.mu/mrtg/mrtg-rrd.cgi/traffic/p2traf.html
    httpアクセス数
    http://mumumu.mu/mrtg/mrtg-rrd.cgi/access/p2access.html
    by あき - 2006年1月25日 12時53分
    Zend Optimizerってライセンスフリーなんすか?
    by nt - 2006年1月27日 3時59分
    >>39
    Zend Encoder の方は有償のようですが、
    Zend Optimizer は無償で提供されていました。
    http://www.zend.co.jp/products/optimizer/
    by あき - 2006年1月27日 16時40分
    削除されました。
    by - 2006年7月24日 20時9分

    トラックバック

    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分

    トラックバック