★負荷軽減対策委員会(Perl、PHP)★
あのー、 Perlで、myやlocalをほとんど使っていないってのは、 どのくらいの負荷要因でしょうか?ベスト1? >>278 それで変数のコピーを抑えれば効率的と言えるかも。 >>278 perlの実行ファイルで既に1M近くあるし、モジュールとか読んだら、 もっと増える。 気にするやつは馬鹿。自己満足。知症。 たとえれば、ボルトを全部チタンにして100gの軽量化に成功!とか言ってる 車オタと同類。 プログラムとデザインをわけようとして、 テンプレート読み込み型のデザインをしていたんだけど、 そのせいなのかなー、急に重くなった気がする >>283 データ更新の機会がそれほど発生しないものならば、動的にHTMLを生成する のではなく、データ更新時、静的HTMLを随時生成するのに切り替えるのも一つの 手かと。 Perlで3MくらいのCSVを読み書きするのって、 かなりの負荷? あと、ここのみなさんは、どうして負荷について知識があるんでしょうか? 経験上? >>291 一回しかやらないのなら 大した負荷にならないが BBSのログとかだったら負担になるかもね >>291 DBM使え。簡単だぜ。 郵便番号ファイル(郵政省--いま何たっけ--の)で速度5倍だぜ。 http://www.ichikoro.com/webp/bk/00060.html のベンチマーク。 あれ、2Mくらいじゃなかったっけ? >>288 そうそう。よほど非常識なことをしなければ、スクリプト言語で効率を考えるのはナンセンス。 >>296 >>295 にあるように効率はいつも考えるべき。 >>297 そうだね。コードの一つ一つで効率を考えることによって、 全体としてそうとうの負荷軽減になる。例えば、 http://www.mikeneko.ne.jp/ ~lab/perl/numerical_transform/#h4を ベンチマークで検索してみれ。 >>292 そうかー、ちょっと反省。 ところでどなたか、↓の質問答えてほしいです。。。 >あと、ここのみなさんは、どうして負荷について知識があるんでしょうか? >経験上? あと、負荷軽減について詳しい本(の一部とか雑誌でも)ないでしょうか? 負荷がどうとかと言う人ほど、use strictしたままリリースしそう。 use strict すると負荷がかかるんですか? >>302 検査する時間が増えるだろ、アクセスごとに検査させるのか。 Cでいえばassert有効にしたままリリースってのに似ているな。 わざとそうしている人もいるみたいだけど・・・ 負荷を測るのってどうすればいいの。 自分のPCで動かしてもよーわからん。 メモリについて質問させて下さい。 例えば $x="abc"; の後、 $x=""; という記述なしに $x="def"; とした場合、メモリは、 abcの○○○分と、defの○○○分の ○○○○○○分が確保されてしまいますか? $x="abc"; $x=""; $x="def"; にすれば メモリ確保は○○○だけになると思うのですが。 >>307 たぶん・・・ 変数へ上書きしたら、ちゃんと初期化(開放)してから、 代入してくれると思ふ。 >>308 そうですか。 では$x="";は無駄ですね。 ありがとうございます。 Perlは最初に確保したメモリ空間を開放しません。 たとえ、ゼロに初期化しても。undefなら別。 http://www.mikeneko.ne.jp/ ~lab/perl/tuning/ >>310 すんまそん。 メモリ確保を解放するかしないかは分かります。 メモリ確保は○○○分で済むのか、○○○○○○分確保してしまうのかを聞きたいのです。 詳しく知りたかったら、Perlのソースを読むしかないと思うけど。 >>315 >>310 の記述を見ると、3バイト分しか確保しないように思えたけども。 apacheのログ2,3日分。約4M。PHP。極貧マシン。 while & fgets & copy -> 処理50秒前後 メモリ使用4M前後 CPU100% file & foreach(or list&each) & copy -> 処理60秒前後 メモリ使用15M前後 CPU100% fread & copy -> 処理0.5秒前後 メモリ使用4M前後 CMP100% ━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━― ファイルをコピーする時って open(IN,"Src.txt"); #コピー元ファイル Src.txt をオープン while(<IN>){ # 一行毎の読み込みループで変数$Bufに読み込む $Buf .= $_;} close(IN); #ハンドル IN が不要になったので閉じる ◇デソースに書き出す open(OUT,"> Dst.txt"); #コピー先ファイル Dst.txt をオープン print OUT,$Buf; #ソースの内容($Buf)を書き出す close(OUT); のように一行ずつ読み込んでく場合と @line=<IN>; みたいにいっきに配列に入れてしまうのはどちらが処理としてはいいのでしょうか? >>324 open IN, '<' . $src or die; open OUT, '>' . $dst or die; my $buffer_size = 1024; # 適宜調整 my $buffer; print OUT $buffer while read IN, $buffer, $buffer_size; close OUT; close IN; >>325 さん それが最適なのですか。 勉強になります…。 サイズ1024は何を意味しているのだろう… >>326 1024 byte は 1 kbyte だろ? コンピュータの基礎じゃねえか。 ま、俺だったらFile::Copyモジュールを使うかも。 バグがあるかも知れないソース書くより楽だし。 my $buffer_size = 1024; # 適宜調整 すいません。 これを記述することで何が得なのかを知りたいのでした。 >>329 実行エンジンにもよるんだけども、メモリを確保する場合、8byte単位とかそういうのが多いから (アライメント)。 Perlだとどうだか?って気もするけども。 >>329 微妙に意味がわからんな…… 推測をして回答してみる。 1.$buffer_sizeを設定することで、何バイトずつコピーするのかの設定が可能になる。 この数値を小さくすると、コピー回数が増えるが、メモリーへの負担は減る。 この数値を逆にすると、その逆。 サーバーの具合を見て適宜調整することができる。 2.わざわざ変数を一つ設定することの意味は、変数の名前をわかりやすくすることで、 その変数が何に使われているのかをわかりやすくする。 「昨日の自分は他人」の言葉どおり、後から見た時になんでその数値にしたのか等が判断しやすくなる。 何が聞きたいんだろう…… 3. 設定(定数)と実働部分はできるだけ分離する。 >>324 のコード片がスクリプトのどこに埋もれていても、 変数 $buffer_size としてスクリプトの頭の方で定義しておけば 簡単にバッファサイズを変更できる。定数で埋め込んでしまうと 変更したい時にいちいち探し回る事になる。 Perlは最適化とかしないのかな? @buf = <IN> のほうが早かったりして。 open(IN, $src); open(OUT, '>'.$dst); print OUT while(<IN>); close(IN); close(OUT); こう書くかも。 readで読み出すバイト数は多い方が速いと思う。当然だけど。 ただ多過ぎるとそれはそれでメモリくったり。 >>335-336 ベンチ取れば分かる事だが、@buf = <IN> はメモリを一気に 確保する = System CPU time を食う。行入力演算子による 取得は「行末」を探す = 可変長入力なので潜在的に read より遅い処理。もちろん扱うデータのフォーマット & 量次第 だけどね。 どうしても行入力演算子でやりたければ $/ = \1024; while (<IN>) { ... } で 1024 byte 単位で読めるけど、素直に read 使った方が 速かったかと。 たしかにそうですね。 改行コードを探しながら進むので遅いと。 ∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉 ファイルの書き込みを追記にしたばあいの負荷ってどうなるんですか。 たとえば書き込むものは同じとして、 追記先のファイルが1行のときと1000行のときでは CPUメモリ負荷はどうなるんでしょう。 追加するだけだから大して変わらないかなと思ったんですけど。 $kazu=(((($my_tech-int(rand($my_tech/4)))*$job_dmg[$job])*$tarou)/$mstamina)*$stamina; このように一気に計算させるのと、 いくつもに分けて計算させていくのでは 負荷は変わるのでしょうかね? 変わるのならどちらが軽いと思いますか? >>341 追記の場合、元のファイルの大きさはほぼ影響しない。 Cをやっている人間ならわかる(はず)だが、 追記と言うのは、ハードディスク上のファイルの終端を探し出して、 そこから新たなデータを埋めて行き、最後にファイルの大きさを示す数値を変更する作業だ。 従って、ファイルの終端を探し出す作業だけが、ベンチマークに影響する。 >>343 メモリの占有率を調べたいなら、そういうソフト入れてベンチマーク取ればわかる。 そして結果を発表すると皆から感謝される。 むしろ、その式は人間が見やすいかどうかを考慮した方がいいと思う。 下記の中で最も負荷が少ないのはどれでしょうか? 1.printを使い一行ずつ出力 2.ヒアドキュメントで出力 3.別ファイルを作り読み取らせて出力 3は後々便利そうだけど、負荷が気になる…。 >>346 負荷が少ないって、どっちの? 「省メモリ」? それとも「CPU占有の少なさ」? >>346 >3.別ファイルを作り読み取らせて出力 >3は後々便利そうだけど、負荷が気になる…。 じゃあ外部ライブラリとかあまり使わない方がいいよ。CPANもね。 >>346 1.出力処理が遅い。 2.出力処理は早い。 3.良識ある人間のやること。 一般に、メモリ占有量の低いものの方がウェブには向いているよ。 >>350 そうか?次々とくる要求に迅速に対応するために処理速度を優先しない? webプログラムは、サーバへの負荷も気をつけないといけないと思うけど、 それよりも、トラフィックを一番に考えてる俺は間違ってますか? そんな細かい事ぐらいでサーバーから言われる事はまず無いので 私も処理速度を優先させるべきだと思うねぇ。 というか、気にするほど大して変わらない。 基地外なほど膨大なデータを扱うならまだしも。 想定同時アクセス1000くらいの小さな案件で、 鯖を用意してやるなら、保守性を一番においても問題ないと思う。 >>355 >想定同時アクセス1000 これって小さいの? 秒間同時アクセス数1000ってことだよね? 共有メモリを活用する、繰り返し使用する正規表現はlexで、 大きなプロセスは常駐させてローカルソケットでCGIと通信してCGIは小さく作る、 データベースは下手に使わない、巧く使える場合にだけ使用する。 >>354 サーバーがつんでるメモリーの量によってどっち優先かは変わると思われ。 メモリー使い切ったらswapのオーバーヘッドがかかってかえって遅くなるし。 まあ、最近のサーバーはメモリーを湯水のように持っているからそんなこと考える必要ないのかな? Perl5からPerlでもコンパイルした状態で設置できるようになったと読んだんですがどうすればできますか? >>359 perlccを使う。 使ってどの程度早くなるかは知らんけれどね。 >>358 共有鯖ならいくらメモリ積んでいようと割り当てられるのは 微々たるもの >>360 散々言われてていることだが、perlccではモジュールはろくすっぽ使えないので注意。 >>360 早速やってみたところかなり速くなりました。 でもサイズが2kちょいから800kほどに... >>363 perlcc使ったことあるけど、2kじゃなくて2MBになったよ mod_perlだと数倍早くなるのに perlcc だと1割くらいじゃない? ダブルクオートを極力使わないだけで結構速くなるらしい。 理由は説明しなくてもわかるよね? >>368 '"'でくくると中に'$'が入っているかを検査してるから? >>371 Yes she does! PHP のメーリングリストなんかでも、 速度を少しでも稼ぎたいときの小技として紹介されることがあるね。 すべてのルーチンを一つのファイルにまとめてしまうのより、 ひとつひとつルーチン毎にファイルを分けて、 一度に呼び出す方が負荷が大きいですか? >373 漏れもそれ思うんだが、ファイルをまとめようが分割しようが、 結局たいした大きさじゃないので、どっちもオンメモリってことない? 使わないコードを解釈させない為に分割するんであって、 分割しても常に全部使うのなら、まとめた方がシステムコールが 減っていいと思う。 Perl だったら CGI.pm でやってる遅延読込が参考になるかと。 あれはあれでメモリ食いそうだけど。 >>375 それじゃ、useでモジュール呼び出すより、 requireで、必要な所で呼び出す方が良いって事ですね。 >>376 別に必要になったところでuseすればいいんでないかい? そうそう、SelfLoaderかまして起動時には一部しか読み込まれないように工夫しないといかんね。 requireはそこに来た時点で読み込まれる。 function hoge() { require('hoge.php'); } hoge(); らなければ読まない。 Perlも同じく。 コメントを山ほど書いたら負荷になります? スクリプト自体軽くした方がいいんでしょうか。 >>382 富士山ほどのコメントを書いたら負荷になります。 >>382 わかるほどの差は出ないからちゃんと書いといたほうがいいよ >>386 体感できるほどの差ではない、つまり実質0 正直言って、コメントなんか処理速度に関係なんかない。 そりゃ、数百Mとかのコメントとか入れてたら、 メモリへロードするのが遅くなるだろうが、 処理速度そのものは、何の影響もない。 え???? コンパイル時に無視されて、コンパイル結果もキャッシュされる わけなんだから、全く影響しないんじゃ? >>394 コンパイル結果に反映されないのは当たり前 コンパイル時に無視するためには最低限の判定が必要 要はコメントかどうか判定するフラグが少ないに越したことがないのか という話でしょ CgiPerl , CgiPHP , mod_php のうち速度が一番なのはmod_phpなのは知ってるけど 負荷が掛からないのはどれ? >>396 その中に、なぜmod_perlがないんだ? printで一行づつ出力するか、 変数にデータを入れて、printで一気に出力するかどちらが負荷少ない? それともヒアドキュメント使うか。 どれよ? >>398 そうそう、オレも知りたい。結構悩むんだよなー。みんな その辺の使い分けはどうしてるの? printよりechoのが速いってのは聞いた事あるけどね。 そういえばPerlにCのfflushのような関数はないのかな? $|=1;print "";$|=0;とやるしかない? >>398 変数作って一気に出力する。 エンコード自由に変換して掃き出せるようなものの場合はどうしてもこうなる。 ヒアドキュメントは $aya=<<EOL; あやや あひゃひゃ EOL で変数ぶち込めるし。 echo " うほっ いい男! "; これでいいだろ >>399 mod_phpも同じだ。 >>401 速度は、 mod_perl > mod_php > CGI Perl > CGI php の順。ちゃんと実験したサイト行って、見て来い。 >>408 >mod_phpも同じだ。 PHP可を謳っている鯖屋はmod_php可という意味で、CGI可(※)を謳っている鯖屋は、 CGI/Perl可という意味で謳っていると思うのだがどうだろうか? CGI可に比べてPHP可の鯖屋が少ないのは事実だが、mod_Perlを使える 鯖屋を見た事がないのは、漏れの調べ方が甘いからなのか・・・ ※)一般的にCGI=Perlという認識があるのでこのような書き方をあえてしたが・・・ つまり何が言いたいかと言うと、mod_php使える鯖がそんなに非一般的では ないんではないかという事だ。 mod_php っていう言い方、あんまきかないんだけど、 cgi版じゃない普通(というか一般的というか)のphpってこと? >>409 適当な拡張子をApache::Registry上で 動くようにする事自体はむずかしくないんだけど ユーザーのモジュールの名前空間に制限がかけれないので userAが use lib (/home/userA/lib/); use myPackage; としる状態で userBが use lib (/home/userB/lib/); use myPackage; とかしてくれちゃうと、動作がめちゃくちゃになってしまうので ユーザーにmod_perlな環境を提供できません(´Д`;) >>410 mod_phpでない場合(サーバー組み込みで無い場合) 「php対応(ただしコマンドライン版)」という表記をみかけます >>411 レン鯖(共有鯖)ではmod_perlを提供できないって事? って事は一般的な環境ではPHP>perlつー事? でもな、Perlには、FastCGIとかもあるからな。 >ちゃんと実験したサイト行って、見て来い。 ああいう非現実的な試行環境に統一して対照されても参考にできないよね、、 まだmsがやったベンチ結果のほうがdqnぽくない PHP5のケース別ベンチやってくれんかな 個人では実験環境が作れないしzendの情報だけでは激しく不安だし、、 話は変わって、itboostのtips「効率的な処理」に、phpのループ構造は遅いから、 コールバック関数を繰り返し呼び出すとphpではなくcレベルでループが走ってくれるて いいよってネタがあるけど、これはどうなん? (あれはcountを一度にすれば大差ないような気もしつつ、、。 個人で実行速度を計測するといえば、ループ処理のことだと言ってもいいかと おもうんだけど、これってphp特有の問題? >>412 ハンドラ好きにさせるのはもってのほかなので Apache::RegistryかApache::PerlRunを提供するしかないと おもうのですが、前述の問題があり、自分の知識内では 不可能と判断しています。 (他に良い方法がないか探してるのですが...) >>414 FastCGIも、共有サーバだとデーモンプロセス上がりまくりで 現実的では無いような気がしますが^^; >>ちゃんと実験したサイト行って、見て来い。 >ああいう非現実的な試行環境に統一して対照されても参考にできないよね、、 どこのサイトを見てるんですか? mod_perlとmod_phpの比較は、ここな。 http://www.linc.or.jp/ ~takaaki/Family/takaaki/Labo/dynamic_page.shtml >417 そのへんはコミュニケーションギャップを楽しむところだと思ったり。 __∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄ ageんでも保守はできるでしょ ?> <html><head><title><?=$title=></title></head> <?php と echo << end <html><head><title>$title</title></head> end; はどっちが軽いんだろうね・・・ >>428 私もそんな気がして、なるべく上の方使うようにしてる でも変数が多いところとかは下のやつ使ってる PHPに、テキスト中に変数があるかどうか判断させる後者よりも、 明示的にする前者がやっぱ速いかな?特に変数が多いほど。 でも、PHPモードに入ったり抜けたりする負荷(と言えるかな?)を考えると前者のような気もする… echo ' <html><head><title>'.$title.'</title></head> '; これでいいべ >>431 長い場合、echoを大量に書くわけにもいかんでしょ HTMLのフッタ部分は定型に近いから?><?phpを使ってるんだけど さほど変わらないのかなぁ・・・ >431-432 http://www.php.net/manual/ja/language.basic-syntax.php にもあるとーり結局内部的には echo で処理されてるから あとは可読性の問題じゃないかねぇ。 ∧_∧ ∧_∧ ピュ.ー ( ・3・) ( ^^ ) <これからも僕たちを応援して下さいね(^^)。 =〔~∪ ̄ ̄ ̄∪ ̄ ̄〕 = ◎――――――◎ 山崎渉&ぼるじょあ mod_perlで動かすと、速いときはバカみたいに速いが、 遅いときはイライラするぐらい遅い。 普通こんなにバラツキがあるものなのですか? >>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は、(ヒアドキュメントの末尾の改行を除けば)等価でしょ? じゃなかったら首つるです。 違いが出てくるとすれば、パース・・構文解析にかかる時間。 それも有意差は出ないでしょう。 異論ありますかにゃ? >>535 ttp://boobar.hp.infoseek.co.jp/bench/print.txt PHPAってどのくらい早くなるんだろうか。 …測定はやはり浮動小数点か何かでやったらいいのだろうか。 PHPAってコンパイルキャッシュするだけか。 (´・ω・`)ケイゲンサレタノカ、ヨクワカンナカッタ。 >>540 PHPA、だいぶというかかなり違うようですが。 Turck MMCacheってのを使ってる奴いますか? http://turck-mmcache.sourceforge.net/ 能書きのとおりなら「最速」だそうだが。 >526 my 変数の方が速いの? 速度とか関係無しにstrict通るようにした方が良いだろうって話は置いといて。 >>544-545 ttp://boobar.hp.infoseek.co.jp/bench/scope.txt メモリにかかる負荷を測定するってことは出来ますかね。 ああ俺もそれ調べたい。 と言うかメモリ使用量とかどうやって調べてるんだろ…。 測定用のモジュールとかあるのかな? >>547-548 OS に依る。Linux や *BSD なら vmstat(8) とか top(1) で 別ターミナルから測定。 Winは無理っすか。 タスクマネージャみたいな監視ツール作ってログ取るようにすれば良いんかな…俺にゃ無理だけど…。 掲示板とかのスクリプトでHTMLを吐き出してそれにアクセスさせるってあるけど ログファイル自体をHTMLにするって効率悪いよねぇ。 >>551 変換するのは1回だがアクセスされるのは何度もあるからいいのよ 逆にアクセス解析とかカウンターとかは変換するだけ無意味って言うか ログなんて管理人しか見らんし。 今日、会社休みます。。。 会社の負荷を減らすためにネ! 堕スレ化したの? でも、結局負荷軽減ってアルゴリズム考えた方が、 myがどーの、ヒアドキュメントがどーの、言うより意味あるよね。 言語選択ではある程度答え出てるし、このスレの意義って。。。 ちょっとした負荷を減らすために非常に参考になりました やっぱ表示速度を優先するか サーバの負荷を優先するか。 きわどいな… > [ネットランナー] > ベスト・オブ・ツール 2002 > サーバ&コミュニティ部門 掲示板CGIカテゴリー > (祝) 金賞受賞 これはすごいことなの? >>570 「ネットランナー」って読んだことないです とりあえずぐぐってみたら、 http://www.zdnet.co.jp/internet/runner/ > 超ヘビーユーザーになるためのインターネット活用誌 ( ゚д゚)ポカーン >>571 厨房の愛読書だよ 賞もCGIの人気とか上っ面だけしか見てないで取ったりして、 作る人から見たらひどいソースのものも入賞してる うるせぇよ、年末の賞の審査員は有名サイト管理者を寄せ集めてるんだから、 それには文句いうの(・A・)イクナイ!! まあ、実際使う側からしてみれば、 たいていのやつがソースなんてどうでもいいんだがな。 ちょっと使ってみた 重(・A・)イイ!! 返信で無制限にファイルをアップロードできた ファイルタイプの判別を拡張子のみでやってる 設定でどうにかなるかもしれないけど とりあえず気になったのはこんなところ ていうか、コード酷すぎ。 配列の使い方すらわかってないように見えたし、変数全部グローバルだし。 関数の使い方も変だし。 ネットランナーとかいう雑誌のレベルがわかっちゃうな >>566 ネットランナーとやらでは金賞かもしれんがバグ放置はまずいと思うぞ。 常にSTDINから無条件で受け入れる仕様。 投稿記事がある状態で-Tを付けて起動するとrtn_gnrl.plで起こる無限ループ。 管理用ページ→基本設定→「記事ページ最大表示数」を空にして設定保存→掲示板へ戻ると Lib_gnrl.plで0除算して二度と起動しなくなる事で負荷を下げるエレガントな仕様、等他大量。 >>581 > 負荷を下げるエレガントな仕様 禿しくワロタ [Tue Dec 02 20:31:53 2003] [error] [client 127.0.0.1] Illegal modulus zero at ./routine/Lib_gnrl.pl line 514. [Tue Dec 02 20:31:53 2003] [error] [client 127.0.0.1] Compilation failed in require at bbs.cgi line 35. こんなとこで陰口たたいててもしょうがない。 直接言ってやらないと。 Linuxサーバ、topで調べてみたら 毎晩httpdにCPU20〜89%くらい使用量があって サーバが激重なんですが、原因がはっきりしない… Apacheやネットワークの設定をどうにかこうにかして 負荷を減らす方法無いですか? >>587 どのようなスクリプトを実行させているか、で話は変わってくる。 >>587 非力なwwwサーバで山ほどモジュール組み込んで激重CGIでも置いてるんだろ >>589 2ショットチャットとか画像アップローダとか・・。 >>590 えーっとサーバは確かPenIVの2GB、RAM1GBだったかな。 PenIVの2GB PenIVの2GB PenIVの2GB PenIVの2GB PenIVの2GB すれ違いと言われたのでここにきました。 my($a,$b,$c); とするのと my($a);#コメント my($b);#コメント my($c);#コメント と書くのでは、処理速度や負荷に差がありますか? 配布とかメンテを考えると後者で書きたいんですが。 全体で150KBくらいになるCGIソースで 処理によってはルーチンのうちのほんの一部しか 使わないという場合、 処理をライブラリにしてrequireするのと 全体が1ファイルなのとどっちが効率いいのでしょうか? 計測ってどうやってやるんですか? でっかい実行ファイルを起動するのと ちっちゃいのを起動してrequireするのと どっちが軽いかという問題だと思うんですが。 >>606 負荷が気になるなら負荷を調べる方法ぐらい知っておいたほうがよろしいかと >606 そもそも、あなたの「軽い」ってどういう意味ですか? >>606 requireのとこまで来たら結局全部読み込まれるのではないかな? 処理順では通らない部分のrequireも スクリプト内にあるとrequireされるんでしょうか? requireを見つけてからrequireする? >>611 そんな簡単なことぐらい試せばわかるだろ #!perl if ( 0 == 1 ) { require './存在しないスクリプト.pl'; } exit; 一枚岩で作って、え〜となんだっけか名前わすれたけど 一回実行したらメモリー上にキャッシュして次回から高速実行するツール あれ使ったほうが軽さという面では圧倒的(ただしCPU負荷) 回線負荷は変わらんし大概先に満杯になるのは回線帯域のほうだ perl、phpの中でだろ? 共有鯖での利用を考えてる人もいるだろうし 7行プログラムってスレ、すごいねアレは。 でも、短くするために敢えて重い処理をしていることもあると思うんよ。 それでも短いから負荷は感じないわけだけれども。 単純に処理を軽くする以外にも、コードを小さくする負荷軽減もあるんやねぇ。 言ってること矛盾してるじゃん。 >短くするために敢えて重い処理をしている >コードを小さくする負荷軽減もある ドキュンやな。 翻訳を試みた。 ある処理をする際に A: 複雑な処理をする組み込み関数を使う B: 単純な処理をする組み込み関数をいろいろ組み合わせる の2種類の方法があるとして Aの負荷 < Bの負荷 ってこと? >>620 YES. そういう場合もあるんじゃないかと思ったので。 HTTP/1.1 のチャンクコーディングを忘れてない? 試しにnph ソースを作って、Content-Length を送信するようにしたら、 チャンクコーディングされなかったけど、接続が毎回切れるみたい。 どっちが良いのか微妙っぽい。 A.. if($aa=~/x/){$pa=1;$pb=1;}else{$pa=0;$pb=0;} B.. $aa=~/x/?($pa=1,$pb=1):($pa=0,$pb=0); 等価らしいです ソースは、ttp://ww4.tech.nu/?d=653 たしかにコードは短くできるので試したところ レスポンスが悪く、重くなった気がします >>625 三項演算子使ってるだけでしょ、普通に使うけど。 レスポンスは落ちるのかなぁ? PHP普及の原因は、イスラエル・Zend社のマーケティングの成功にある。 @Perlでは別インストールで多くの人が知らないデーターベース利用を標準で使用できるようにし、「データーベースが簡単に取り扱える」というイメージを特に強く植えつけた。 Aウェブサイト作成への特化。例えば、セッション管理がそうだ。 Bソースの隠蔽による著作権保護を可能にした。 データーベースを使いたいが、使い方がわからない。そこに、PHPなら使えるという情報が先に入る。これで、PHPに入った人もかなり多いはず。 PHPの言語仕様はZendに大きく左右される。 二年ほど前、PHPが出始めた頃には、変数のスコープがPerlとまったく同じ仕様だった。 もともと、Perlのソースコードを改編して作成されたPHP。 ↓PHPの歴史 http://php.planetmirror.com/manual/ja/history.php PHPには、Perlコードの退行による高速化の意図が言語のいたるところに見える。 マイクロソフトは、オブジェクト指向への対応というのが大義にVB6.0からVB.NETに言語仕様を大幅に変えた。 今後も大きく言語仕様が変わることはないのか? オープンソースとは言っても、Zend社の http://www.zend.com/management.php の数人のスタップによって大きく左右される。 再帰的定義とされる「PHP:Hypertext Preprocessor」という名前にも理由がある。これは、要するに、正確には、「Perl Hypertext Preprocessor」としたいところだが、GNUの「GNU is Not UNIX」という再帰的な定義をもじったものだ。 要するに、「GPLのフリーソフトのライセンスには違反していませんよ!」と一つには主張し、また、一つには、「PHP is Not Perl」とでも言って、Zendの社としての姿勢を、先人の「Perl開発者たち」から擁護する意図があったのだろう。 Nではなく、Hなのが、そのための味噌だ!Perl開発者たちは、当然、面白くないはずだ。 PHP信奉者は、六芒星(hexagram)マークのユダヤ教にでも、入信せよ! Cで組め。手っ取り早く最速で負荷を極力少なくできる。 負荷を少なくするならまず、 データ構造とアルゴリズムを見直せ 次にCPUをグレードアップしろ それでもダメならCか汗ブラで PHPって Personal Home Page の略? なんで掲示板をテキストファイルに出してるんだ? データベースに入れてしまうのってよろしくないの? 最後の方を読む時とかに早いと思うんだけど。 2chの話になるけどさ、sageで書き込みするとスレッド位置が変わらず、 index.htmlとsubback.htmlの更新・ソートを省略できて負荷軽減に繋がらない? と思ったけどレス数表示のために更新しなきゃならないか…。 もう少し工夫すればなんとかなる気がする。 >641 マジレスするとそんな低レベルの操作をしたら 処理中は他の処理が出来なくなるだろうが 掲示板なら静的HTML生成が一番簡単で一番効果がある。 スクリプトをあれこれこねくり回す前に試してみれ。 javaでクッキーを保存する方法が載ってれば全部HTMLにするのに >>644 それは理解した上で別の方法を模索するスレなのでは? javascriptでクッキー出力はできるけど・・・多分違うことなんだよな >>649 ようするにHTMLでクッキー機能できるようにすりゃいいってことでしょ? セットはcgiですればいいから、あとはそれをJavaScriptでゲットすればいいんだよ。 ファイルの読み書きはperlのキモの部分だから、せめてこれだけは理解しましょう。 javascriptでゲットする方法が載ったサイトきぼん htmlの不都合点とかあるかな? NEWマーク表示できないくらいしか思い浮かばん いらん機能だし HTMLの不都合は、たとえばSSI使わないとカウンターが表示できないとか。 オールHTML化するとレイアウトを変更したときが面倒なんだよなぁ。 ファイル数も結構増殖していくし。 それくらいかの。 HTMLでクッキーとか機能させるって言ってるけどIE以外は無視? operaやMozillaだと文字化け起こすぞ IE以外いいよってみんな思ってるんじゃない? 実際そうだし2chもそうだからいいかな、と。 tcupの掲示板てどうなってんだろう。 拡張子無しで/bbsってなってるのが昔から不思議で。 googleなんかのuri表示で見ると、 http://xxx.teacup.com/yyyy/bbs だと、 www.tcup-.com/xxx/yyyy.htmlが本体らしいんだけど。 javaだとIE以外じゃ日本語取得できないのかorz みんな妥協派ですか? 閲覧時にクッキー使ってなにがしたいの? 投稿時ならともかく。 お!早い。 切替ならそれぞれリンクを用意するだけで済むのでは? 閲覧時のクッキーってストーキング用途しか思いつかない。 >>674 それだけしか思いつかないおまいの脳に乾杯 >>664-667 あたり 2chで化けるのはbbs.cgiで発行してJavaScriptで取得してるからじゃ? つーか無理にHTML表示なんかせんでもいいよ。 動的にやればインタラクション的にも手軽になんでも出来るし。 掲示板の1ページ目だけだけど HTMLにすんのとしないのとじゃけっこう差出るの? htmlファイルに書き出すかどうかは、そのサイトへの訪問者の利用状況によって異なる 一概に○○なら△△とはいえない。 まあ、統計的に、そのページが更新されるまでに10回以上アクセスされるとわかれば、 一般的にはhtml化した方がいいだろうな。 式にすれば html化するコスト << html化しない場合のCGI起動コスト * not modify間での平均アクセス数 の場合は、html化のメリットが大きい まあHTMLよりCGIの方が負担少ないなんてことはないな まあHTMLにしないで負荷を軽減する方法を模索していくのもいいんでない? むしろHTML化できないからプログラムの負荷を下げる必要があるんじゃね? 本当に負荷を下げたいならCGIなんか使わずサイト丸ごと圧縮しておくのが一番だろうし。 俺はCGIを作る側だけど実は↑これが一番好き。 しかしコスト(時間や手間込み)単位での効果ならやはり静的HTML生成がベストチョイスなのも事実だし。 まあ両面作戦だね。 1, Requests per second: 2.67 [#/sec] (mean) perl/cgi 2, Requests per second: 17.53 [#/sec] (mean) mod_perl (1と全く同じソース) 3, Requests per second: 60.22 [#/sec] (mean) html (1,2のプログラムで出力された物をhtmlで保存した物) DBIやarchive等、結構重いモジュールを読み込んでDBにアクセスして表示するプログラム。mod_perlのDBアクセスは永続化している。 処理内容によって一概にいえないけど1つのパターンとして参考までに。 静的htmlだとカウンターだのダイレクトに表示出来ないしクッキーも文字化け(IEではunicode,xxxだとURLencodeだの) 等の問題が発生してめんどくさい。クライアント依存の処理はやはり気持ち悪い。 >>687 これって数字高い方がいいってことなの? ベンチマークに無知でスマソ 確かに文字化けるんだよな・・・ ユーザにHTMLとCGIモードを選ばせるようにしたらいいかも 書き込みのときjavascriptでクッキー発行すれば化けんよ。 「>>1 」 このアンカー、2chではタグをアクセスごとにつけてるんだっけ? >>690 んだよ、ほれ。 http://pc5.2ch.net/php/dat/1034645635.dat サニタイジングもregist時にやってるな。 2chは書き込みも多いが、それ以上に読み込みが凄まじいからな。 質問なんですが、 リンクトレードproやThe Roomのランキングリンクのようなエロサイトによくあるランキングを PHPで作ってみました。ユーザーごとに情報を1行CSVに保存させて、それがカウントファイルも兼ねてます。 表示部分は静的です。 出来上がったところで、上司に負荷かかりそうだからDBにしてよと言われ、MySQLで作り直してみたところ、 現在ユニーク1万/日くらいのサイトであっというまにMySQL接続数多杉エラーが出ました。 サーバ管理者にMySQLの接続数多すぎと出ましたと言ったところ、 設定変えることもできるけど、トラフィック多いサイト目指すならPostgreSQLにしたほうが良いといわれました。 今とりあえず素直にPostgreをサイト見ながらソース書き直してますが、 一体どの方法がベストなんでしょうか。 ちなみにPHPは趣味レベル、DBの経験は今年からなのでソースに問題があるのかもしれません・・ >>693 postgresにすれば良いってわけじゃないような。 ユニーク1万/日ぐらいだと、squidでリバースプロクシを導入してみるとかは? >>694 今後増える予定です。目標が10万PV/日くらいです。 >>695 同時接続数を増やせないなら、1接続あたりの接続時間の短縮をやらんといけない訳で。 もうクエリを発行しないと分かった時点でコネクション切断とか、 そのレベルの最適化はやってるよね? 初心者らしいから言ってみると、WHERE句、LIMIT, OFFSETで取得数を限定して、 DBから取得したけど使わず捨てているデータを削りこむとかやってみそ。 >>696 やってるつもりなんですが、、 inのカウント取得ファイルのソースをコピーしてみます。 http・・・xxx.php?usrid=$usridで叩いて、DB開き。 $tabledata = mysql_query("SELECT * FROM usr_table",$db); //配列に入れ while($row = mysql_fetch_array($tabledata)) {$usr_array[$row[usrid]] = $row;} //t1フィールドに直前IP記録&カウント if($rmhost != $usr_array[$usrid][t1]){ $incountup = mysql_query("UPDATE usr_table set incount = ceiling(incount + 1) where usrid = \"$usrid\""); $ipupdate = mysql_query("UPDATE usr_table set t1 = \"$rmhost\" where usrid = \"$usrid\""); } mysql_free_result($tabledata); mysql_close($db); if( !$db ) { print "接続できません。<br>\n"; exit; } header("location:{$homeurl}"); これだけです。これで動いたんですが、やっぱり記述おかしかったりしますかね、、? まさか mysql_pconnect とか使ってないよね? >>693 ランクカウント以外の部分(順位の表示とかカテゴリ参加数の表示とか)はどう処理してる? もしリアルタイムでやってるなら、静的なHTMLで処理するとかcronで処理させるとかすると、 劇的にコネクト数は減るよ。 ユニーク1万にも耐えられないならDB使う意味ないし、Postgresにすりゃいいってもんでもないと思ふ。 やはり、設計段階からの見直しが必要かと。。 毎秒何回ぐらいqueryの発行あるか分かるなら書いてみて。 mysql_pconnect思いっきりつかってますが、、それって駄目なんですか? >>699 順位他の処理は、3600秒ごとに静的に書き出してテキストファイルをrequireしてます。 cronではなく、テキストファイルにタイムスタンプ書き出してアクセスごとにチェック、前の書き出しから+3600秒以上経っていたらランキング再書き出し、という感じです。 >ユニーク1万にも耐えられないならDB使う意味ないし、Postgresにすりゃいいってもんでもないと思ふ。 ですよね。。 毎秒何回query発行あるか、どこで見れば良いんでしょう。。 とりあえず今はサイト止まってしまうので旧テキストファイル版に戻してしまいました。 >>700 やはりそれぢゃったか mysql_pconnect して DB に接続すると mysql_close しても スクリプトが実行を終了しても それどころかクライアントがブラウザを閉じた後も DB接続が切断されずに残り続けるんぢゃよ つまり今の状態だと mysql_close が全く効いておらん これは接続をプールして再接続の負荷を減らすためのGJな機能なんぢゃが DB接続数上限が逼迫している状態では逆に足を引っ張ってしまう両刃の剣 素人にはお薦めできないとまでは言わないが、注意して使わんといかんのぢゃ mysql の最大接続数を apache の MaxClients より大きく設定する、とかぢゃな とりあえず mysql_pconnect を myqsl_connect に変更すれば mysql_close で接続が切断されるようになるので かなり状況が改善するんぢゃないかのう うわー、、そうだったんですか。 きっとそれっぽいですね。 大変勉強になります。ありがとうございました。とりあえずそれを試してみます。 >>697 なんてか、削り込み以前にDBMSの本をちゃんと読もうよ。。 header("location:{$homeurl}"); と、リダイレクト先URLしか要らないのに、 $tabledata = mysql_query("SELECT * FROM usr_table",$db); ここで全テーブルデータをぶっこ抜いているのがそもそもの間違い。 ここは $tabledata = mysql_query("SELECT * FROM usr_table WHERE usrid = \"$usrid\" ",$db); と必要な行以外は抜いてこないように直すべき。 全テーブルぶっこ抜きの方法は、いわゆる「MySQLでかんたん掲示板」系の 入門書から取ってきたんだと思うけど、このやり方、小さな個人サイトなら またしも10万PV/日のサイトに使える方法じゃない。 という訳で入門書以外のDBMS専門書を読むことを勧める。 perl のDBMモジュールでも データーベースオープン 全データーを配列にコピー データーベースクローズ その後配列に対して処理色々なんてことをやってるスクリプトを見かけるが 全部読み込まなきゃいけない処理なら普通のファイルに保存したほうが軽くて速くないか? >>706 早いかもしれないけど影響がでるほどの量だとすれば、 データの書き込み(更新)する必要がある場合dbでやる方が安全だと思う。 >>707 いや、だから、あのさ(w db使うなら丸ごと読み込んだりしないだろう?普通 全ぶっこ抜きじゃトランザクション隔離のかけらも無いよなぁ 大前提として、どれくらいの規模(データと一日あたりのhit数)になったときに プレーンテキストからDBに移行するべきなのかという目安を考えるべきだと思う。 サーバスペックやスクリプトの作りにもよるからなあ とりあえず思いつくのは ・アクセス頻度と平均処理時間から待ち行列を計算して「ヤバ」と判断したとき ・top の load average が 1 を超えたとき ・HDDのスワップ音が聞こえるとき ・体感的に「重い」と感じたとき 表示用HTMLファイルとか作成しちゃうなら、場合によっては 小規模でもデータはDBで管理した方が良いね。 そうだな、俺もDBが動いてる環境なら規模によらず常にDBを使う DB使った方がコストが安くすむ…場合もあるからDB使っちゃうな。 こんな俺はきっと駄目なPGだ orz httpd.conf 最適化とかリバースプロキシとかの話はここではしてないの? >>721 それはWebProgを走らせる「環境」の話だから。 ここは共有鯖で使うCGIの負荷を以下に下げるかの話するスレ(機能してないけど) httpd.confみたいに説明書と設定ファイルが同じになってると萎える コメント行削ったら半分以下になった すいません、ちょっと負荷の意味が違うかもしれない質問なのですが CGIやPHPで大きなファイルなどのダウンロード速度の制限などを行えるのでしょうか。 検索してみても出てこなかったので やはりサーバーの方で直接設定しないと出来ないものなのでしょうか。 普通はmod bandwidthとか使ってやると思うけど・・ >>724 スクリプトでファイルを読んで、pushするなら出来ないことも無い。 でも回線負荷は下がるかもしれんが、サーバの負荷軽減にはならんでしょ。 普通は>>725 の通り。スクリプトでファイルを送り出すなんてしない(高負荷)。 となると,DBにファイル放り込むのはよくないのかな 教えていただき、ありがとうございました。 やはりサーバー側で直接行う方がスマートで負荷低減になるのですね。 当方サーバー側をTelnet出来ない専用サーバーをレンタルしており スクリプトでどうにかならないか考えておりました。 SQLite機能がついており、ファイル制限が出来るらしいのですが DBもやめた方がよいとのことで、 ありがとうございました。 >>727 管理上の必要があれば、DBに放り込むこと自体が悪いわけではない。 >>728 専用鯖なら負荷かかってもいいんじゃないの >>728 専用サーバなのにTelnetできないのかww ちょいと具体的な話でなくてもうしわけないんですがとあるWEBアプリケーション(phpからpostgresを使ってるらしい)について相談をうけまして ちょっと覗かせてもらったらapacheのプロセスがひとつ毎に10MBほどもメモリーを消費しちゃってるんで、一瞬、え?っと思ったんですが 当方phpもpostgresもあんまり詳しくありませんのでもしかしたらこの構成だと普通の状況なのかな?とも思いまして質問させていただきました phpはapache2.のモジュールとして組み込んで有ります。 それくらいふつうだろとか、直感的になんかあやしいとか、プログラムがタコだとそうなるとか、感想をお願いします >>734 要約するとapacheのモジュールとして組み込まれたphpからpostgresqlを使ったらメモリーを10MBガメるのは普通ですか? ってことだな ただ単にApacheに色々組み込みすぎて肥大化してるんじゃない? >>736 thx ただのリクエストで、どれだけ消費するか見てみないと、なんともいえないね。 >>733 >apacheのプロセスがひとつ毎に10MBほどもメモリーを消費しちゃってるんで 普通。 正しくは >phpはapache2.のモジュールとして組み込んで有ります のような状況の場合、普通。 (PHPのエクステンションを極力動的に組み込めば減るけど) PHPってメモリー食いなんですね もしかしてCGIから動かしたほうがいい? >>741 10メガ位でけちけちすんなよ 別プロセスで立ち上げると負荷かかって遅くなるし >>741 その代わりPHPを使うリクエストがくる度にロードすることになるから 今度はCPU負荷が高くなるよ。まあサイトの特性で考えれ。 共有サーバなんかはセキュリティを高めるにはCGIで動かすしかないしな。 (例えリクエストの度にロードされてレスポンスが悪くなるデメリットがあるとしても) >>743 >共有サーバなんかはセキュリティを高めるにはCGIで動かすしかないしな。 何故? データの無駄な二重化が無いから負荷は軽減すると考えてもいいんじゃ? 間違ってたらスマソ データがコピーされるのは,値が変更されるときでは? $a = $b ってしてもその瞬間にはコピーされない. らしいね。 だから、PHPでは「パフォーマンス重視の参照渡し」は ほとんど無意味ってことかな。 C ならともかく,スクリプト書きながらそういうレベルのパフォーマンス向上を考えること自体間違いな気もするね. むしろインタプリタだから「少しでも速度向上」を気にするのでは? >>741 eAcceleratorなんか使ったら相当違わない? >>751 要するに PHP を選択してる時点で既にパフォーマンスよりも開発効率を取ってる,ってこと. 速度上げたいなら重い処理だけ C/C++ 使うとか,あるいはハードウェアで解決するとかしたほうがいいんじゃないかな. アルゴリズムの最適化はもちろんするけど. アクセラレータつかったりFCGI化するだけで天と地ほど違うぞ インタプリタだからこそ工夫するというのはその通りだけど、 ざっくり体感に跳ね返ってくるレベルで考えたほうがいいと思う >>733 たかだか10Mだろ? そこメモリ何Mのマシン使ってんのよ? 32Mとか?w このスレッドで聞いていいかな・・・? DBサーバとフロントサーバを分ける場合、 両者はやはり同じLAN内に設置するのが基本ですか? 離れたところに置くと、レスポンスはけっこう遅くなります? >>758 物理的な距離とレスポンスは関係ない。 LANであろうが回線が遅ければ遅い。 WANであっても回線が速ければ速い。 マルチだけど答えておくか。 セキュリティを重視して分けておけ。 どもです。 同じLAN内に設置すべき、っていうわけでもないんですね。 でも普通はLAN内の方が回線は速そうですね。 >>761 何かLANとドメイン(≠インターネットドメイン)を 一緒くたにしてるように思えるけど。 インターネットを介さないという意味なら、プライベートIPアドレスで構成されたLANの中にウェブサーバとDBサーバを置くのが普通。 ウチはRFC1149準拠。夜間の速度が出ないのが悩み >>757 たかだか、というけど、メモリ上限のあるVPSとか借りてると結構辛いよ? 今更だが このスレって負荷軽減の邪魔する委員会なんだろ? PHP+MySqlでユーザー認証する時、DBにはユーザーのIDやパス他の情報があるとします。 仮にそれはもうめちゃくちゃユーザーが登録されていて(かなりの負荷)、DBの読み書きをする場合以下の2つのパターンだとどちらが負荷がかからないでしょうか? 速度の点についても知りたいです。 1.1つのテーブルに全員分登録しておき、普通に読み書きする。 2.ファイルに「ID+その人が使用するテーブル」を記述しておき、それを読み込んでから、複数用意されてるテーブルの中から指定されたテーブルを動的に選択して、読み書きする。 どうなんでしょ?質問+保守上げ。 あ、2の複数テーブルはまぁ10個くらいとします。 仮にデータが50000件あれば1つのテーブルは5000件で済むということになりますよね? >>776 試して測ってみんなに報告。これで皆幸せ。 多分1の方が効率的だと思うけど。 レスありがとうございます。やっぱり1ですかね。 2だと他に色々やりたい時不便になってきますよね。 地道にプログラム面を改善していった方がいいのかもしれませんね。 >>778 2chはテキストファイルベースです 言語はC >>776 1の方 DBの負荷を下げたいのなら、テキストファイルベースの処理を上手く使うといい 2chはperl+SpeedyCGIで、一部Cじゃなかったっけ? bbs.cgi=Perl read.cgi=C だったかと bbs.cgi=Perl; read.cgi=C; リレーションがいらないなら、フラットなただのテキストファイルが早いんだね。当然か。 掲示板の画像をダウソツールで根こそぎかっぱらっていく不届き者を特定した さて、貴方ならどのような方法でdenyする? アクセスポイント絞りの範囲指定で.htaccess。 >>788 ダウソツールとわかるUserAgentならまずそいつを403へ 次に一定間隔の連続or同時接続を503へ それでも懲りないならFWで叩き落す。 私も今、掲示板サイト作ってる途中なので、ちょっとカキコミさせてもらいますお JAVAなのでちょっとperl、PHPスレとは違うけど共通する部分はあるので。 私の場合、某フリーソースの掲示板を元々おいてたんですけど、レス数が3万をこえたあたりから ワード検索やレスのカキコミに非常に時間がかかるようになってしまいました。 そのCGI(PERL)はレスのログをテキストファイルに出力しているんですが、毎回何万行も読むんではそりゃ時間かかる なという感じになってしまいました。 そこで、新しく掲示板作る時には、DB使うべきなのか、それともログ出力用のテキストファイル使うべきなのか、HTMLファイルとして吐き出す べきなのか、どれがいいとおもいますか? 2chとかはオーバーヘッド対策でDB使わない仕様にしてると聞きました。 やっぱDBにするメリットはオーバーヘッド考えると皆無なんでしょうか? HTMLファイルに書き出すってのは軽そうだけど検索用のメソッドをHTMLファイルに走らせると早いのかどうか不安な部分もあるんです。 関係ないのでしょうか? 過去ログを小分けにすればいいじゃん。 2chだって1000レスか512kで別のスレ立てないといけないんだし。 >>792 DBのオーバーヘッドを心配しなければいけない程アクセスが予想されるなら、 表示はHTMLで出力、読み書きはテキストファイル(もちろん分割して)すればいいし、 そうでもないならDB使えばウンコみたいに楽ちん。 >>794 >>795 DB使わない前提で考えると ということは、1スレごとにHTMLファイルを作ったほうがいいんでしょうか? 1スレ、1ファイルにしたら何万ファイルもできちゃいっても大丈夫なんでしょうか? >>797 大変参考になりました。 こんなに役に立った外部リンクは初めてです。 本当にありがとうございます。 最初grep型の検索しか考えてなかった自分の低脳ぶりがはずかしいですw 結局、スレごとに1ファイル書き出して、Luceneを実装してこれでインデクシングして検索に対応することにしました。 Namazuに比べるとどうかな?と最初は考えてましたが、wikipediaでの採用実績を考えると問題ないとおもいましたので。 1スレ1ファイルをテキストファイルで生成して、XSLTで整形してHTML表示しようとおもいますが、YSTやGOOGLEのSEOを考えると、 最初からHTMLとしてファイル生成したほうがいいとおもいますか? テキストファイルで生成するとpageRANKつかないですよね? >>798 何いってんのかよくわかんねえけど ページランクはHTMLで書いてあれば、どんな形式でもつく。 おいコラ 1分おきに画像掲示板に底引き網かけてるやつ 死ね!おまえだよおまえ→.kngwnt01.ap.so-net.ne.jp 丸ごと永久規制してやってもまだやってやがる 何時間PC付けっぱなしなんだよ 火事になって死ね 質問させてください。 Webサーバ上にあるファイル(バイナリ含む)をファイルパス直接指定でダウンロードする(させる)のと、 以下のようにperlのcgiを通してダウンロードさせるのではどのくらい負荷が違うのでしょうか。 … binmode(STDOUT); while(1){ read(FILE, $buf, $bufsize); last unless (length($buf)); print $buf; } … 目的は、IEで日本語ファイル名のファイルをダウンロードするときに ファイル名が文字化けするのを防ぐためです。 つまりapplication/octet-streamやContent-Disposition: attachment; filename=を付けるためだけのCGIです。 もしダウンロードしている間ずっとCPU時間を使っていたら大変だと思いまして。 例えばファイルパス名指しで直接アクセスした場合の負荷を1として、 CGIを使うと10くらいになるのかあるいは1.1くらいなのかの目安が知りたいのです。 bufsizeは1024です。「bufsizeをこう変えたら負荷が減る」というアドバイスなどもあれば助かります。 ECサイトCGI(ZenCart)は CPU負荷が特別高いのでしょうか。 ご教授お願い致します。 究極の負荷削減はクライアントPCで処理をたくさん行わせる手法である ttp://minkara.carview.co.jp/userid/108766/profile/ やたーダウソツールで画像に底引き網をかけてる奴を .htaccessに放り込むスクリプトができたよー(^o^)ノ すべてのアクセスを拒否れば負荷はほとんどなくなるアルよ。 次のものは負荷はかかるでしょうか? ・ランキングは使わないが登録人数が300人を超すCGIゲーム(50分おきに送信) ・FLASHやJAVAを表示するCGI(1個約2MB、合計12個を1つずつ表示) >>814 の者です。 >>814 の疑問が解決しそうです。 ∧_∧ ( ・∀・) | | ガガッ と ) | | Y /ノ .人 / ) .人 < >_∧∩ _/し' < >_∧∩`Д´)/ (_フ彡 V`Д´)/ / ←>>434 / ←>>277 主食の 魚沼産コシヒカリ A5のサーロイン 大間のマグロ 高級メロン の軽減税率をお願いしますねwww 転職時の注意事項。 下記の条件が全て当てはまる会社にご注意下さい。 ・IT系 in Tokyo ・転職会議で2.5点 ・転職会議の「その他>2ch情報」の欄で過去の労基2chスレが表示される 誰でも簡単にネットで稼げる方法など 参考までに、 ⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。 グーグル検索⇒『半藤のブブイウイウレレ』 TM7C0LN4KO プログラミングを誰でも習得できる方法は、「前場アキドルのプログラミングマスター方法」というブログで見られるらしいよ。ネットで調べると見られるらしいです。 AKH0N プハァー ~~-v( =´o`=) 。o 〇 ○ read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる