★負荷軽減対策委員会(Perl、PHP)★
サーバ上にPerlやPHPを置く場合、何よりも重視しなければ
ならないのはサーバへの「負荷」。
負荷の高いCGIの使用は削除対象となるのが目に見えてます。
負荷を軽減させるにはどうすればいいか?
どういう書き方をすればいいか?
そんな委員会を開設しました。 >>436
新しいhttpdの子プロセス上がった時とかキャッシュがないからでは?
重そうなモジュールは起動時に読み込むようにするとかして
コンパイル時間短くしたら?
speedyCGIで負荷が高くなると、InternalServerErrorが出るのですけど、
私の書き方が間違っているだけなんですかね? >438
mod_perl1.2使ってたとき、モジュールのキャッシュ無視して、別空間にロードされる場合も。
最近のバージョンで改善されているかどうかは不明ですが。
>>440
モジュールの更新日が変わってるとか%INC消してるとかでなく?
どうやってその現象確認しました?
>>441
初回にロードした時間を記録するクラス作って、何度かリロードして確かめた記憶が。
他にも、子プロセス関係で何かしたと思ったけど、忘れた。
%INC消さなくても、ロードされる時はされてましたよ。
ライブラリモジュールに限らず、同一ファイル、同一パッケージ名の空間も
複数のキャッシュが存在してしまうこともしばしば。
それ知って以来、mod_perlは一切使ってませんが。
で、最近のバージョンはどうなんでしょう? >>442
webDBで、mod_perlを導入したが、遅い。
まだSpeedyCGIの方がパフォーマンスが良い。
ただ、>>439 の言う通り負荷が高くなると不安定なんだよなぁ。
なんか回避方があったら、教えて欲しいよ。 >>443
私もWebとPostgresqlで組んでいるのですが、
mod_perlだと、速度のバラツキが尋常でなくて採用を辞めましたよ。
SpeedyCGIが安定さえしてくれれば、何も心配ないのですけどね。 >>444
DBI.pm使ってるからじゃないの?
それはmod_perlのせいじゃないような気が。 >>447
>>446じゃないが、DBIは遅い気がする。
あとDBIじゃなかったかな?サーバー名にIPアドレスじゃなくて
FQDN指定するとident投げるのって。
identが繋がらないとタイムアウトするまで固まるんだよな。 そういえば、PostgreSQLの日本語サイト見てたら、以外にも
Perl/CGIで利用しているところが多いのにビビりました。
DBMS使う以上、何らかの効率性を望んでいるのだと思うけど、何故Perl/CGIなんだと問いつめたいよ。
>>450
逆に、Perl/CGIだと何がだめなのか説明してみてください。 >>450
漏れはMysq;でPerl/CGIしてるけど、移植元がperlだったから単純に鯖の負荷軽減が目的だったりしたが・・・
それに、Phpだと複雑なソース書ききれんかったろうってのもあるわけだが、お前さんはなにでやれと? perlなんだが。
ある位置から数行くらい読み込む時、
10kbくらいのファイルと、300kbくらい(要するにでかい)ファイルでは
負荷に違いってあります?
open IN, ...;
for($i=0; $i<10; $i++){
$line = <IN>;
...処理
}
close IN;
みたいなプログラムでつ。 >>455
どうやって「ある位置」までファイルポインタを移動させるかに依る。
行単位で空読みさせて移動するよりは seek 一発の方が速い。
その例だとファイルの先頭からだから変わらん。 >>453
Perlで書けてPHPで書けない「複雑ソース」って何? >>457
最近あまり追ってないんだが、
PHPってtermiosによる端末制御できたっけ?
fork()は出来るけどpipe()は出来たっけ?
あと、PHPはスコープが滅茶苦茶だから(まぁPerlも変だけど)
あまり大きいソースを多人数で書くのには向いてないと思う。 >>456 サンクス
1行の文字数が不定なんでseekで飛ぶことが難しいんす。
2chログのように301-400だけ表示みたいな場合は
やっぱ空読みしてるんかな。 でもどうやってx行目を見つけ出すの?
適当にread系のcgiを漁ってみたけど、やっぱ空読みしてるみたいだわ。 >>462
1000行程度なら空読みでいいと思う。
万単位になったら、インデックスと作るとか対策考えろ。 >>462
1、行ごとのファイルポインタを記録してある。
2、一定件数ごとに、ファイルポインタを記録してある。
3、2chは入力値の長さが決まっているから、固定長フォーマットにしてある。
これだけのアクセス数があるところで、空読みは考えにくいな。
板のトップで、数千行単位で空読みされるのですか?
>>464
今は知らないけど、今までのVerでは思いっきり空読みしてるよ。
↓以前のread.cgi空読み部分。
else
{
if(nn_st && lineNo < nn_st) continue ;
if(nn_to && lineNo > nn_to) continue ;
if(nn_ls && line < lineMax - nn_ls) continue ;
}
ファイルのオープンってI/Oの負荷がでかいから、
ファイルポインタを記録/読出しするのも結構な負荷になる。
あぼーんの処理も面倒になるし1000行空読みの負荷がたいしたこと
ない(実際やってみ)事を考えると、大してメリットはないと思われる。
ちなみに2chは固定長フォーマットではないし、板のトップは書き込み時
に更新されるだけだから、read.cgiより呼び出される回数は圧倒的に少なく
それほど問題にならない気が。
useって宣言した場所によって読み込まれる時期が違うの?
それならJcodeなんかは先頭でuseせずに
送られてきたデータのチェック済ませてから読み込ませた方が良いのかな。
#チェックにJcode使うなら別だけど SpeedyCGIでどうやったら、負荷が高いときのエラーが無くなるんだろう。
もう訳がわからん。 >>471
負荷を軽減させるために、>>470がspeedyCGIを入れたんだろ。
ここは、負荷軽減の為のスレだよ。 PHPの掲示板なんですができるだけ負荷がかからないログの読み込み方法ってどんなのがありますか?
今は書き込みや読み込みの時にfile()で全部取得しているんですがログが増えると負荷が大きくなりそうな気がするので。 >476
ないですね!
逆に、なんでDB使うのいやなんですか?! >478
474が悩み事の矛盾に気がつかないからだよ! >>477
2ちゃん程度の規模でもDBなぞ使ってないんだが。
ていうか、逆に2ちゃんをDBで書き直したらえらい事になると思うが・・・。
普通のBBSって書き込みはFIFOだし、読み出しはシリアルだから
逆にDB使うほうが負荷が大きくなる。 DB使うのが嫌っていうか使ったことないので
DB使わずにfile()以外のやり方ないかと思ったんですが 「スレ読めよ」か。「スレタイ読めよ」と勘違いした。 >474
データ構造を固定長にしてバイナリファイルに格納しておき
fseek fread fwrite などを使えば部分処理が出来るから負荷は
減ると思うよ SpeedyCGIでエラーが頻発したので、PerlからCに移植した。
えらく辛かったが、めちゃくちゃ速くなった。 apacheの軽量化が威力あると言うが、
具体的にどういったモジュールを消せば良いのだろう。 >488
とりあえずスレ違いと思われ
スクリプト上で解決可能な話題が主題かと思う 人よりちょっと知識の多い香具師が少ない香具師を馬鹿にするスレはここですね。 >>490
apacheもスクリプトも両方チューニングして、
「負荷軽減対策委員会」と呼べるような気がするのだが… >>1を見る限りそうとは思えないけどな
方針変更という事で・・・ Apacheのチューニングはスクリプトの有無や出来とは関係なく
できることだし、別問題じゃないか? 足りない?
mod_mime_magic,mod_dir,mod_auth,mod_access,mod_cgi,mod_log_config,(mod_env)
(mod_perl)
>>501
速度重視ならDSOを使わな方が良いという話で良い?
>>502
そういうこったな(w
>>501
「あぱちのmoduleとして動作させると」とか
書いとけばつっこまれなかったのにな 素直に専用鯖借りてmod_perlとgzip圧縮でも使いなさい。 変数より定数使ったほうがやっぱ軽いのかなぁ・・・
あとは定数と直接数値を書き込むのはどっちが軽いのだろうか >>509
ぐだぐだいう前にベンチしろ、このヴォケが
ね、みんなローカルでPerlをテストする時、何のソフト使ってるの? Winで簡単なPerlだったらプロンプトで十分だけど。
Perlを始めよう、ならエディタから直接プロンプト起動できるし良い。
俺はtxt,HTML,Perl,PHP,SQL,C,Java,XMLなど全部ひとつのエディタで
やりたいからEmEditor3を使ってる。 ね、みんなローカルでPerlをテストする時、何のソフト使ってるの??
自分は
エディタ・・・秀丸
ブラウザ・・・アパッチ 特に深いことは考えてない。
エディタ:QX(慣れてる&コマンドラインに渡せるから)
サーバー:ANHTTPD(既に入れてたから)
なんだけど、やっぱ、アパッチの方がいいかね?
……スレ違いだけど、この話題続けていいもんかね。 負荷軽減にはあまり関係ない。
エディタはPerlエディタスレ、サーバ話は何処が良いんだ。
無難に初心者質問スレでも薦めておくか。
ところでブラウザがアパッチって凄いな。
あ、ごめん、サーバの間違え
>>512がブラウザ?って・・・
テストサーバーで、JAVAみたいに「;がありません。」など、
エラーの内容を出力してくれるサーバーって無いの? >>521
例えばCGIでエラーを標準出力に表示するのは? >>522
え?そんなのあるの?知らなかった・・・・
やり方は? >>523
言語にもよるけど、rubyならこんなかんじで
begin
# 例外が発生する可能性がある処理
rescue 例外
puts "#{$!} (#{$!.type})"
puts $@.join("\n")
end
perlはよく知らないけどこれでできるかな?
eval 'なんかの処理';
print $@ if($@);
巷に出回る perl CGI って、
1. グローバル変数多し、my レキシカル変数使わず
2. 関数分割せず、ベタ書き
3. ヒアドキュメントを使わず、print '' の嵐
なものが多い。こんな手法が負荷軽減に貢献すんのか?
意見求む。 >>526
> 2. 関数分割せず、ベタ書き
について負荷軽減との関連性についてのご教授お願いします。 軽減はしますよ。
でも、HTML を軽くするために、すべての改行を取り払ってサイズを小さくしよう的な
アプローチですにゃ。そこまで必死な人は、すればいいにゃ。 ベタ書きのほうが負荷はかからないのは言うまでも・・・ ブラウザゲーム作るならやっぱりphpのほうがええかな? >>531
負荷を考えれば、そうだけど。
普及を考えれば、どうかにゃあ。
ヒアドキュメントってprint"と変わらないんじゃなかったっけか? ケース1:print 文の嵐
print '<HTML>';
print .........
print '</HTML>';
ケース2:print 文いっかいだけ
print '<HTML>
.......
</HTML>';
ケース3:ヒアドキュメントで print 文いっかいだけ
print <<'END of HTML';
<HTML>
.........
</HTML>
END of HTML
こういうのを比べてるってこと? ヒアドキュメントかどうかは関係がないと思うけど。
ケース2とケース3は、(ヒアドキュメントの末尾の改行を除けば)等価でしょ?
じゃなかったら首つるです。
違いが出てくるとすれば、パース・・構文解析にかかる時間。
それも有意差は出ないでしょう。
異論ありますかにゃ?