探検


★負荷軽減対策委員会(Perl、PHP)★

1ジークハルト ◆VUxx/EwNXI
垢版 |
02/10/15 10:33ID:ifgLRUyb
サーバ上にPerlやPHPを置く場合、何よりも重視しなければ
ならないのはサーバへの「負荷」。
負荷の高いCGIの使用は削除対象となるのが目に見えてます。
負荷を軽減させるにはどうすればいいか?
どういう書き方をすればいいか?
そんな委員会を開設しました。
02/10/16 16:00ID:???
>>82 を負荷軽減対策委員長に命ずる
02/10/16 16:49ID:???
SpeedyCGIはお手軽だねぇ
85nobodyさん
垢版 |
02/10/16 18:00ID:8AIPTE76
phpでメソッド呼び出したときの内部変数って、メソッドが実行し終わったら
unset()されるのでしょうか。

たとえば、メソッド内でファイルを読み込んだ入りして、
場合によっては$hogeのサイズが100k超えたりするわけです。

それから、HTMLに書き出す内容をすべて変数に入れちゃって、あとでまとめて
echoする方法をとっていたりすると、結構その変数のサイズ大きくなりますよね。

ご教授お願いします。
02/10/16 19:21ID:???
大量のレコードを処理するときは、一行づつ読み込こめば、軽くなるよ
んで、出力するのだけ、メモリに入れればオッケーと思います
02/10/16 21:33ID:???
小学生またまた乱入。
要するに、いろいろな要因の絡み合いだから、場合によってってところだね。
0)使用言語の選択
1)プログラム(スクリプト)の設計
1-1) メモリ領域
1-2) CPU時間
3)アクセス数
4)サーバのキャパシティ
5)他には?
これをうまく図で表せればいいですね。僕はまだ習ってません。


02/10/16 21:35ID:???
>>86
だから、軽くなっても長くかかるのはどうかなぁと。
アクセス数が少ないサイトなら重くても速いのがいいんじゃぁと。
02/10/16 22:25ID:???
まあアクセス増えた後自分の首絞めたいならどうでも良いよ。
90nobodyさん
垢版 |
02/10/16 22:33ID:vfA8qHJl
このタイトル、ひかれますね。
私は今、チャットの負荷軽減を頑張っています。
使用しているのはKENT-WEBのYY-CHAT。
現在は分割処理で
ログ表示CGI
フォーム部分CGI
書き込みCGI
退室CGI
入室前CGI
に分割させ、いらない機能はすべて取り外しました。
さらにこれから
(1)そのスクリプトをC言語化
(2)新規発言のみを読み込むJavaプログラムを追加
させようと考えています。
91nobodyさん
垢版 |
02/10/16 22:43ID:QZ0dtDWe
PHPですが、
$hoge = "<img src=\"$foobar\">\n";
と書くのと、
$hoge = "<img src=\"". $foobar ."\">\n";
と書く方法がありますが、
どちらがよいのでしょうか。

私は、エディタのハイライト機能で変数の色を変えていため、後者を使っています。
でもいっぱい変数を使う文字列だと、前者のほうが便利だね。
02/10/16 23:12ID:???
このスレの中で>>1は一度も役に立っていない
93nobodyさん
垢版 |
02/10/16 23:21ID:YIcW4FL9
>>91
単純に、後者の方が動作が速いとどこかで聞いた記憶があるので、
いつも後者にするようにしてます。
02/10/16 23:29ID:???
>>91
$hoge = "<img src='$foobar'>\n";
という方法もある(たいしたこと無いが
95nobodyさん
垢版 |
02/10/16 23:44ID:wbW/xBZm
書きやすいとか、なれている方でいいんでないの。
どっちが速いかなんて、体感じゃわからないでしょ。

ちなみに俺は
$hoge = '<img src="'.$foobar.'">';
こんな感じで書いてる。改行はつけないよ。
改行をつける場合は
$hoge = '<img src="'.$foobar.'">'."\n";
こんな感じ。他と分離させる。一目でわかりやすいから。
96nobodyさん
垢版 |
02/10/17 00:08ID:vMdIvLO8
>>88
1ぎょうづず読み込んでも大して長くはならないけど?
メモリがパッツンパッツンサバでも、メモリ空間を節約出来るから、結果的に早くなるんです
02/10/17 00:15ID:???
>>92
あはは
98nobodyさん
垢版 |
02/10/17 00:21ID:UE/uqZMn
>>96
漏れは掲示板のログファイルなんかは
1行づつ読み込んで、いるモノだけ配列に渡す。

インデックスのための小さなファイルなどは file()で一気に読み込む。

適宜使い分けている。

でも、上にもあるように、100KB位なら、一気に file() で読み込んでしまっても
いいのではないかと思ってしまう。

あとPHPで

while (!feof($fp)) {
  $buffer = fgets($fp, 2048);
}
とかやってるんだけど、
fgetsせずに行をスキップするにはどうしたらいい?
99nobodyさん
垢版 |
02/10/17 01:31ID:vMdIvLO8
>>98
100KBで一気にですか、、、すごいですね。。。
負荷軽減対策委員会という意味ではなしかと。。。

>while (!feof($fp)) {
>  $buffer = fgets($fp, 2048);
>}
>とかやってるんだけど、
>fgetsせずに行をスキップするにはどうしたらいい?

fgetcsvか、fseekしてfread。
100nobodyさん
垢版 |
02/10/17 07:49ID:???
たまに、初期設定で設定される変数の内容だけで、数十KBにもなるものがあるが、その方が問題だったりして。
02/10/17 09:04ID:???
>>92
あいたたた・・・

じゃせめてこのスレの内容まとめて
負荷軽減対策委員会の公式サイトでも起ちあげますか・・
102nobodyさん
垢版 |
02/10/17 12:39ID:CzH1ES8f
gzip処理をすると転送料は減りますが
サーバへの負荷はどうなると思いますか?
gzip処理をすることでサーバへ負荷がかかるとしたら
何kbを越えるくらいをめどにgzip処理を施すのが妥当でしょうかね?
例えば2kb程度を転送するくらいならgzip処理は必要ないでしょうか?
ご享受願います。
103nobodyさん
垢版 |
02/10/17 13:57ID:???
>>102
FEPか表示フォントの設定大丈夫ですか?
圧縮ファイルだって未圧縮ファイルだって転送時には
同じバイト列でしょ。
104nobodyさん
垢版 |
02/10/17 14:09ID:CzH1ES8f
>>103
すいません、意味が分かりません。
サーバの負荷を考えるとgzip圧縮処理は必要なのでしょうか?
105nobodyさん
垢版 |
02/10/17 14:11ID:???
>>103
2ちゃんねるのログ(300K)

サーバで圧縮(100K)

HTTPで転送(転送量1/3でウマー)

ブラウザーで解凍、表示
106nobodyさん
垢版 |
02/10/17 14:13ID:???
>>104
ケースバイケース
107nobodyさん
垢版 |
02/10/17 14:23ID:frKHjIQw
>>104
>>>103
>すいません、意味が分かりません。
禿同。
サーバ負荷軽減だけでなく、帯域の負荷を減らすことで
単位時間内のリクエスト数を伸ばすことが出来るのでgzipが
有効な場合もある。
108nobodyさん
垢版 |
02/10/17 14:32ID:???
>>104
転送「量」でしょ、ご「教授」でしょ。
日本語大丈夫ですか?って書こうかと思ったがよ。
漏れは、そんなに更新が激しいデータじゃなきゃ、
1回のgzipで何人分かができて、転送のためにファ
イルアクセスされる時間が減るから、gzipした方が
いいと思って言ったんだけどね。解凍するのは、
ユーザだから知ったこっちゃないし(藁
109nobodyさん
垢版 |
02/10/17 14:44ID:C3AsJ9gC
htmlの場合、gzに対応していないブラウザのために、
(ある程度のシェアがあると言われているMacのIEでも対応していないのがある)
無圧縮のやつも作らなくてはいけないのが不便

これとは別に、PHPで、出力をダイナミックに圧縮、非圧縮とかえるには
どうしたらいい?
110nobodyさん
垢版 |
02/10/17 14:54ID:???
>>109
 output_handler = ob_gzhandler
 
昔のバージョンだと駄目だが、4.2.xなら
Accept-Encoding: gzipの有無に依って
圧縮、非圧縮をダイナミックにおこなってる。
マニュアルみれ。
111nobodyさん
垢版 |
02/10/17 14:55ID:lo6hZWi4
>>108
gzip圧縮処理ってリアルタイムじゃないの?
(調べもせずにものを言ってみました)
112nobodyさん
垢版 |
02/10/17 14:59ID:???
>>111
リアルタイムはpopenとか使って出力をgzipにパイプしたときでしょ?
>>108が言っているのはgzip圧縮されたファイルのことじゃない?
113112
垢版 |
02/10/17 15:01ID:???
サイト丸ごとアップするときはtar+gzipでアーカイブにしてからアップしています。
アップ後はtelnetから解凍。
114nobodyさん
垢版 |
02/10/17 15:11ID:???
>>109
無圧縮のものも作った場合、どうやって振り分けているの?
「文字化けするようなら〜から入ってくれ。」と入り口に書いておくの?
115nobodyさん
垢版 |
02/10/17 15:20ID:???
>>114
ApacheのMultiView
116nobodyさん
垢版 |
02/10/17 15:25ID:???
>>110
サンクス
とりあえずスクリプトの先頭に
ob_start("ob_gzhandler");
を入れてみました。
117109
垢版 |
02/10/17 15:27ID:???
すんません
ブラウザ(モジラ)で確認してみたら、
Content-Type が text/htmlのままなんですけど。
gz転送されているのかな?
118nobodyさん
垢版 |
02/10/17 17:06ID:???
さあ?
119102
垢版 |
02/10/17 17:22ID:PB+UxjCo
>>108
ご指導、ありがとうございました。
享受の方は素で間違えていました。

gzip圧縮処理の流れは>>105さんの
分かりやすい説明どおりに把握しているのですが
まだ詳しい内容は無知なので理解できませんでした。
調べてみようと思います。
チャットのように更新の頻度が多いものについては
gzip圧縮はしない方がいいということですね。
120102
垢版 |
02/10/17 17:26ID:PB+UxjCo
連続の投稿ですいません。負荷軽減対策において、
NPHスクリプト化はやらないよりやった方がいいと思います。
あと、チャットにおいて私は負荷を抑えられると思い、
jcode.plをrequireしていません。(文章おかしくてすいません)
これは不具合が出るものなのですかね?
121nobodyさん
垢版 |
02/10/17 17:28ID:???
mod_gzip とか mod_deflate 使ってる?
122102
垢版 |
02/10/17 17:29ID:PB+UxjCo
>>121
mod_perlとか耳にしますがよく分からないのです。
共用サーバでも使用可能なのでしょうか?
123102
垢版 |
02/10/17 17:30ID:???
バイトの時間が来てしまいました。レジをうってきます。
ここはブックマークしておくのでまた、参考にさせてもらいます。
124nobodyさん
垢版 |
02/10/17 20:52ID:???
mod_deflate って 2.0 からなのか〜(残念
125K
垢版 |
02/10/17 20:55ID:???
>>111
俺は転送量下げるために自作したよ。
更新の少ないものはキャッシュすれば良い。
でも、mod_gzipで良いんだよな……。
つーか、ob_gzhandler知らなかったYO(自爆
126nobodyさん
垢版 |
02/10/17 21:22ID:???
>>116と同じで、俺もスクリプトの先頭でgzip圧縮転送をしている
ob_start("ob_gzhandler");
これは、html出力をバッファしてgzip圧縮して送信するものだから、
鯖側は圧縮の分負荷が高く、ブラウザ側も徐々に表示されず一気に表示する(少し待たされる印象)
その代わり、転送量が減る・回線が細くても多少マシという利点がある。
ケースバイケースだが、負荷を減らそうというスレの趣旨には合わないんじゃないか?
#つか、1行追加するかしないかだけの話だがね。
127nobodyさん
垢版 |
02/10/17 22:14ID:???
俺は試しにチャットのログ表示部をgzipしたけど、
表示は体感できるほど速くなったよ
リロードしても、ちらつきが無いと言うか、
圧縮無しだと、まばたきする感じなんだが、それが無くなった。
鯖負荷は、MRTGやTOPコマンドじゃ解らなかった。(多分ほとんど負荷無し)

チャットは計6部屋で共有鯖なら追い出される位の参加人数。
いちお、Perlでgzip対応ブラウザかどうか調べて、対応してたら圧縮してる。

でも、どっかのサイトに、「鯖に余裕があるならgzipをするべし」
みたいな事書いてたから、圧縮に多少負荷がかかるんだろーね
128109
垢版 |
02/10/17 22:14ID:???
>>126
マニュアルのコメントによると
For just a small bit of processor time, you can DRASTICALLY reduce the bandwidth requirement of your scripts. There are very few circumstances in which this should not be used.
っていわれてるけど
129109
垢版 |
02/10/17 22:15ID:???
それに、ブラウザでの表示の方法は、ブラウザのbehaviourじゃない?
130109
垢版 |
02/10/17 22:18ID:???
>>126
「負荷」はプロセッサの「負荷」も回線の負荷も両方考えるべきでは?
WebProgでは特に
131nobodyさん
垢版 |
02/10/17 22:21ID:???
ナローバンドのみ圧縮とかできる?
132126
垢版 |
02/10/17 22:54ID:???
>>130
そうだね。あとはメモリを無駄に使わないという所かな。

>>131
出来ない。家を出発前に渋滞を予想できないのと同じ(か?)
133109
垢版 |
02/10/17 23:09ID:???
>>131
鯖がナローバンドだったらわかるかな
クライアントならわからん
134nobodyさん
垢版 |
02/10/17 23:24ID:???
ホストで調べるとか…
ブロードバンド特有のホスト名が付いてるトコってあるじゃん?
調べまくって自分でデータベースを作る。
すっごい時間と労力がいるけどね…
135109
垢版 |
02/10/17 23:48ID:???
思いついた。

最初にアクセスしたときに、リモホをとってPINGしたりして
疥癬の早さを調べる。それでgzするかしないかを決めて、
その結果をクッキーで食わせる。

136126
垢版 |
02/10/17 23:58ID:???
UIがあるなら、圧縮転送する/しないを選択させれば良いじゃん。
CGI側で判断するものではないだろう?
137102
垢版 |
02/10/18 01:03ID:???
http://www.abi-station.com/
ここのAbicorporationという掲示板と居酒屋チャットというチャット、
ソース見ただけで頭が痛くなるのは俺だけだろうか。
138nobodyさん
垢版 |
02/10/18 01:13ID:???
>>137
それはABI言語で書かれていますw

ってかスレ違い?
負荷が凄そうって言いたいの?
139102
垢版 |
02/10/18 01:23ID:???
>>138
負荷がすごそうっていいたいのですw
シェアウェアで爆弾売ってるようなものっすね。

ちなみに俺がCGIチャットで一番、負荷をかけないのは
「ぞのちゃっと」だと思うのですがどうでしょう?
140nobodyさん
垢版 |
02/10/18 03:17ID:???
>>139
俺のチャットが一番軽いと思う。
PHPだし、面倒だから配布はしてないけど。
でも、現在のメンバーを表示すると重くなるね。
FlashやJavaAppletの方が良いに決まってるからsage。
02/10/18 09:48ID:???
CGIスクリプト&ログの、ファイル容量を減らすことって
負荷軽減につながりますかね?
02/10/18 09:51ID:???
>>140
FlashってCGI使ってないっけ?
143nobodyさん
垢版 |
02/10/18 12:46ID:GnEXGk2/
>>140
すごく興味があります。
ぞのちゃっとはC言語ですがphpはそれよりも軽いのでしょうか?
144nobodyさん
垢版 |
02/10/18 13:57ID:LQtlqqOK
>141
設計によるけど、単純に負荷軽減つながるはず
145144
垢版 |
02/10/18 13:59ID:LQtlqqOK
てか、、、、、、ほんと設計しだい
146nobodyさん
垢版 |
02/10/18 18:55ID:3gkhdVf3
今、2チャンネル型のスクリプトをPHPで作っているのですが、
やっぱりフロート型って、負荷大きいですよね。
(書き込む人夜読む人の方があっと言う的に多いので、)
htmlファイルを生成したのだが、名前部分のクッキーが読み出せない
仕方なくJSで読んだのだが、文字化け。
PHPで食わせたクッキーはJSで読むとうまくいかないのか?
147nobodyさん
垢版 |
02/10/18 19:15ID:???
>>146
化けない文字コードでクッキーを焼く。
ブラウザのお口に合うクッキーを食わせる。

など…
148146
垢版 |
02/10/18 19:52ID:3gkhdVf3
>>147
サンクス。MBCS関連充実してきたので、UTF-8で試してみます。
しかしまあ、urlencode-decode間でしてくれるうえにグローバル変数に自動的に入る
PHPに比べて、JSはめんどくさいですね。
149nobodyさん
垢版 |
02/10/18 21:31ID:???
JavaScript なのか JScript なのか……
150nobodyさん
垢版 |
02/10/19 00:01ID:???
JavaServletかもしれんぞ。
ま、146は単語もまともに打てないほどの面倒くさがり屋さんと言う事で。
02/10/19 01:35ID:???
>>150
いいじゃん、「あっと言う的」、2典に登録しようよ。

152nobodyさん
垢版 |
02/10/19 02:17ID:???
(≧∇≦)
153126
垢版 |
02/10/19 18:09ID:???
さがっているねぇ。この板の負荷にならないようにしているって事なのかなぅ(上出来
154102
垢版 |
02/10/19 23:31ID:???
ネタがないですねw
155\
垢版 |
02/10/20 10:09ID:ASG3cWoM
PHPの掲示板でログファイルが500kBあるんですが
消さないと負荷って凄いですか?
156nobodyさん
垢版 |
02/10/20 10:37ID:???
処理に依る。
157nobodyさん
垢版 |
02/10/20 10:38ID:???
>>155
あなたの「凄い」がどの程度なのかわからないけど、
その掲示板のコードにもよるんじゃない?

掲示板のログで500kbだと3000行近くなってるんじゃない?
読み込んだり書き込んだりするのに、3000回ループする様なコードを書いてるんだったら、
考えモンだね…

ファイル丸ごと読み込んでるんだったらメモリも食うし
02/10/20 11:59ID:???
>>21

キミ最高だね。ほんとアホ以外の何物でもない。しねよ。
159102
垢版 |
02/10/20 12:08ID:q/B8ESF1
すごい厨房な質問ですいません。
例えば500kb(300行)のログファイルがあって

open(IN,"ろぐふぁいるぱす");
@lines=<IN>;
close(IN);

というように配列に内容を入れた場合
ファイル丸ごと読み込んでることになるのでしょうか?
160nobodyさん
垢版 |
02/10/20 12:14ID:???
>>159
なる
161デフォルトの名無しさん
垢版 |
02/10/20 12:24ID:/npcfUW0
>>159
Perl初心者コーナーで一行ずつ読み込んで処理するのと
どっちが早いか議論してたさ。readで読み込むのも比較
してたで。2・3日前だっけな。

162nobodyさん
垢版 |
02/10/20 13:32ID:???
一行ずつ処理したとしても、Perlでは本当に以前に使っていた領域が開放されているかどうかはわからんな。
Perlを開発している人たちなら分かるだろうけど。
163nobodyさん
垢版 |
02/10/20 13:41ID:???
>>162
>以前に使っていた領域が開放されているかどうか

以前に使っていた領域って、変数のことだろ? 1行ずつ代入しては処理を
繰り返してるから変数に代入されてる分は領域だろ? 開放もなにもないだろ
164nobodyさん
垢版 |
02/10/20 13:43ID:???
>>163
C言語でも勉強してきて。
165164
垢版 |
02/10/20 13:47ID:???
ちなみに領域というのはメモリー上に確保した領域のこと。
166nobodyさん
垢版 |
02/10/20 13:58ID:???
>>164
>C言語でも勉強してきて。

( ´,_ゝ`) プッ
167nobodyさん
垢版 |
02/10/20 14:32ID:???
>>120
NPHスクリプト化でnph-chat.phpは可能ですか?
NPHはPHPでも使えるのでしょうか?
168nobodyさん
垢版 |
02/10/20 15:09ID:???
>>164
こういうことが言いたいのか?
http://www.mikeneko.ne.jp/~lab/perl/tuning/
169nobodyさん
垢版 |
02/10/21 20:11ID:???
mod_perl + gzip 最強
170nobodyさん
垢版 |
02/10/22 00:30ID:???
ふむふむ。
171nobodyさん
垢版 |
02/10/22 03:41ID:???
俺はZ80とかFortrunとか変な言語でCGI作るのが趣味なんだ
172nobodyさん
垢版 |
02/10/22 04:31ID:???
Fortrunという言語はたしかに変ですなあ。
173カミ
垢版 |
02/10/22 13:51ID:haL4weU7
キタ━━━━(゚∀゚)━━━━ッ!!キタ━━━━(゚∀゚)━━━━ッ!!キタ━━━━(゚∀゚)━━━━ッ!!
さあ、何でも聞いてよ。
174カミ
垢版 |
02/10/22 13:54ID:haL4weU7
カエッタ━━━━(゚∀゚)━━━━ッ!!カエッタ━━━━(゚∀゚)━━━━ッ!!カエッタ━━━━(゚∀゚)━━━━ッ!!
時間がなくなったので帰ります。
175102
垢版 |
02/10/22 15:04ID:nYDyJAf0
>>172
高度な突っ込みですね。
176あぼーん
垢版 |
NGNG
あぼーん
177126
垢版 |
02/10/22 15:38ID:???
>>175
じゃあ、Z80は言語じゃない、なんて突っ込みも許されるかひ?
178nobodyさん
垢版 |
02/10/22 16:10ID:???
>>171

Fortrun という言語について、詳しく教えて下さい。
179nobodyさん
垢版 |
02/10/22 18:50ID:???
>>177
Z80は言語じゃない、ガラスです
ttp://www.watch.impress.co.jp/av/docs/20021022/sharp.htm
180nobodyさん
垢版 |
02/10/23 13:13ID:dAD4Tigy
Perlの一般的なスクリプトの場合、
ログを読み出すとき出力を直接printで表示しているけど、
出力を$buffer .= "〜";というように一つの変数にまとめておいて
最後にprint $buffer;とした方が速いのかな。
imode用のスクリプトはContent-lengthヘッダを出すためにそうしてるけど。

変な日本語でスマソ
181nobodyさん
垢版 |
02/10/23 15:19ID:???
最初が表示されてから最後が表示されるまでは速いだろうが、
最初を表示するまでが遅くなるだけじゃねーの?

imode程度なら良いけど、メモリ食うだけじゃない?
182nobodyさん
垢版 |
02/10/23 15:53ID:???
>>180
2chのread.cgiがまとめて表示だったら嫌だ。
レスを投稿する


ニューススポーツなんでも実況