★負荷軽減対策委員会(Perl、PHP)★
■ このスレッドは過去ログ倉庫に格納されています
0001ジークハルト ◆VUxx/EwNXI
02/10/15 10:33ID:ifgLRUybならないのはサーバへの「負荷」。
負荷の高いCGIの使用は削除対象となるのが目に見えてます。
負荷を軽減させるにはどうすればいいか?
どういう書き方をすればいいか?
そんな委員会を開設しました。
0320nobodyさん
03/05/21 00:27ID:???while & fgets & copy -> 処理50秒前後 メモリ使用4M前後 CPU100%
file & foreach(or list&each) & copy -> 処理60秒前後 メモリ使用15M前後 CPU100%
fread & copy -> 処理0.5秒前後 メモリ使用4M前後 CMP100%
0322山崎渉
03/05/22 02:00ID:???0323nobodyさん
03/05/22 15:08ID:???0324nobodyさん
03/05/26 07:37ID:Hdu0vyT1open(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>;
みたいにいっきに配列に入れてしまうのはどちらが処理としてはいいのでしょうか?
0325nobodyさん
03/05/26 08:20ID:???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;
0326nobodyさん
03/05/26 08:36ID:Hdu0vyT1それが最適なのですか。
勉強になります…。
サイズ1024は何を意味しているのだろう…
0327あぼーん
NGNG0328nobodyさん
03/05/26 11:18ID:???1024 byte は 1 kbyte だろ?
コンピュータの基礎じゃねえか。
ま、俺だったらFile::Copyモジュールを使うかも。
バグがあるかも知れないソース書くより楽だし。
0329326
03/05/26 14:05ID:mARvDo9Yすいません。
これを記述することで何が得なのかを知りたいのでした。
0330nobodyさん
03/05/26 14:38ID:kKbCXT+N実行エンジンにもよるんだけども、メモリを確保する場合、8byte単位とかそういうのが多いから
(アライメント)。
Perlだとどうだか?って気もするけども。
0331nobodyさん
03/05/26 14:57ID:???0332nobodyさん
03/05/26 18:41ID:???微妙に意味がわからんな……
推測をして回答してみる。
1.$buffer_sizeを設定することで、何バイトずつコピーするのかの設定が可能になる。
この数値を小さくすると、コピー回数が増えるが、メモリーへの負担は減る。
この数値を逆にすると、その逆。
サーバーの具合を見て適宜調整することができる。
2.わざわざ変数を一つ設定することの意味は、変数の名前をわかりやすくすることで、
その変数が何に使われているのかをわかりやすくする。
「昨日の自分は他人」の言葉どおり、後から見た時になんでその数値にしたのか等が判断しやすくなる。
何が聞きたいんだろう……
0333nobodyさん
03/05/26 21:27ID:???>>324のコード片がスクリプトのどこに埋もれていても、
変数 $buffer_size としてスクリプトの頭の方で定義しておけば
簡単にバッファサイズを変更できる。定数で埋め込んでしまうと
変更したい時にいちいち探し回る事になる。
0334nobodyさん
03/05/26 21:28ID:???0335nobodyさん
03/05/26 21:32ID:kKbCXT+N@buf = <IN>
のほうが早かったりして。
0336nobodyさん
03/05/26 21:50ID:67MeoiMRopen(OUT, '>'.$dst);
print OUT while(<IN>);
close(IN);
close(OUT);
こう書くかも。
readで読み出すバイト数は多い方が速いと思う。当然だけど。
ただ多過ぎるとそれはそれでメモリくったり。
0337nobodyさん
03/05/26 22:07ID:???ベンチ取れば分かる事だが、@buf = <IN> はメモリを一気に
確保する = System CPU time を食う。行入力演算子による
取得は「行末」を探す = 可変長入力なので潜在的に read
より遅い処理。もちろん扱うデータのフォーマット & 量次第
だけどね。
どうしても行入力演算子でやりたければ
$/ = \1024;
while (<IN>) { ... }
で 1024 byte 単位で読めるけど、素直に read 使った方が
速かったかと。
0338336
03/05/27 01:07ID:???改行コードを探しながら進むので遅いと。
0339山崎渉
03/05/28 17:05ID:???ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0340nobodyさん
03/05/28 18:05ID:???0341nobodyさん
03/05/28 23:45ID:01rk8ElDたとえば書き込むものは同じとして、
追記先のファイルが1行のときと1000行のときでは
CPUメモリ負荷はどうなるんでしょう。
追加するだけだから大して変わらないかなと思ったんですけど。
0342あぼーん
NGNG0343鷹
03/05/29 00:29ID:KW4sDDhuこのように一気に計算させるのと、
いくつもに分けて計算させていくのでは
負荷は変わるのでしょうかね?
変わるのならどちらが軽いと思いますか?
0344nobodyさん
03/05/29 00:52ID:???追記の場合、元のファイルの大きさはほぼ影響しない。
Cをやっている人間ならわかる(はず)だが、
追記と言うのは、ハードディスク上のファイルの終端を探し出して、
そこから新たなデータを埋めて行き、最後にファイルの大きさを示す数値を変更する作業だ。
従って、ファイルの終端を探し出す作業だけが、ベンチマークに影響する。
0345nobodyさん
03/05/29 00:54ID:???メモリの占有率を調べたいなら、そういうソフト入れてベンチマーク取ればわかる。
そして結果を発表すると皆から感謝される。
むしろ、その式は人間が見やすいかどうかを考慮した方がいいと思う。
0346nobodyさん
03/06/01 05:17ID:q1DFdt/M1.printを使い一行ずつ出力
2.ヒアドキュメントで出力
3.別ファイルを作り読み取らせて出力
3は後々便利そうだけど、負荷が気になる…。
0347nobodyさん
03/06/01 07:32ID:???0349nobodyさん
03/06/01 11:08ID:???>3.別ファイルを作り読み取らせて出力
>3は後々便利そうだけど、負荷が気になる…。
じゃあ外部ライブラリとかあまり使わない方がいいよ。CPANもね。
0350nobodyさん
03/06/01 12:28ID:???1.出力処理が遅い。
2.出力処理は早い。
3.良識ある人間のやること。
一般に、メモリ占有量の低いものの方がウェブには向いているよ。
0352nobodyさん
03/06/01 14:21ID:???それよりも、トラフィックを一番に考えてる俺は間違ってますか?
0353nobodyさん
03/06/01 16:03ID:j4GGBbHWどうもです。
0354nobodyさん
03/06/01 16:59ID:???私も処理速度を優先させるべきだと思うねぇ。
というか、気にするほど大して変わらない。
基地外なほど膨大なデータを扱うならまだしも。
0355nobodyさん
03/06/01 23:12ID:???鯖を用意してやるなら、保守性を一番においても問題ないと思う。
0356nobodyさん
03/06/01 23:24ID:8+Lq3hlg>想定同時アクセス1000
これって小さいの? 秒間同時アクセス数1000ってことだよね?
0357nobodyさん
03/06/02 02:48ID:???大きなプロセスは常駐させてローカルソケットでCGIと通信してCGIは小さく作る、
データベースは下手に使わない、巧く使える場合にだけ使用する。
0358nobodyさん
03/06/03 01:39ID:???サーバーがつんでるメモリーの量によってどっち優先かは変わると思われ。
メモリー使い切ったらswapのオーバーヘッドがかかってかえって遅くなるし。
まあ、最近のサーバーはメモリーを湯水のように持っているからそんなこと考える必要ないのかな?
0359nobodyさん
03/06/03 05:54ID:+XIKXuw20361nobodyさん
03/06/03 12:08ID:Sjj3JYUN共有鯖ならいくらメモリ積んでいようと割り当てられるのは
微々たるもの
0363nobodyさん
03/06/03 21:58ID:+XIKXuw2早速やってみたところかなり速くなりました。
でもサイズが2kちょいから800kほどに...
0365364
03/06/03 22:22ID:???0366nobodyさん
03/06/05 20:39ID:???perlcc だと1割くらいじゃない?
0368nobodyさん
03/06/20 01:47ID:???理由は説明しなくてもわかるよね?
Yes she does!
PHP のメーリングリストなんかでも、
速度を少しでも稼ぎたいときの小技として紹介されることがあるね。
0373nobodyさん
03/06/25 18:56ID:???ひとつひとつルーチン毎にファイルを分けて、
一度に呼び出す方が負荷が大きいですか?
0374nobodyさん
03/06/25 22:26ID:???漏れもそれ思うんだが、ファイルをまとめようが分割しようが、
結局たいした大きさじゃないので、どっちもオンメモリってことない?
0375nobodyさん
03/06/25 23:20ID:???分割しても常に全部使うのなら、まとめた方がシステムコールが
減っていいと思う。
Perl だったら CGI.pm でやってる遅延読込が参考になるかと。
あれはあれでメモリ食いそうだけど。
0377あぼーん
NGNG0378nobodyさん
03/06/26 03:55ID:???別に必要になったところでuseすればいいんでないかい?
そうそう、SelfLoaderかまして起動時には一部しか読み込まれないように工夫しないといかんね。
0379あぼーん
NGNG0380あぼーん
NGNG0381nobodyさん
03/06/26 13:46ID:???function hoge() {
require('hoge.php');
}
hoge(); らなければ読まない。
Perlも同じく。
0382nobodyさん
03/06/27 16:09ID:sG/tHFOoスクリプト自体軽くした方がいいんでしょうか。
0385あぼーん
NGNG0388nobodyさん
03/06/28 14:07ID:M/F9ZoCiでも少しは…。
↓以下ループ。
0389nobodyさん
03/06/28 14:11ID:jkMqlRkLってことは、少しは変わるんだ…。
0390nobodyさん
03/06/28 15:08ID:???0391nobodyさん
03/06/28 16:21ID:???0392nobodyさん
03/06/28 22:51ID:???0393nobodyさん
03/06/29 00:15ID:???そりゃ、数百Mとかのコメントとか入れてたら、
メモリへロードするのが遅くなるだろうが、
処理速度そのものは、何の影響もない。
0394nobodyさん
03/06/29 08:04ID:???コンパイル時に無視されて、コンパイル結果もキャッシュされる
わけなんだから、全く影響しないんじゃ?
0395nobodyさん
03/06/29 13:20ID:???コンパイル結果に反映されないのは当たり前
コンパイル時に無視するためには最低限の判定が必要
要はコメントかどうか判定するフラグが少ないに越したことがないのか
という話でしょ
0396nobodyさん
03/06/29 22:00ID:???負荷が掛からないのはどれ?
0398nobodyさん
03/07/01 16:46ID:67Ffrssk変数にデータを入れて、printで一気に出力するかどちらが負荷少ない?
それともヒアドキュメント使うか。
どれよ?
0399nobodyさん
03/07/01 19:31ID:???0400nobodyさん
03/07/01 19:43ID:???0402nobodyさん
03/07/01 20:04ID:3/m58fAfそうそう、オレも知りたい。結構悩むんだよなー。みんな
その辺の使い分けはどうしてるの?
printよりechoのが速いってのは聞いた事あるけどね。
0403nobodyさん
03/07/01 20:06ID:???0404403
03/07/01 20:14ID:???$|=1;print "";$|=0;とやるしかない?
0405nobodyさん
03/07/01 22:48ID:???変数作って一気に出力する。
エンコード自由に変換して掃き出せるようなものの場合はどうしてもこうなる。
ヒアドキュメントは
$aya=<<EOL;
あやや
あひゃひゃ
EOL
で変数ぶち込めるし。
0407nobodyさん
03/07/02 00:38ID:???うほっ
いい男!
";
これでいいだろ
0408nobodyさん
03/07/02 08:14ID:???mod_phpも同じだ。
>>401
速度は、
mod_perl > mod_php > CGI Perl > CGI php
の順。ちゃんと実験したサイト行って、見て来い。
0409404NOTFOUND
03/07/02 20:09ID:???>mod_phpも同じだ。
PHP可を謳っている鯖屋はmod_php可という意味で、CGI可(※)を謳っている鯖屋は、
CGI/Perl可という意味で謳っていると思うのだがどうだろうか?
CGI可に比べてPHP可の鯖屋が少ないのは事実だが、mod_Perlを使える
鯖屋を見た事がないのは、漏れの調べ方が甘いからなのか・・・
※)一般的にCGI=Perlという認識があるのでこのような書き方をあえてしたが・・・
つまり何が言いたいかと言うと、mod_php使える鯖がそんなに非一般的では
ないんではないかという事だ。
0410nobodyさん
03/07/02 21:32ID:???cgi版じゃない普通(というか一般的というか)のphpってこと?
0411nobodyさん
03/07/02 21:52ID:???適当な拡張子をApache::Registry上で
動くようにする事自体はむずかしくないんだけど
ユーザーのモジュールの名前空間に制限がかけれないので
userAが
use lib (/home/userA/lib/);
use myPackage;
としる状態で
userBが
use lib (/home/userB/lib/);
use myPackage;
とかしてくれちゃうと、動作がめちゃくちゃになってしまうので
ユーザーにmod_perlな環境を提供できません(´Д`;)
>>410
mod_phpでない場合(サーバー組み込みで無い場合)
「php対応(ただしコマンドライン版)」という表記をみかけます
0414nobodyさん
03/07/03 09:14ID:???ああいう非現実的な試行環境に統一して対照されても参考にできないよね、、
まだmsがやったベンチ結果のほうがdqnぽくない
PHP5のケース別ベンチやってくれんかな
個人では実験環境が作れないしzendの情報だけでは激しく不安だし、、
話は変わって、itboostのtips「効率的な処理」に、phpのループ構造は遅いから、
コールバック関数を繰り返し呼び出すとphpではなくcレベルでループが走ってくれるて
いいよってネタがあるけど、これはどうなん?
(あれはcountを一度にすれば大差ないような気もしつつ、、。
個人で実行速度を計測するといえば、ループ処理のことだと言ってもいいかと
おもうんだけど、これってphp特有の問題?
0416411
03/07/06 09:05ID:???ハンドラ好きにさせるのはもってのほかなので
Apache::RegistryかApache::PerlRunを提供するしかないと
おもうのですが、前述の問題があり、自分の知識内では
不可能と判断しています。
(他に良い方法がないか探してるのですが...)
>>414
FastCGIも、共有サーバだとデーモンプロセス上がりまくりで
現実的では無いような気がしますが^^;
0417nobodyさん
03/07/06 09:07ID:???>ああいう非現実的な試行環境に統一して対照されても参考にできないよね、、
どこのサイトを見てるんですか?
0418nobodyさん
03/07/06 13:26ID:???有名なサイトだよ。35の言語の25のベンチマークによる比較。
http://www.bagley.org/%7Edoug/shootout/
0419nobodyさん
03/07/06 13:33ID:???http://www.linc.or.jp/~takaaki/Family/takaaki/Labo/dynamic_page.shtml
■ このスレッドは過去ログ倉庫に格納されています