探検


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

1ジークハルト ◆VUxx/EwNXI
垢版 |
02/10/15 10:33ID:ifgLRUyb
サーバ上にPerlやPHPを置く場合、何よりも重視しなければ
ならないのはサーバへの「負荷」。
負荷の高いCGIの使用は削除対象となるのが目に見えてます。
負荷を軽減させるにはどうすればいいか?
どういう書き方をすればいいか?
そんな委員会を開設しました。
369nobodyさん
垢版 |
03/06/20 22:16ID:???
>>368
'"'でくくると中に'$'が入っているかを検査してるから?
370nobodyさん
垢版 |
03/06/21 10:37ID:???
>>369
Yes she does!
371nobodyさん
垢版 |
03/06/24 04:14ID:???
>>370
それはホントなの?
372
垢版 |
03/06/24 08:22ID:???
>>371
Yes she does!

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

Perl だったら CGI.pm でやってる遅延読込が参考になるかと。
あれはあれでメモリ食いそうだけど。
376nobodyさん
垢版 |
03/06/26 03:31ID:???
>>375
それじゃ、useでモジュール呼び出すより、
requireで、必要な所で呼び出す方が良いって事ですね。
377あぼーん
垢版 |
NGNG
あぼーん
378nobodyさん
垢版 |
03/06/26 03:55ID:???
>>376
別に必要になったところでuseすればいいんでないかい?
そうそう、SelfLoaderかまして起動時には一部しか読み込まれないように工夫しないといかんね。
379あぼーん
垢版 |
NGNG
あぼーん
380あぼーん
垢版 |
NGNG
あぼーん
381nobodyさん
垢版 |
03/06/26 13:46ID:???
requireはそこに来た時点で読み込まれる。
function hoge() {
require('hoge.php');
}
hoge(); らなければ読まない。
Perlも同じく。
382nobodyさん
垢版 |
03/06/27 16:09ID:sG/tHFOo
コメントを山ほど書いたら負荷になります?
スクリプト自体軽くした方がいいんでしょうか。
383nobodyさん
垢版 |
03/06/27 16:19ID:???
>>382
富士山ほどのコメントを書いたら負荷になります。
384nobodyさん
垢版 |
03/06/27 16:25ID:???
>>382
わかるほどの差は出ないからちゃんと書いといたほうがいいよ
385あぼーん
垢版 |
NGNG
あぼーん
386nobodyさん
垢版 |
03/06/28 00:11ID:???
>>384
ってことは、少しは変わるんだ…。
387nobodyさん
垢版 |
03/06/28 00:19ID:???
>>386
体感できるほどの差ではない、つまり実質0
388nobodyさん
垢版 |
03/06/28 14:07ID:M/F9ZoCi
>>387
でも少しは…。

↓以下ループ。
389nobodyさん
垢版 |
03/06/28 14:11ID:jkMqlRkL
>>388
ってことは、少しは変わるんだ…。
390nobodyさん
垢版 |
03/06/28 15:08ID:???
変わるんだ…。
391nobodyさん
垢版 |
03/06/28 16:21ID:???
速度と分かりやすさのトレードオフ
392nobodyさん
垢版 |
03/06/28 22:51ID:???
WWW
393nobodyさん
垢版 |
03/06/29 00:15ID:???
正直言って、コメントなんか処理速度に関係なんかない。
そりゃ、数百Mとかのコメントとか入れてたら、
メモリへロードするのが遅くなるだろうが、
処理速度そのものは、何の影響もない。
394nobodyさん
垢版 |
03/06/29 08:04ID:???
え????
コンパイル時に無視されて、コンパイル結果もキャッシュされる
わけなんだから、全く影響しないんじゃ?
395nobodyさん
垢版 |
03/06/29 13:20ID:???
>>394
コンパイル結果に反映されないのは当たり前
コンパイル時に無視するためには最低限の判定が必要
要はコメントかどうか判定するフラグが少ないに越したことがないのか
という話でしょ
396nobodyさん
垢版 |
03/06/29 22:00ID:???
CgiPerl , CgiPHP , mod_php のうち速度が一番なのはmod_phpなのは知ってるけど
負荷が掛からないのはどれ?
397nobodyさん
垢版 |
03/06/29 23:38ID:???
>>396
その中に、なぜmod_perlがないんだ?
398nobodyさん
垢版 |
03/07/01 16:46ID:67Ffrssk
printで一行づつ出力するか、
変数にデータを入れて、printで一気に出力するかどちらが負荷少ない?
それともヒアドキュメント使うか。

どれよ?
399nobodyさん
垢版 |
03/07/01 19:31ID:???
mod_perlは一般的じゃないよ。
400nobodyさん
垢版 |
03/07/01 19:43ID:???
薬物使ったベンジョンソンみたいなもん?
401nobodyさん
垢版 |
03/07/01 20:02ID:???
>>399
mod_perlそんな速くないよ。
402nobodyさん
垢版 |
03/07/01 20:04ID:3/m58fAf
>>398

そうそう、オレも知りたい。結構悩むんだよなー。みんな
その辺の使い分けはどうしてるの?

printよりechoのが速いってのは聞いた事あるけどね。
403nobodyさん
垢版 |
03/07/01 20:06ID:???
とりあえずバッファリングなしは効率が悪い。
404403
垢版 |
03/07/01 20:14ID:???
そういえばPerlにCのfflushのような関数はないのかな?
$|=1;print "";$|=0;とやるしかない?
03/07/01 22:48ID:???
>>398
変数作って一気に出力する。
エンコード自由に変換して掃き出せるようなものの場合はどうしてもこうなる。

ヒアドキュメントは
$aya=<<EOL;
あやや
あひゃひゃ
EOL

で変数ぶち込めるし。
406nobodyさん
垢版 |
03/07/01 23:25ID:???
>>401
どういう使い方してんだ?
407nobodyさん
垢版 |
03/07/02 00:38ID:???
echo "
うほっ
いい男!
";

これでいいだろ
408nobodyさん
垢版 |
03/07/02 08:14ID:???
>>399
mod_phpも同じだ。
>>401
速度は、
mod_perl > mod_php > CGI Perl > CGI php
の順。ちゃんと実験したサイト行って、見て来い。
409404NOTFOUND
垢版 |
03/07/02 20:09ID:???
>>408
>mod_phpも同じだ。

PHP可を謳っている鯖屋はmod_php可という意味で、CGI可(※)を謳っている鯖屋は、
CGI/Perl可という意味で謳っていると思うのだがどうだろうか?

CGI可に比べてPHP可の鯖屋が少ないのは事実だが、mod_Perlを使える
鯖屋を見た事がないのは、漏れの調べ方が甘いからなのか・・・

※)一般的にCGI=Perlという認識があるのでこのような書き方をあえてしたが・・・

つまり何が言いたいかと言うと、mod_php使える鯖がそんなに非一般的では
ないんではないかという事だ。
410nobodyさん
垢版 |
03/07/02 21:32ID:???
mod_php っていう言い方、あんまきかないんだけど、
cgi版じゃない普通(というか一般的というか)のphpってこと?
411nobodyさん
垢版 |
03/07/02 21:52ID:???
>>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対応(ただしコマンドライン版)」という表記をみかけます
412nobodyさん
垢版 |
03/07/02 22:52ID:???
>>411
レン鯖(共有鯖)ではmod_perlを提供できないって事?
って事は一般的な環境ではPHP>perlつー事?
413410
垢版 |
03/07/02 23:27ID:???
>>411
なるほど。さんくすです
414nobodyさん
垢版 |
03/07/03 09:14ID:???
でもな、Perlには、FastCGIとかもあるからな。
415
垢版 |
03/07/04 19:40ID:???
>ちゃんと実験したサイト行って、見て来い。

ああいう非現実的な試行環境に統一して対照されても参考にできないよね、、
まだmsがやったベンチ結果のほうがdqnぽくない
PHP5のケース別ベンチやってくれんかな
個人では実験環境が作れないしzendの情報だけでは激しく不安だし、、

話は変わって、itboostのtips「効率的な処理」に、phpのループ構造は遅いから、
コールバック関数を繰り返し呼び出すとphpではなくcレベルでループが走ってくれるて
いいよってネタがあるけど、これはどうなん?
(あれはcountを一度にすれば大差ないような気もしつつ、、。
個人で実行速度を計測するといえば、ループ処理のことだと言ってもいいかと
おもうんだけど、これってphp特有の問題?
416411
垢版 |
03/07/06 09:05ID:???
>>412
ハンドラ好きにさせるのはもってのほかなので
Apache::RegistryかApache::PerlRunを提供するしかないと
おもうのですが、前述の問題があり、自分の知識内では
不可能と判断しています。
(他に良い方法がないか探してるのですが...)

>>414
FastCGIも、共有サーバだとデーモンプロセス上がりまくりで
現実的では無いような気がしますが^^;

417nobodyさん
垢版 |
03/07/06 09:07ID:???
>>ちゃんと実験したサイト行って、見て来い。
>ああいう非現実的な試行環境に統一して対照されても参考にできないよね、、
どこのサイトを見てるんですか?

418nobodyさん
垢版 |
03/07/06 13:26ID:???
>>417
有名なサイトだよ。35の言語の25のベンチマークによる比較。
http://www.bagley.org/%7Edoug/shootout/
419nobodyさん
垢版 |
03/07/06 13:33ID:???
mod_perlとmod_phpの比較は、ここな。
http://www.linc.or.jp/~takaaki/Family/takaaki/Labo/dynamic_page.shtml
420
垢版 |
03/07/06 23:45ID:???
>417
そのへんはコミュニケーションギャップを楽しむところだと思ったり。
421nobodyさん
垢版 |
03/07/08 03:40ID:???
http://member.nifty.ne.jp/hippo2000/perltips/phpperl.htm
http://member.nifty.ne.jp/hippo2000/perltips/javaperl.htm
このあたりかな?とか思ってました
422山崎 渉
垢版 |
03/07/15 11:10ID:???

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
423nobodyさん
垢版 |
03/07/24 09:32ID:???
保守?
424nobodyさん
垢版 |
03/07/25 23:36ID:???
↑ageとかんかいッ!
425nobodyさん
垢版 |
03/07/26 17:01ID:???
ageんでも保守はできるでしょ

?>
<html><head><title><?=$title=></title></head>
<?php



echo << end
<html><head><title>$title</title></head>
end;

はどっちが軽いんだろうね・・・
426nobodyさん
垢版 |
03/07/26 17:02ID:???
あぁ、 < がひとつ足りないし・・・
427nobodyさん
垢版 |
03/07/27 01:37ID:???
このスレいつも大変参考にさせていただいています。
428nobodyさん
垢版 |
03/07/27 04:46ID:???
>>425
俺は前者だと思う。
429nobodyさん
垢版 |
03/07/27 10:38ID:???
>>428
私もそんな気がして、なるべく上の方使うようにしてる
でも変数が多いところとかは下のやつ使ってる
430nobodyさん
垢版 |
03/07/28 05:31ID:???
PHPに、テキスト中に変数があるかどうか判断させる後者よりも、
明示的にする前者がやっぱ速いかな?特に変数が多いほど。

でも、PHPモードに入ったり抜けたりする負荷(と言えるかな?)を考えると前者のような気もする…
431nobodyさん
垢版 |
03/07/28 11:41ID:???
echo '
<html><head><title>'.$title.'</title></head>
';

これでいいべ
432nobodyさん
垢版 |
03/07/28 16:40ID:???
>>431
長い場合、echoを大量に書くわけにもいかんでしょ
HTMLのフッタ部分は定型に近いから?><?phpを使ってるんだけど
さほど変わらないのかなぁ・・・
433nobodyさん
垢版 |
03/07/31 10:25ID:???
>431-432

http://www.php.net/manual/ja/language.basic-syntax.php

にもあるとーり結局内部的には echo で処理されてるから
あとは可読性の問題じゃないかねぇ。
434山崎 渉
垢版 |
03/08/02 02:24ID:???
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
03/08/02 04:52ID:???
     ∧_∧  ∧_∧
ピュ.ー (  ・3・) (  ^^ ) <これからも僕たちを応援して下さいね(^^)。
  =〔~∪ ̄ ̄ ̄∪ ̄ ̄〕
  = ◎――――――◎                      山崎渉&ぼるじょあ
436nobodyさん
垢版 |
03/08/08 18:33ID:???
mod_perlで動かすと、速いときはバカみたいに速いが、
遅いときはイライラするぐらい遅い。

普通こんなにバラツキがあるものなのですか?
437あぼーん
垢版 |
NGNG
あぼーん
438nobodyさん
垢版 |
03/08/15 12:34ID:???
>>436
新しいhttpdの子プロセス上がった時とかキャッシュがないからでは?
重そうなモジュールは起動時に読み込むようにするとかして
コンパイル時間短くしたら?

439nobodyさん
垢版 |
03/08/20 12:11ID:???
speedyCGIで負荷が高くなると、InternalServerErrorが出るのですけど、
私の書き方が間違っているだけなんですかね?
440nobodyさん
垢版 |
03/08/20 12:21ID:???
>438
mod_perl1.2使ってたとき、モジュールのキャッシュ無視して、別空間にロードされる場合も。
最近のバージョンで改善されているかどうかは不明ですが。
441nobodyさん
垢版 |
03/08/20 14:50ID:???
>>440
モジュールの更新日が変わってるとか%INC消してるとかでなく?
どうやってその現象確認しました?
442440
垢版 |
03/08/21 18:44ID:???
>>441
初回にロードした時間を記録するクラス作って、何度かリロードして確かめた記憶が。
他にも、子プロセス関係で何かしたと思ったけど、忘れた。
%INC消さなくても、ロードされる時はされてましたよ。
ライブラリモジュールに限らず、同一ファイル、同一パッケージ名の空間も
複数のキャッシュが存在してしまうこともしばしば。
それ知って以来、mod_perlは一切使ってませんが。

で、最近のバージョンはどうなんでしょう?
443nobodyさん
垢版 |
03/08/22 04:06ID:???
>>442
webDBで、mod_perlを導入したが、遅い。
まだSpeedyCGIの方がパフォーマンスが良い。

ただ、>>439 の言う通り負荷が高くなると不安定なんだよなぁ。
なんか回避方があったら、教えて欲しいよ。
444nobodyさん
垢版 |
03/08/22 13:11ID:???
>>443
私もWebとPostgresqlで組んでいるのですが、
mod_perlだと、速度のバラツキが尋常でなくて採用を辞めましたよ。
SpeedyCGIが安定さえしてくれれば、何も心配ないのですけどね。
445nobodyさん
垢版 |
03/08/22 15:05ID:qLHm82v9
PHP使えよ。。
446nobodyさん
垢版 |
03/08/22 16:34ID:???
>>444
DBI.pm使ってるからじゃないの?
それはmod_perlのせいじゃないような気が。
447nobodyさん
垢版 |
03/08/22 17:25ID:???
>>446
DBI使うとダメなんですか?
448あぼーん
垢版 |
NGNG
あぼーん
449nobodyさん
垢版 |
03/08/22 23:56ID:???
>>447
>>446じゃないが、DBIは遅い気がする。

あとDBIじゃなかったかな?サーバー名にIPアドレスじゃなくて
FQDN指定するとident投げるのって。
identが繋がらないとタイムアウトするまで固まるんだよな。
450nobodyさん
垢版 |
03/08/23 00:30ID:???
そういえば、PostgreSQLの日本語サイト見てたら、以外にも
Perl/CGIで利用しているところが多いのにビビりました。
DBMS使う以上、何らかの効率性を望んでいるのだと思うけど、何故Perl/CGIなんだと問いつめたいよ。
451nobodyさん
垢版 |
03/08/23 00:44ID:12CD5sBt
>>450
逆に、Perl/CGIだと何がだめなのか説明してみてください。
03/08/23 01:44ID:???
http://endou.kir.jp/hankaku/
http://homepage.mac.com/hiroyuki45/hankaku
03/08/23 09:33ID:???
>>450
漏れはMysq;でPerl/CGIしてるけど、移植元がperlだったから単純に鯖の負荷軽減が目的だったりしたが・・・
それに、Phpだと複雑なソース書ききれんかったろうってのもあるわけだが、お前さんはなにでやれと?
454nobodyさん
垢版 |
03/08/23 13:18ID:???
PHP使えよ。
455nobodyさん
垢版 |
03/08/23 16:29ID:IynKNpCX
perlなんだが。
ある位置から数行くらい読み込む時、
10kbくらいのファイルと、300kbくらい(要するにでかい)ファイルでは
負荷に違いってあります?

open IN, ...;
for($i=0; $i<10; $i++){
$line = <IN>;
...処理
}
close IN;

みたいなプログラムでつ。
456nobodyさん
垢版 |
03/08/23 16:46ID:???
>>455
どうやって「ある位置」までファイルポインタを移動させるかに依る。
行単位で空読みさせて移動するよりは seek 一発の方が速い。
その例だとファイルの先頭からだから変わらん。
457nobodyさん
垢版 |
03/08/23 19:02ID:V3x8NgSH
>>453
Perlで書けてPHPで書けない「複雑ソース」って何?
458nobodyさん
垢版 |
03/08/23 19:07ID:???
LHA圧縮。
459nobodyさん
垢版 |
03/08/23 19:20ID:???
>>457
最近あまり追ってないんだが、
PHPってtermiosによる端末制御できたっけ?
fork()は出来るけどpipe()は出来たっけ?

あと、PHPはスコープが滅茶苦茶だから(まぁPerlも変だけど)
あまり大きいソースを多人数で書くのには向いてないと思う。
460455
垢版 |
03/08/24 10:10ID:XoFfp7Kp
>>456 サンクス
1行の文字数が不定なんでseekで飛ぶことが難しいんす。
2chログのように301-400だけ表示みたいな場合は
やっぱ空読みしてるんかな。
461nobodyさん
垢版 |
03/08/25 08:37ID:???
>>460 間違いなくシークしてると思う。
462455
垢版 |
03/08/25 11:33ID:???
でもどうやってx行目を見つけ出すの?
適当にread系のcgiを漁ってみたけど、やっぱ空読みしてるみたいだわ。
463nobodyさん
垢版 |
03/08/25 12:48ID:???
>>462
1000行程度なら空読みでいいと思う。
万単位になったら、インデックスと作るとか対策考えろ。
464nobodyさん
垢版 |
03/08/25 13:26ID:???
>>462
1、行ごとのファイルポインタを記録してある。
2、一定件数ごとに、ファイルポインタを記録してある。
3、2chは入力値の長さが決まっているから、固定長フォーマットにしてある。

これだけのアクセス数があるところで、空読みは考えにくいな。
板のトップで、数千行単位で空読みされるのですか?
465nobodyさん
垢版 |
03/08/25 14:55ID:JfnblB1o
>>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より呼び出される回数は圧倒的に少なく
それほど問題にならない気が。
466nobodyさん
垢版 |
03/08/26 10:19ID:???
>>465は説得力がありますね
467nobodyさん
垢版 |
03/08/27 01:27ID:???
useって宣言した場所によって読み込まれる時期が違うの?
それならJcodeなんかは先頭でuseせずに
送られてきたデータのチェック済ませてから読み込ませた方が良いのかな。
#チェックにJcode使うなら別だけど
468nobodyさん
垢版 |
03/08/27 02:23ID:???
>>467
http://www.perldoc.com/perl5.8.0/pod/func/use.html
http://www.perldoc.com/perl5.8.0/pod/func/require.html
レスを投稿する


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