BLOGTIMES
2009/10/17

TracLightningのチューニング

  trac  tuning 
このエントリーをはてなブックマークに追加

ページの読み込み中にサーバへの接続がリセットされました - TracLightningのチューニング

TracLightningを活用してプロジェクトを運営しているのですが、最近はすっかり空気のような存在なってしまっていて、みんな頻繁にアクセスするようになってきたせいか、デフォルトの設定のままだと運用がかなり辛くなってきました。

単に遅いだけならばちょっと待てば済む話なのですが、ページを開く際に「ページの読み込み中にサーバへの接続がリセットされました」というブラウザのエラーが出て、画面が開けなくなる現象が発生しており、これがチケットの更新時に発生すると、せっかく書いたチケットの内容がそのまま吹っ飛んでしまうので、とにかくこれが不評でした。

ということで、今回はTracLightningのチューニングに挑戦です。

TRAC_DB_POOL_SIZEを変更する

Trac(0.11.5) って重すぎやしませんか - 肉とご飯と甘いもの @ sotarok

SQLiteのロック問題はデーモンモードに限らず環境によっては発生するようです。
TRAC_DB_POOL_SIZEのデフォルトが10なので、とりあえず100位にすると解決します。
環境変数で設定するか、 /trac/db/pool.py にある値を直接書き換えでOKです。

ググっていろいろ調べて見ると、やはりTracが重くて困るという人は結構いるみたいで、「Trac(0.11.5) って重すぎやしませんか - 肉とご飯と甘いもの @ sotarok」のコメント欄で、TRAC_DB_POOL_SIZEを調整すると良いという話が書いてあったので、簡単そうなこのパラメータの調整から手をつけてみます。

TracLightningのpool.pyを下記のように変更し、TRAC_DB_POOL_SIZEを100にします。

C:\TracLight\python\Lib\site-packages\Trac-0.11.4.ja1-py2.5.egg\trac\db\pool.py

--- pool.py.org 2009-10-17 20:02:42.000000000 +0900 +++ pool.py 2009-10-17 20:02:33.000000000 +0900 @@ -160,7 +160,8 @@ self._available.release() -_pool_size = int(os.environ.get('TRAC_DB_POOL_SIZE', 10)) +#_pool_size = int(os.environ.get('TRAC_DB_POOL_SIZE', 10)) +_pool_size = int(os.environ.get('TRAC_DB_POOL_SIZE', 100)) _backend = ConnectionPoolBackend(_pool_size)

mod_python -> mod_wsgi への切り換え

TRAC_DB_POOL_SIZEの変更だけではあまり変化があったような感じがなかったので、上記のエントリの本文中で触れられていたmod_wsgiへの切り替えも試してみました。これは主にapacheの設定を変更しないといけないので、なかなか大がかりな変更になります。具体的な設定方法については、「ソフト/Bug Tracking/trac/Windows - discypus」がとても参考になりました。

まず、mod_wsgiを使うために、mod_wsgi.soをC:\TracLight\CollabNetSVN\httpd\modulesにインストールします。手っ取り早く apache 2.2 + python 2.5 + win32環境 のビルド済みバイナリが欲しかったので、ググって探してみたところ、「Index of /mod_wsgi/revision_1018_2.3/mod_wsgi_py25_apache22」にビルド済みのバイナリが見つかったので、今回はこれを使わせていただきました。

次に、httpd.confでmod_pythonを殺して、mod_wsgiを有効にします。
具体的には下記のような書き換えを行いました。

C:\TracLight\CollabNetSVN\httpd\conf\httpd.conf

--- httpd.conf.org 2009-10-17 20:02:42.000000000 +0900 +++ httpd.conf 2009-10-17 20:02:33.000000000 +0900 @@ -507,7 +507,8 @@ LoadFile "../../python/python25.dll" LoadModule authz_svn_module modules/mod_authz_svn.so LoadModule dav_svn_module modules/mod_dav_svn.so -LoadModule python_module modules/mod_python.so +#LoadModule python_module modules/mod_python.so +LoadModule wsgi_module modules/mod_wsgi.so #LoadModule fcgid_module modules/mod_fcgid.so @@ -545,14 +546,20 @@ # PythonDebug On #DefaultInitEnv TRAC_ENV_PARENT_DIR "C:\TracLight\projects\trac" -ScriptAlias /trac "C:\TracLight\CollabNetSVN\httpd\cgi-bin\trac.cgi" +#ScriptAlias /trac "C:\TracLight\CollabNetSVN\httpd\cgi-bin\trac.cgi" +WSGIScriptAlias /trac "C:/TracLight/CollabNetSVN/httpd/cgi-bin/trac.wsgi" -<Location "/trac"> - SetHandler mod_python - PythonHandler trac.web.modpython_frontend - PythonOption TracEnvParentDir "C:\TracLight\projects\trac" - PythonOption TracUriRoot /trac - PythonOption PYTHON_EGG_CACHE "C:\TracLight\projects\.egg-cache" +#<Location "/trac"> +# SetHandler mod_python +# PythonHandler trac.web.modpython_frontend +# PythonOption TracEnvParentDir "C:\TracLight\projects\trac" +# PythonOption TracUriRoot /trac +# PythonOption PYTHON_EGG_CACHE "C:\TracLight\projects\.egg-cache" +#</Location> +<Location /trac> + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all </Location> <Location "/svn/">

早速Apacheを再起動してmod_wsgiを有効にしたいところですが、その前にmod_wsgiから呼び出されるtrac.wsgiファイルを作成しておきます。

C:\TracLight\CollabNetSVN\httpd\cgi-bin\trac.wsgi

#!C:\TracLight/python/python.exe # -*- coding: utf-8 -*- # import sys sys.stdout = sys.stderr import os os.environ['TRAC_ENV_PARENT_DIR'] = 'C:/TracLight/projects/trac' os.environ['PYTHON_EGG_CACHE'] = 'C:/TracLight/projects/.egg-cache' import trac.web.main application = trac.web.main.dispatch_request

これで準備が整ったので、Apacheを再起動するとmod_wsgi経由でTracが使えるようになります。

しばらく使ってみましたが、偶にレスポンスが悪い事はあるものの、それ以降「ページの読み込み中にサーバへの接続がリセットされました」というエラーには遭遇していません。動作もだいぶ軽くなったように思います。ひとまず最悪の問題が解決できたので、これで快適にTracを使っていけそうです。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3258
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン