Zope/Ploneでウェブサイトを運用するときの勘所

Zope/Ploneアドベントカレンダーが回ってきました。私はOSSの会合にもあまり出ていないし、プログラムもさほどかけるわけではないのでこういったことを書くのは多少面はゆいのですが、せっかくご指名をいただいたので書いてみます。ある程度でも参考になればさいわいです。

さて、私は某所にてウェブサイトの運営を担当しています。このサイトは大部分がZope/Ploneでできています。もう運用を開始して5年程度経ちます。おそらくZope/Ploneを使ったサイトという範疇では国内最大級(コンテンツ数/訪問者数)だと思います。その運用でいろいろと性能改善とか、冗長性とかを模索していて、そういったTipsはこのブログでも随時書いていますが、今回は主だったところを再度取り上げてみようと思います。

まず大体問題になるのが、性能ですね。Zopeもだんだんと性能が上がってきたとはいえ、Apacheなぞに比べるとその性能は足元にも及びません。動的にページを作っているので当たり前なんですが。そこでまずはフロントエンドとしてApacheSquidをたてて、そこでリバースプロクシを聞かせてZope/Ploneへリクエストを流すっていうのが常道です。そこらへんの設定はあちこちに情報があるので、今回はZope/Ploneを使ってウェブを運用するときのTipsを書いてみます。

一台のサーバに複数のインスタンスを立てる

2台のサーバで2つのインスタンスを稼働させるよりも、1台のマシンで2つ〜3つのインスタンスを可動させた方がトータルでは性能がでるようです。マシンを増やさないといけないかなと感じたとき、ダメもとでインスタンスを増やしてみましょう。もちろん、Data.fsはZEOで共有させることが前提です。

Zopeが処理するスレッド数を増やす

$INSTANCE/zope.conf中のzserver-threadsで調整できます。デフォルト値は4。1つのHTTPリクエストに対して、ページを作るのに時間がかかる場合はこれを増やすと性能がでることがあります。あまり増やすと逆効果になることもありますので調整しながら試してみてください。スレッドが現在どういう処理をしているかを参照するためにはDeadlockDebuggerというプロダクトが有効です。これでスレッドの処理具合を参照して、いつもスレッドが処理でいっぱいいっぱいなら数字を増やしてみると効果があるはずです。

編集用と表示用のインスタンスを分離する

同一インスタンスでData.fsに対してwrite/readを同時に実施すると、途端に性能に影響がでます。Ploneの編集画面で使うインスタンスと、外部に対して見せるインスタンスは完全に分離することをお薦めします。また、外部に対して見せるインスタンスzope.confでzserver-read-only-modeや、read-only-databaseをonにしてもいいでしょう。zserver-read-only-modeだとログがでませんが、安定しているのであれば問題ないでしょう。

ZEOのキャッシュ、zodbのキャッシュ

ZEOで運用している場合には、インスタンス-ZEO間通信なども結構バカになりません。うちのサイトの場合、zope.conf中のzodb_dbの設定はこんなふうになっています。

<zodb_db main>
    # Main FileStorage database
    cache-size 50000
    pool-size 10
    <zeoclient>
        server localhost:8100
        storage 1
        name zeostorage
        var $INSTANCE/var
        cache-size 50MB
        client zeo1
    </zeoclient> 
    mount-point /
</zodb_db> 

それぞれのキャッシュの値がどれくらいがいいのか、真面目には検討していないのですが。一度値を少しづつ変えてインスタンス-ZEO間の通信も調べてみないといけませんね。

ZEOに冗長性を持たせる

サーバを複数運用して、インスタンスを複数たてて「どこが落ちても大丈夫」。でもZEOが落ちるとダメなんですよね。ZEOに冗長性って持たせられないのかな。実は出来るんです。やり方は単純。上記でのzeoclient中にserverを複数行書けばOK。

<zodb_db main>
    # Main FileStorage database
    cache-size 50000
    pool-size 10
    <zeoclient>
        server localhost:8100
	server 192.168.1.2:8100
        storage 1
        name zeostorage
        var $INSTANCE/var
        cache-size 50MB
        client zeo1
    </zeoclient> 
    mount-point /
</zodb_db> 

こう書くと、通常はlocalhost:8100を見にいきますが、通信ができなくなると192.168.1.2:8100を参照します。当然Data.fsの同期は別に考えないといけないんですけどね。うちのウェブの場合、Data.fsが7Gもあるのでちょっとどうしようか思案中なんです。

パックは毎日しましょう

Data.fsは小さいほど性能がでます。packは毎日しましょう。でもウェブが忙しいにpackすると性能がガクンと落ちます。とくにwriteする動作なんか性能劣化が顕著。私のサイトではこんなcronで夜中にpackしています。

0 2 * * * /usr/bin/wget  --http-user=admin --http-passwd=admin_password --output-document=/dev/null --post-data='days:float=0' http://localhost:8080/Control_Panel/Database/main/manage_pack

昔はpackするとData.fsが壊れるなんて都市伝説がありましたが、この5年間で一度も壊れたことはありません。


と、ざっと書いてみましたがいかがなものでしょう。私のブログの過去ログにもいろいろと試行錯誤の跡が残されていますので参考にしてみてください。
さて、お次はたかのりさんか、寺田さんだというお話です。