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

0001ジークハルト ◆VUxx/EwNXI
垢版 |
02/10/15 10:33ID:ifgLRUyb
サーバ上にPerlやPHPを置く場合、何よりも重視しなければ
ならないのはサーバへの「負荷」。
負荷の高いCGIの使用は削除対象となるのが目に見えてます。
負荷を軽減させるにはどうすればいいか?
どういう書き方をすればいいか?
そんな委員会を開設しました。
0284nobodyさん
垢版 |
03/04/24 12:43ID:UND9RBAr
>>283
データ更新の機会がそれほど発生しないものならば、動的にHTMLを生成する
のではなく、データ更新時、静的HTMLを随時生成するのに切り替えるのも一つの
手かと。
0288nobodyさん
垢版 |
03/04/27 23:41ID:???
>287 phpに速さを求めちゃイカン。
0291nobodyさん
垢版 |
03/04/30 00:11ID:7aND3iYJ
Perlで3MくらいのCSVを読み書きするのって、
かなりの負荷?

あと、ここのみなさんは、どうして負荷について知識があるんでしょうか?
経験上?
0292nobodyさん
垢版 |
03/04/30 00:21ID:???
>>291
一回しかやらないのなら
大した負荷にならないが
BBSのログとかだったら負担になるかもね
0293nobodyさん
垢版 |
03/05/02 05:14ID:Faf7JYi+
オブジェクト指向のプログラムは負荷軽減になるの?
0296nobodyさん
垢版 |
03/05/02 11:29ID:???
>>288
そうそう。よほど非常識なことをしなければ、スクリプト言語で効率を考えるのはナンセンス。
0298nobodyさん
垢版 |
03/05/04 07:37ID:???
>>297
そうだね。コードの一つ一つで効率を考えることによって、
全体としてそうとうの負荷軽減になる。例えば、
http://www.mikeneko.ne.jp/~lab/perl/numerical_transform/#h4を
ベンチマークで検索してみれ。
0299nobodyさん
垢版 |
03/05/05 23:05ID:I0Mrp3iS
>>292
そうかー、ちょっと反省。

ところでどなたか、↓の質問答えてほしいです。。。

>あと、ここのみなさんは、どうして負荷について知識があるんでしょうか?
>経験上?

あと、負荷軽減について詳しい本(の一部とか雑誌でも)ないでしょうか?
0301nobodyさん
垢版 |
03/05/07 15:10ID:???
負荷がどうとかと言う人ほど、use strictしたままリリースしそう。
0302nobodyさん
垢版 |
03/05/09 00:10ID:???
use strict すると負荷がかかるんですか?
0303nobodyさん
垢版 |
03/05/09 15:22ID:???
>>302
検査する時間が増えるだろ、アクセスごとに検査させるのか。
0304nobodyさん
垢版 |
03/05/11 11:49ID:???
Cでいえばassert有効にしたままリリースってのに似ているな。
わざとそうしている人もいるみたいだけど・・・
0305nobodyさん
垢版 |
03/05/15 03:27ID:zbSE5/sG
負荷を測るのってどうすればいいの。
自分のPCで動かしてもよーわからん。
0307nobodyさん
垢版 |
03/05/19 07:37ID:9ehzYSkO
メモリについて質問させて下さい。
例えば
$x="abc";
の後、
$x="";
という記述なしに
$x="def";
とした場合、メモリは、
abcの○○○分と、defの○○○分の
○○○○○○分が確保されてしまいますか?

$x="abc";
$x="";
$x="def";
にすれば
メモリ確保は○○○だけになると思うのですが。
0308nobodyさん
垢版 |
03/05/19 07:48ID:???
>>307
たぶん・・・
変数へ上書きしたら、ちゃんと初期化(開放)してから、
代入してくれると思ふ。
0309nobodyさん
垢版 |
03/05/19 08:57ID:9ehzYSkO
>>308
そうですか。
では$x="";は無駄ですね。
ありがとうございます。
0310nobodyさん
垢版 |
03/05/19 09:06ID:???
Perlは最初に確保したメモリ空間を開放しません。
たとえ、ゼロに初期化しても。undefなら別。
http://www.mikeneko.ne.jp/~lab/perl/tuning/
0314nobodyさん
垢版 |
03/05/19 15:55ID:wUacqRGd
>>310
何が言いたいのかわからん。
0315nobodyさん
垢版 |
03/05/19 16:11ID:wUacqRGd
>>310
すんまそん。
メモリ確保を解放するかしないかは分かります。
メモリ確保は○○○分で済むのか、○○○○○○分確保してしまうのかを聞きたいのです。
0318nobodyさん
垢版 |
03/05/19 17:41ID:???
詳しく知りたかったら、Perlのソースを読むしかないと思うけど。
0319nobodyさん
垢版 |
03/05/20 01:00ID:???
>>315
>>310 の記述を見ると、3バイト分しか確保しないように思えたけども。
0320nobodyさん
垢版 |
03/05/21 00:27ID:???
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%
0322山崎渉
垢版 |
03/05/22 02:00ID:???
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
0323nobodyさん
垢版 |
03/05/22 15:08ID:???
ったく、山崎のおかげでスレ順めちゃくちゃだ。
0324nobodyさん
垢版 |
03/05/26 07:37ID:Hdu0vyT1
ファイルをコピーする時って

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>;
みたいにいっきに配列に入れてしまうのはどちらが処理としてはいいのでしょうか?
0325nobodyさん
垢版 |
03/05/26 08:20ID:???
>>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;
0326nobodyさん
垢版 |
03/05/26 08:36ID:Hdu0vyT1
>>325さん
それが最適なのですか。
勉強になります…。
サイズ1024は何を意味しているのだろう…
0328nobodyさん
垢版 |
03/05/26 11:18ID:???
>>326
1024 byte は 1 kbyte だろ?
コンピュータの基礎じゃねえか。

ま、俺だったらFile::Copyモジュールを使うかも。
バグがあるかも知れないソース書くより楽だし。
0329326
垢版 |
03/05/26 14:05ID:mARvDo9Y
my $buffer_size = 1024; # 適宜調整
すいません。
これを記述することで何が得なのかを知りたいのでした。
0330nobodyさん
垢版 |
03/05/26 14:38ID:kKbCXT+N
>>329
実行エンジンにもよるんだけども、メモリを確保する場合、8byte単位とかそういうのが多いから
(アライメント)。
Perlだとどうだか?って気もするけども。
0332nobodyさん
垢版 |
03/05/26 18:41ID:???
>>329
微妙に意味がわからんな……
推測をして回答してみる。
1.$buffer_sizeを設定することで、何バイトずつコピーするのかの設定が可能になる。
この数値を小さくすると、コピー回数が増えるが、メモリーへの負担は減る。
この数値を逆にすると、その逆。
サーバーの具合を見て適宜調整することができる。
2.わざわざ変数を一つ設定することの意味は、変数の名前をわかりやすくすることで、
その変数が何に使われているのかをわかりやすくする。
「昨日の自分は他人」の言葉どおり、後から見た時になんでその数値にしたのか等が判断しやすくなる。

何が聞きたいんだろう……
0333nobodyさん
垢版 |
03/05/26 21:27ID:???
3. 設定(定数)と実働部分はできるだけ分離する。
>>324のコード片がスクリプトのどこに埋もれていても、
変数 $buffer_size としてスクリプトの頭の方で定義しておけば
簡単にバッファサイズを変更できる。定数で埋め込んでしまうと
変更したい時にいちいち探し回る事になる。
0335nobodyさん
垢版 |
03/05/26 21:32ID:kKbCXT+N
Perlは最適化とかしないのかな?
@buf = <IN>
のほうが早かったりして。
0336nobodyさん
垢版 |
03/05/26 21:50ID:67MeoiMR
open(IN, $src);
open(OUT, '>'.$dst);
print OUT while(<IN>);
close(IN);
close(OUT);

こう書くかも。
readで読み出すバイト数は多い方が速いと思う。当然だけど。
ただ多過ぎるとそれはそれでメモリくったり。
0337nobodyさん
垢版 |
03/05/26 22:07ID:???
>>335-336
ベンチ取れば分かる事だが、@buf = <IN> はメモリを一気に
確保する = System CPU time を食う。行入力演算子による
取得は「行末」を探す = 可変長入力なので潜在的に read
より遅い処理。もちろん扱うデータのフォーマット & 量次第
だけどね。

どうしても行入力演算子でやりたければ
$/ = \1024;
while (<IN>) { ... }
で 1024 byte 単位で読めるけど、素直に read 使った方が
速かったかと。
0338336
垢版 |
03/05/27 01:07ID:???
たしかにそうですね。
改行コードを探しながら進むので遅いと。
0339山崎渉
垢版 |
03/05/28 17:05ID:???
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
0341nobodyさん
垢版 |
03/05/28 23:45ID:01rk8ElD
ファイルの書き込みを追記にしたばあいの負荷ってどうなるんですか。
たとえば書き込むものは同じとして、
追記先のファイルが1行のときと1000行のときでは
CPUメモリ負荷はどうなるんでしょう。
追加するだけだから大して変わらないかなと思ったんですけど。
0343
垢版 |
03/05/29 00:29ID:KW4sDDhu
$kazu=(((($my_tech-int(rand($my_tech/4)))*$job_dmg[$job])*$tarou)/$mstamina)*$stamina;
このように一気に計算させるのと、
いくつもに分けて計算させていくのでは
負荷は変わるのでしょうかね?
変わるのならどちらが軽いと思いますか?
0344nobodyさん
垢版 |
03/05/29 00:52ID:???
>>341
追記の場合、元のファイルの大きさはほぼ影響しない。
Cをやっている人間ならわかる(はず)だが、
追記と言うのは、ハードディスク上のファイルの終端を探し出して、
そこから新たなデータを埋めて行き、最後にファイルの大きさを示す数値を変更する作業だ。
従って、ファイルの終端を探し出す作業だけが、ベンチマークに影響する。
0345nobodyさん
垢版 |
03/05/29 00:54ID:???
>>343
メモリの占有率を調べたいなら、そういうソフト入れてベンチマーク取ればわかる。
そして結果を発表すると皆から感謝される。

むしろ、その式は人間が見やすいかどうかを考慮した方がいいと思う。
0346nobodyさん
垢版 |
03/06/01 05:17ID:q1DFdt/M
下記の中で最も負荷が少ないのはどれでしょうか?

1.printを使い一行ずつ出力
2.ヒアドキュメントで出力
3.別ファイルを作り読み取らせて出力

3は後々便利そうだけど、負荷が気になる…。
0348nobodyさん
垢版 |
03/06/01 10:16ID:???
>>346
負荷が少ないって、どっちの?

「省メモリ」? それとも「CPU占有の少なさ」?
0349nobodyさん
垢版 |
03/06/01 11:08ID:???
>>346
>3.別ファイルを作り読み取らせて出力
>3は後々便利そうだけど、負荷が気になる…。

じゃあ外部ライブラリとかあまり使わない方がいいよ。CPANもね。
0350nobodyさん
垢版 |
03/06/01 12:28ID:???
>>346
1.出力処理が遅い。
2.出力処理は早い。
3.良識ある人間のやること。

一般に、メモリ占有量の低いものの方がウェブには向いているよ。
0351nobodyさん
垢版 |
03/06/01 13:28ID:???
>>350
そうか?次々とくる要求に迅速に対応するために処理速度を優先しない?
0352nobodyさん
垢版 |
03/06/01 14:21ID:???
webプログラムは、サーバへの負荷も気をつけないといけないと思うけど、
それよりも、トラフィックを一番に考えてる俺は間違ってますか?
0353nobodyさん
垢版 |
03/06/01 16:03ID:j4GGBbHW
>>347-351
どうもです。
0354nobodyさん
垢版 |
03/06/01 16:59ID:???
そんな細かい事ぐらいでサーバーから言われる事はまず無いので
私も処理速度を優先させるべきだと思うねぇ。
というか、気にするほど大して変わらない。
基地外なほど膨大なデータを扱うならまだしも。
0355nobodyさん
垢版 |
03/06/01 23:12ID:???
想定同時アクセス1000くらいの小さな案件で、
鯖を用意してやるなら、保守性を一番においても問題ないと思う。
0356nobodyさん
垢版 |
03/06/01 23:24ID:8+Lq3hlg
>>355
>想定同時アクセス1000
これって小さいの? 秒間同時アクセス数1000ってことだよね?
0357nobodyさん
垢版 |
03/06/02 02:48ID:???
共有メモリを活用する、繰り返し使用する正規表現はlexで、
大きなプロセスは常駐させてローカルソケットでCGIと通信してCGIは小さく作る、
データベースは下手に使わない、巧く使える場合にだけ使用する。
0358nobodyさん
垢版 |
03/06/03 01:39ID:???
>>354
サーバーがつんでるメモリーの量によってどっち優先かは変わると思われ。
メモリー使い切ったらswapのオーバーヘッドがかかってかえって遅くなるし。
まあ、最近のサーバーはメモリーを湯水のように持っているからそんなこと考える必要ないのかな?
0359nobodyさん
垢版 |
03/06/03 05:54ID:+XIKXuw2
Perl5からPerlでもコンパイルした状態で設置できるようになったと読んだんですがどうすればできますか?
0360nobodyさん
垢版 |
03/06/03 08:09ID:???
>>359
perlccを使う。
使ってどの程度早くなるかは知らんけれどね。
0361nobodyさん
垢版 |
03/06/03 12:08ID:Sjj3JYUN
>>358
共有鯖ならいくらメモリ積んでいようと割り当てられるのは
微々たるもの
0362nobodyさん
垢版 |
03/06/03 21:29ID:???
>>360
散々言われてていることだが、perlccではモジュールはろくすっぽ使えないので注意。
0363nobodyさん
垢版 |
03/06/03 21:58ID:+XIKXuw2
>>360
早速やってみたところかなり速くなりました。
でもサイズが2kちょいから800kほどに...
0364nobodyさん
垢版 |
03/06/03 22:22ID:???
>>363
perlcc使ったことあるけど、2kじゃなくて2MBになったよ
0365364
垢版 |
03/06/03 22:22ID:???
スマソ
0366nobodyさん
垢版 |
03/06/05 20:39ID:???
mod_perlだと数倍早くなるのに
perlcc だと1割くらいじゃない?
0368nobodyさん
垢版 |
03/06/20 01:47ID:???
ダブルクオートを極力使わないだけで結構速くなるらしい。
理由は説明しなくてもわかるよね?
0369nobodyさん
垢版 |
03/06/20 22:16ID:???
>>368
'"'でくくると中に'$'が入っているかを検査してるから?
0372
垢版 |
03/06/24 08:22ID:???
>>371
Yes she does!

PHP のメーリングリストなんかでも、
速度を少しでも稼ぎたいときの小技として紹介されることがあるね。
0373nobodyさん
垢版 |
03/06/25 18:56ID:???
すべてのルーチンを一つのファイルにまとめてしまうのより、
ひとつひとつルーチン毎にファイルを分けて、
一度に呼び出す方が負荷が大きいですか?
0374nobodyさん
垢版 |
03/06/25 22:26ID:???
>373
漏れもそれ思うんだが、ファイルをまとめようが分割しようが、
結局たいした大きさじゃないので、どっちもオンメモリってことない?
0375nobodyさん
垢版 |
03/06/25 23:20ID:???
使わないコードを解釈させない為に分割するんであって、
分割しても常に全部使うのなら、まとめた方がシステムコールが
減っていいと思う。

Perl だったら CGI.pm でやってる遅延読込が参考になるかと。
あれはあれでメモリ食いそうだけど。
0376nobodyさん
垢版 |
03/06/26 03:31ID:???
>>375
それじゃ、useでモジュール呼び出すより、
requireで、必要な所で呼び出す方が良いって事ですね。
0378nobodyさん
垢版 |
03/06/26 03:55ID:???
>>376
別に必要になったところでuseすればいいんでないかい?
そうそう、SelfLoaderかまして起動時には一部しか読み込まれないように工夫しないといかんね。
0381nobodyさん
垢版 |
03/06/26 13:46ID:???
requireはそこに来た時点で読み込まれる。
function hoge() {
require('hoge.php');
}
hoge(); らなければ読まない。
Perlも同じく。
0382nobodyさん
垢版 |
03/06/27 16:09ID:sG/tHFOo
コメントを山ほど書いたら負荷になります?
スクリプト自体軽くした方がいいんでしょうか。
0383nobodyさん
垢版 |
03/06/27 16:19ID:???
>>382
富士山ほどのコメントを書いたら負荷になります。
レスを投稿する


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