locked
Win2008+IIS7.0+FastCGI+PHP5.2.11+SQLServer2008 にて思ったように性能がでない

    質問

  • 初めまして。既出でしたら申し訳ありません。発見できませんでした。
    IIS7になればPHPのパフォーマンスがあがるという事で実験運用環境を作成しています。
    以下の順番で性能を測定しております。 負荷試験にはcurl-loaderを使用しています。

    1.静的ページであれば 理論値で28000TPS 程度の結果を得ました。
    2.phpinfo() だけを出力するページで 1000TPS程度の結果を得ました。

    IISのログを見ると、1リクエストに約200~300msかかっており、意外と遅いなと思いました。
    キャッシュの設定とか何か必要なのか、ファイルをRAM-DISKにおけば改善されるのか(これは試してない)

    ここまでは、やや疑問程度というか、そんなもんかな?でよかったのですが、

    3.mssql_connect()  mssql_close()だけ行うページにすると、20TPS程度になった。
    ・IISのログ上では、確かに1秒間にだいたい20個くらいのリクエストであり、1つあたり4000ミリ秒前後の所要時間がかかっています。
    ・負荷かかっている状態で、ブラウザで同じページを更新すると、確かに4秒くらいかかっています。
    ・ここで、コンソールから、同じPHPを叩くと200msでかえってきます。

    4.FastCGIの設定で、MaxInstancesを4→8に変更
    ・状況は3と同じです。
    5.2台のWebサーバに負荷をかけてみた
    ・SQLServerの同時接続にひっかかってるなら、全体でレスポンスが落ちるはずだが、ほぼ同じ値であった。→SQLServer無罪と思った。

    6.自分なりの考察。
    ・SQLServerと、PHPの接続処理がシリアライズされてしまって遅くなっているとは思えない。→負荷状態でコンソールではすぐレスポンスがあるので。
    ・1リクエストに200msかかるのはいいとして、同時に分散して行えるのだから、MaxInstancesを増やせば、処理速度はあがるかと思ったがそれは間違い?
    ・DBの処理を含めたPHPの処理を行った後、FastCGI→IISへのデータのやりとりで時間がかかっている? →その場合どこをチューニングすればいいのか?
    <ご教授願いたい事>
    ・上記コメントに対して、色々つっこみがあれば適宜指摘してください。
    ・私の望みは、IIS7で1000TPSくらいのPHP+DBアクセスを目指しています。それは無理?

    備考1.PHP.INI
    [MSSQL]
    mssql.allow_persistent = On
    mssql.max_persistent = -1
    mssql.max_links = -1
    mssql.min_error_severity = 10
    mssql.min_message_severity = 10
    mssql.compatability_mode = Off
    mssql.secure_connection = Off


    備考2.FastCGIの設定値
    ActiveTimeout=30
    IdleTimeOut=300
    QueueLength=1000
    RapidFailPerMinute=10
    RequestTimeOut=90
    InstanceMaxRequests=200
    MaxInstances=4or8

    以上よろしくお願いします。

    2009年11月13日 11:45

回答

  • 性能に効果がでるのかはわかりませんが、SQL Serverへ接続するドライバにphp_mssql.dllよりも新しいSQL Server Driver for PHPを利用してはいかがでしょうか?

    それから、WindowsではPHP5.3の方が最適化されていて速いと聞いています。(すいませんが評価してはいません。)

    直接の回答になって無くて申し訳ありませんが、ご参考になれば幸いです。

    • 回答としてマーク 三沢健二 2009年12月16日 2:19
    2009年11月13日 12:10

すべての返信

  • 性能に効果がでるのかはわかりませんが、SQL Serverへ接続するドライバにphp_mssql.dllよりも新しいSQL Server Driver for PHPを利用してはいかがでしょうか?

    それから、WindowsではPHP5.3の方が最適化されていて速いと聞いています。(すいませんが評価してはいません。)

    直接の回答になって無くて申し訳ありませんが、ご参考になれば幸いです。

    • 回答としてマーク 三沢健二 2009年12月16日 2:19
    2009年11月13日 12:10
  • こんにちは、フォーラムオペレーターの三沢健二です。

    kunyami さん、アドバイスありがとうございます。

    acornspapa さん、ご案内いただいた内容はいかがでしたか?
    案内いただいた内容は有用な情報ではないかと思いましたので、私の方で [回答としてマーク] のチェックを付けさせていただきました。

    よろしければ、試された結果や、acornspapa さんの方でその後お気づきになられた事などをお知らせいただければと思います。

    SQL Server Driver for PHP
    http://msdn.microsoft.com/ja-jp/data/cc299381.aspx


    今後とも、TechNet フォーラムをよろしくお願いします。

    ______________________________________
    マイクロソフト株式会社 フォーラム オペレーター 三沢健二

    2009年12月16日 2:19
  • すみません。レポートが遅くなりました。

    1.SQL ServerDriverForPHP を導入してみました。
    ・性能は、約2200TPSになりました。→理由は恐らくコネクションプールの影響だと思います。
    2.同様に、PHPで mssql_pconnect() を使用してみました。→1800TPSになりました。

    そういった意味で、確かに専用ドライバだけある。という事と、ミラー化したDBにアクセスしやすいという点で
    SQLServerDriverForPHPを採用する事にしました。

    ただ結局、PHPのプロセス数制御が思ったように動作しない為、なかなかレポートできなくています。
    2000TPSあれば、あとはNLBでならべればいいとシステム的には許可が出た為、調査の優先度が下がってしまい
    手が出せずにいます。

    FatCGIのMaxInstancesあたりの設定の正確な情報が知りたいところですが、なかなか
    その情報にあたりません・・・ うーん・・・
    本来であれば、どれくらいのマシンスペックを必要として、それをNLBで並べればいいか。
    といった検討をする上で、現状の2200TPSは、目先のシステムには適用できますが、
    今後のマシン導入時の設計に根拠が持てず、ちょっと困っています。

    以上中間報告ですが、よろしくお願いします。

    2009年12月16日 2:35