CGIとSSIどっちが重い?

[上に] [前に] [次に]
Phine 2000/03/21(火) 08:54:33
アクセスカウンタなどをつけるときに、
ページ全体をCGIで出力するのと、SSIを使うのとでは、
どちらの方がサーバーへの負荷、ユーザーの体感度などが
重くなるのでしょうか。ご存知の方教えてください。

フシギバナ 2000/03/21(火) 10:26:16
ちょっと関係ないかもしれませんが、
>ページ全体をCGIで出力する
これは、あまりお勧めできません。
サーバーの高負荷時、CGI起動が結構コケますので、ページそのものが見れなくなります。
つまり、たかがカウンタ値の為に、本来のページが見れなくなる可能性があります。

通常、CGIカウンタからSSIカウンタに替えるとカウント値がかなり増えるみたいなので、SSIカウンタの方が負荷が高い?

まさし 2000/03/21(火) 10:42:54
>通常、CGIカウンタからSSIカウンタに替えるとカウント値が
>かなり増えるみたいなので、SSIカウンタの方が負荷が高い?

なんか文章が矛盾しているような気がするんですが。。。(^^;
普通、負荷が低いほうがカウント数が上がるのでは?

SSIにしてもCGIにしても、カウント自体の処理はほとんど同じでしょう。
だとすれば、一回HTMLを舐めなければならないSSIの方が重いと思うのですが。

もと。 2000/03/21(火) 12:01:20
まさしさん
>なんか文章が矛盾しているような気がするんですが。。。(^^;
>普通、負荷が低いほうがカウント数が上がるのでは?
SSIカウンタの方が呼び出される回数が多いので
負荷が高いと言っているのでは。
文章そのものが表示される速度はSSIの方が遅いでしょうね。

びーだま [E-Mail] 2000/03/21(火) 17:49:24
CGI の場合
リクエスト -> CGI実行 -> CGIページ表示

SSI の場合
リクエスト -> HTML解析 -> SSI実行 -> HTML挿入 -> ページ表示

実行部がほぼ同じならば、解析と挿入が必要な分だけ一般的には
SSIの方が遅いでしょうね。特に解析処理は、WEBサーバーの負荷
にダイレクトに響きますので、SSI解析を行う拡張子を限定されて
いたりするのは、このためです。

ただし、CGIでページ全体を呼び出すということになると、SSIなら
実行部で必要なファイル入出力はカウンタファイルの1つで済むと
ころを、CGIですと作り方にも依ると思いますが、メンテナンス性
を考えて、本文とカウンタ用に最低2箇所の入出力が必要になると
思われるので、実行時一番時間と負担のかかるファイル入出力が
増えることで、SSIのオーバーヘッド分は相殺されてしまうと思い
ます。

結果として、あまり変わりはないんじゃないかと思います。
少なくとも、体感は出来ないのかなと思います。確実に言えること
は、単純なHTMLリクエストと比べれば、どちらも数倍以上重い処理
です。

ユーザーの事を考えてページ全体の出力を重要視するなら、<IMG>
タグを使った挿入型のCGIカウンタにしておくのが無難なんでしょう
ね。。

これでは画像表示をしない場合がカウントされないとか、CGIが転け
る場合もあるという事もありますが、1ページだけに着目した曖昧な
カウントなら鼻から適当で良いんだという考え方もありますし、

ログの精密度にこだわるなら、SSIやCGIで出力するより、HTTPログ
の集計を行うことを考える方が良いと思います。

Phine 2000/03/22(水) 06:19:04
フシギバナさん、まさしさん、もと。さん、びーだまさん、ありがとうございます。
ただ、<IMG>タグでCGIを呼び出すと、CGIで画像連結をしないといけないと思います。
これはいかにも重そうな感じがするんですけどどうなんでしょうか。
今はとりあえず、このようにしています。↓
  <SCRIPT LANGUAGE="JavaScript">
  count = '<!--#exec cmd="./counter/counter.cgi"-->' ;
  digit = count.length ;
  for ( i=digit-1 ; i>=0 ; i-- )
  { document.write('<IMG SRC="image/' + count.charAt(i) + '.gif" ALIGN=right>') ; }
  for ( i=digit ; i<6 ; i++ )
  { document.write('<IMG SRC="image/0.gif" ALIGN=right>') ; }
  </SCRIPT>
同じことができるなら少しでも軽くしたいと思っているのでJavaScriptと組み合わせてみました。

もと。 2000/03/22(水) 07:10:38
JavaScriptをOFFにしていたらカウントアップされませんので、
IMGで呼び出した方がよいかと。
CGIが重くてもHTMLそのものの表示には影響しませんし。
JavaScriptは遅いですしね。

びーだま [E-Mail] 2000/03/22(水) 08:12:20
軽くしたいのであれば、SSI でテキストカウンタにするのが
手っ取り早く最も軽いとは思います。

たとえば、私が取り付けている SSI カウンタはただ数えたい
だけの時にはこんな単純なものです。

$counter = 'count.dat';
open(COUNT, ">> $counter") || die;
print COUNT "\0";
close(COUNT);
print sprintf("%05d", -s $counter);
exit;

上記のJavaScript様なことで満足できるなら、SSIで IMG タグ
まで出力してしまうの方が効率が良いと思います。

びーだま [E-Mail] 2000/03/22(水) 08:17:32
ちなみに、上記のスクリプトはカウンターの仕組み
としてはあんまり見ない方法を採っています。

意外と目から鱗って感じかもしれません。

ファイルに1バイトづつ追記していくタイプなので、
カウンタファイルが壊れにくいことと、ファイルを
読み出さずに、ファイルテストでファイルサイズを
調べるだけなので、単純に速い。

Phine 2000/03/22(水) 15:44:21
もと。さん、びーだまさん、ありがとうございます。
JavaScriptオフの人がいることをうっかりしてました。
とりあえずSSIで<IMG ALT>を出力する方法で行こうと思います。

びーだまさんのカウンタ上手いですね。気づきませんでした。
Windows2000+IIS5+ActivePerl5.22 でテストしたところ、ファイル操作のみにかかる時間が0.数ms速いようです。

解決とさせていただきますが、もしCGIで画像連結する軽い方法がありましたら教えてください。

Phine 2000/03/22(水) 15:46:28
[[解決]]
マーク忘れてました。

もと。 2000/03/22(水) 19:25:24
もし画像カウンタを使いたいのであれば、
IMGで呼び出せば、いくら処理が遅くても問題にならないので、
SSIを使うより個人的に良いと思いますが。
連結しなくてもIMGで呼び出すことも出来ますし。
びーだまさんの方法は以前ファイルロックについて
討論されていたときに見かけました。

Phine 2000/03/23(木) 07:11:51
連結せずにIMGで呼び出すというのはどうすればいいのでしょうか。
よろしければ教えてください。

もと。 2000/03/23(木) 08:59:13
<IMG SRC="xxx.cgi?figures=1"><IMG SRC="xxx.cgi?figures=2">
...
というふうに呼び出し、
figures=1が渡されたときだけカウントアップして、
たとえばカウント数が 254 の時、
figures=1 2用の画像(2.gifとか)を返す
figures=2 5用の画像を返す
figures=3 4用の画像を返す
のようにすればいいかと。
ちょっと説明が悪いのでわかりにくいかも知れませんが。

ただ、何度も言いますように、
画像を連結するのが一番良いかと思います。
たとえ処理に10秒かかるCGIでもIMGで呼び出せば問題になりませんし、
画像連結はそんなに重いものでもありませんので。

フシギバナ 2000/03/23(木) 09:26:33
>連結せずにIMGで呼び出す〜(もと。さんの説明のやつ)
これはお勧めできません。
桁毎の排他と当然多数アクセスの排他を考慮しないといけないので、排他処理の嵐になります。

ですので、カウンタ表示が非常に遅くなり、メリットはありません。
しいて上げれば、カウンタGIFを桁毎に変えられるぐらいかなぁ...。

もと。 2000/03/23(木) 09:43:50
えぇ、私も重いと思いますが、
>桁毎の排他と当然多数アクセスの排他を考慮しないといけないので、排他処理の嵐になります。
これは必要ないかと。
最初にカウントアップしたときだけロックすればいいので。

>ですので、カウンタ表示が非常に遅くなり、メリットはありません。
えぇ、ですので画像連結の方を強くおすすめしています。

>しいて上げれば、カウンタGIFを桁毎に変えられるぐらいかなぁ...。
以前JavaScriptを使ってカウンタを時計に変えたり、
日付を表示したりするために使用したことがありますが。

Phine 2000/03/24(金) 11:31:50
もと。さん、フシギバナさん、ありがとうございます。
今から画像連結のやり方を調べてみようと思いますけど、もしご存知でしたら教えていただけませんか?

[上に] [前に] [次に]