RSS

カレンダー

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

カテゴリー

    最近の記事

    月別アーカイヴ

    LINKS

    a group powered by ototoy blog

    ブラジル!

    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分

    トラックバック