2004年10月09日
MapServerのパフォーマンス
MapServerのPerl-APIでの操作を覚えるついでに、パフォーマンスを調べてみた。
やってみたのは、一昨日のサンプルにあった、皇居を中心とした地図サンプルのMAPFILEを使って、PerlのAPIからMapScriptオブジェクトを取得し、ついでにランダムに経度で0.05度以内程度東西にふった地図画像を表示する、というもの。
データソースとしてSHAPEファイルのみを用いたものと、一部のデータはPostGISを用いたものを準備。
いずれもPerlのレイヤーでFastCGIで3プロセスあげて動かして、MapScriptオブジェクトはその中で永続化してる(ソースはこちら)。
もっともMapScript側の内部処理がどうなってるかよく判ってないので、それがパフォーマンスにどう影響してるかは判らないけど。
CGIベースCバイナリ版のMapServとのパフォーマンス比較もすべきだけど、絶対2パラメータ以上のQUERYSTRINGが必要であるにも関わらずApacheBenchがQUERYSTRINGが2パラメータ以上だとうまく動かせなかったので、今回は割愛。
ApacheBench、動かせました。
URLをダブルクオートで囲むだけでよかったみたいですね。
結果は続きで報告。
で、やってみた結果は、
SHAPEファイルをバックエンドに使ったものだと、大体秒あたり5〓6アクセス処理できる。
これはまあ仕方ない…FastCGI使ってるんだしもっと出て欲しいけど、もとのサーバがしょぼすぎる(Pen4-3GHz、DDR512MB、HD120GB、回線NTTの100Mbps…しょぼいといってもこれが「新サーバ予定機」なのが悲しすぎるけど…)から仕方ないと思う。
けど、一部にPostGISを使ったものだと秒あたり2〓3アクセスしか処理できない。なんで?
おそらくは、アクセス毎にDBへのコネクションを貼り直しているからだと思う。
FastCGIでMapScriptオブジェクト自体は永続化してるけど、その中でのDB接続のプーリングはしていないのだと思う。
今回の場合データが東京23区内の道路データのみPostGIS化と、データ量が極めて少ないので、大量データをDBで扱う事の処理速度向上より、DB接続を繰り返す事による処理速度低下が上回ったのかな。
おそらくデータ量が増えるにつれ、SHAPEファイルの速度がPostGISの速度を下回ると思うんだけど、ただ問題は、SHAPEファイル〓PostGIS間の相対的な速度はPostGISの方が速くなっても、「データが非常に増えている」状況では、絶対的速度としては今回出た「秒あたり2〓3アクセス」を上回る事はないんじゃないか、という事。
これじゃあ困るよなあ…。
4.4以降ではMapServがFastCGIに対応して、DB接続のプーリングも行ってくれるという事なわけだけど、そうすると少しは改善されるのだろうか…?
他にも気になる事3点ほど。
1.PostGISを使う場合のMAPFILEなんだけど、
LAYERみたいなふうになっている。
NAME "道路"
CONNECTION "user=XXXX password=XXXX dbname=XXXX host=localhost port=5432"
CONNECTIONTYPE postgis
DATA "the_geom from dourokukan"
〓中略〓
END
つまり、DBへのコネクションの設定は、ファイル単位じゃなくて、レイヤー単位で設定されているという事。
これってもしかして、本当はアクセス毎にDBに接続どころか、同じアクセスの中でもレイヤー毎に接続してるって事なんだろうか?
ちゃんと同じ接続文字列なら、せめて同一アクセス内くらいは同じ接続の使い回し、とかしてくれてるのかなあ?
2.同じくMAPFILEでのDB設定で気になるところだけど、今度は
DATA "the_geom from dourokukan"の部分。
データ量が増えたとき、SHAPEファイルでなくDBの方が早くなると思われるのは、SHAPEファイルが必然的に全データをメモリ内に読み込まないといけないのに対し、DBだと空間インデックスを使って、必要な部分だけ即座に取得できるから。
その空間インデックスによる抜き出しを怠って、全データを読み込んでしまうなら、DBだってSHAPEファイルだって変わりはない(と、思う)。
でも、上の検索条件文字列の設定だと、明らかにSQL文の一部っぽいけど、検索範囲を制限するためのWHERE句にあたるようなものが全く設定されていない。
これは…MapServerが内部で勝手にEXTENTパラメータ等からその辺を補完したSQLを発行してくれるのだろうか?
或いは、自分で指定しないといけないけど、これは飽くまでサンプルだからその辺のややこしいあたりは省略されているのだろうか。
3.Perl-APIのドキュメントを斜め読みながらざっと目を通したけど、MapScriptが生成した画像を、オンザフライで取得する方法が全く見つからない。
直接mapscript.pmのソースを覗いてみても、そんなのはないっぽくて、いちいち一旦一時ファイルに出力して、それを開いて読み込まないと、メモリ内に生成された画像を読み込めないみたい。
ただでさえ全体的に遅いのに、そんなこんなでいちいちディスクI/Oが発生していたんじゃたまったもんじゃない。
何とかならないのかなあ…。
そんなこんなで、まだまだ前途多難のMapServerでした。
[追記]
追加実験した、CGIベースCバイナリ版のMapServでのパフォーマンス。
SHAPEファイルベースだと、大体秒あたり4弱〓4強アクセス。
PostGISベースだと、秒あたり2強から、ひどい時では1出ない事も。
Perl-APIでのFastCGI版だと表示位置の移動も実行してるし、画像の受け渡しにディスクI/Oも発生してるだけに、やっぱりプロセスが起動しない分FastCGIの効果は絶大。
これでもうちょっとDB周りとかさえ速くなってくれれば…。
[composed and posted with ecto]
Excerpt: kokogikoさんのサイトで、MapServerのパフォーマンスを調査しており、興味深い情報を公開していただいています。そのなかでMapServerの動作にたいする疑問点を3点ほど提示しています ...
Weblog: 中村区アディクト
Tracked: 2004年10月09日 18:59
インストールしてないんでソースだけ眺めてました。
PostGISからのデータ取り出し
PostGISからのデータ抽出は出力範囲を使用して
geom列 && 'BOX3D(XMIN YMIN, XMAX YMAX)'::BOX3D
という条件を使用しています。空間インデックスがあれば使ってくれるようです。
これに加えてFILTERに設定された条件とANDでWHERE句に設定されています。
画像出力
ファイル名を空文字にすると画像はSTDOUTに吐くようですけど、それじゃ駄目でしょうか?
![[ここギコ!]](http://kokogiko.net/logo.png)



・滝川クリステル?(DatingGenious)
・コンピュータは2進法が効率的でとかいう話(XAGary)
・コンピュータは2進法が効率的でとかいう話(とおりすがり)
・ジオメディア忘年会行ってきました(宋さんへ:kokogiko)
・コンピュータは2進法が効率的でとかいう話(kokogiko)
・コンピュータは2進法が効率的でとかいう話(まぐろ)
・コンピュータは2進法が効率的でとかいう話(名無し)
・コンピュータは2進法が効率的でとかいう話(dokasen)
・コンピュータは2進法が効率的でとかいう話(dokasen)