• 締切済み

Perl実行時のメモリ不足について

こんばんは。いきなりですが、質問があります。 CGIで動的にHTMLを作成したのですが あるページに多数ユーザが接続しようとすると フリーズしてしまいます。 調査してみたところ、Perlが実行時にメモリを 多く確保しているためのようです。 また、そのページではフレームを使用しているため、 1ユーザに複数プロセスが起動されるので、 それもメモリ不足の原因ではと思っています。 メモリの使用量を下げようとしているのですが、 知識足らずなため、思うようにいきません。 どなたか良い方法をご存知でしたら、 教えていただきたいのですが。 よろしくお願いします。

  • Perl
  • 回答数3
  • ありがとう数5

みんなの回答

回答No.3

あ、今見返していたらバグが。すみません。 sub my_function { my ($bigbigbig_data_ref) = @_; for my $data (@$bigbigbig_data) { は for my $data (@$bigbigbig_data_ref) { ですね。 なんか読み返すと、tayahaさんを初心者と決めつけてるようなところ があって…お気を悪くしたらごめんなさい。 もしご存知無かったら、ということなのですが…そうそう、 サブルーチンの返り値となる変数もmyして結構ですよ。 sub my_func { my $abc; .... return $abc; } my_funcを呼び出した側で$abcを使ってる場合はmy_funcを抜けても $abcは掃除されることはありません。(my_funcを呼び出した関数が 終わったときに掃除されます) 要するに、基本的になんでもmyを付けましょう、ということです。 perl -w オプションとuse strict;を使いましょう。 グローバル変数についても use vars qw(@MY_GLOBAL_ARRAY); として、明示的にグローバルとして使う!と宣言してないものがあれば 警告してくれます。

回答No.2

いくつかチェックポイントはあると思います。 まず、そのCGIは本当に必要か。普段は静的なHTMLページを表示して、 情報が更新されたときだけそのHTMLページを更新するようなことです。 掲示板でも最近多いですよね。ただ見るときだけのときは「~xxx.cgi」 ではなくて「~/xxx.html」を閲覧するようなもの。それで済むなら そうしましょう。 次に、やはりプログラムのシェイプアップでしょうか。これには、さまざま な場合があるのでひとくちにご説明するのは無理ですが、よく見かける ものを念頭にちょっとだけポイントを書いてみます。 ・ファイルの中身を @data = <FILE> といった調子で丸ごと読みこんで いる個所があったら、 while (<FILE>) { } の形に直しましょう。確保されるメモリが1行分で済むようになります。 ・グローバル変数を多く使ってるならなるべく局所変数にしましょう。 $abcがforループの中でしか参照されないのだったら、 my $abc; for $abc (@array) { $abc = .... } よりも for $abc (@array) { my $abc = .... } のほうが、いいということです。ループを抜けるときに掃除されますから。 サブルーチンでも同様です。サブルーチンの中だけ使うのならそこで my。 ・サブルーチンを呼び出すとき、配列やハッシュを引数として受け渡しする かわりにリファレンスを渡す。 &my_function(@bigbigbig_data); .... sub my_function { my (@bigbigbig_data) = @_; for my $data (@bigbigbig_data) { ..... } よりも、 &my_function(\@bigbigbig_data); .... sub my_function { my ($bigbigbig_data_ref) = @_; for my $data (@$bigbigbig_data) { ..... } の方がベターということです。Perlのサブルーチン呼び出しはコピーに なります。上記の例であれば@bigbigbig_dataが丸ごとコピーされることに なります。ここでリファレンスを渡すようにすると、リファレンスそのもの だけがコピーされ、両方とも同じものを指す、すなわち余分なメモリを食わなく なるわけです。まあこれは程度問題で、$abc = 123とかの小さいデータを 渡すときにもムキになってリファレンスにする必要はありませんが。 他にも、細かいテクニックはいろいろあります。(ラクダ本の後ろの ほうにあるメモリを節約するテクニックについて解説した章も参考に してください) 以上をやってもキツい場合、ちょっと細かいテクニックになりますが、 セマフォを使って制限できる場合もありますね。 乱暴に言えば、flockを一度に単数のアクセスに制限するものとするなら 一度に複数のアクセスを許すロックみたいなものです。 詳しくはperldoc -f semctlやperldoc IPC::Semaphoreをご覧ください。 OSによっては使えない場合もあります。 まあ、自前でロックファイルを作るような形で、セマフォにあたるものを 作成する方法もできなくはないでしょう。 20個なら20個のアクセスまでを許し、それを越えていたら20以下になるまで スリープする、あるいはエラーページを吐いて終わるような仕掛けを。 あと、大胆に、CGIのいくつかを他のサーバにおいてそっちで起動するように する方法もあるでしょう。 ------ たしかにサーバ側でコネクションを絞る手もありますね。例えば ApacheだとMaxClientsやMaxSpareServersで設定することになるんでしょうか。 でも1.3ぐらいだと、全体でのDirectoryごとに細かくコネクション数を 設定できなかったような記憶があります。CGI以外の静的ページについても 制限することになりますね。まあ、背に腹は代えられないってことですかね。 それとも最近のバージョンだと違うのかな?また別のサーバなら話はまったく 異なるでしょうね。

  • akino4
  • ベストアンサー率18% (35/185)
回答No.1

一般的にはwebサーバがわでマックスのコネクション数を設定できるので それで制御しましょう。 もしwebサーバをいじれないのなら、perlプロセスの数をpsコマンドで数えて 多かったら「不可が高いです」だけだして即終了してしばらくまってもらうとか そうすれば最悪の事態は確率的に回避できます。 でも、一番懸命なのはスクリプトをもう一度みなおして無駄に変数を つかってないか確認してみましょう。

関連するQ&A

  • メモリ不足ですとでます。

    メモ帳などを保存しようとすると、メモリ不足ですとでます。 でも、保存はされているようなので、特に問題はないのですが、 何に、メモリを使っているのか気になりますし、 何とか減らしたいとは思っていますが...どうでしょうか? タスクマネージャのプロセスでは、 プロセス:29 CPU使用率:4% コミットチャージ:149MB/1158MB となっております。 --------------------------------------------- XP:512M、Pentium4 と性能は良いとは思うのですが... アンラボのウイルスソフト、ファイアーウオール有 これは、昔から入ってます。メモリ不足は最近でました。

  • メモリ不足エラー

    業務で使用するサーバーをWindowsNTからWindows 2000 Advanced Serverへ切り替えたところ、Oracleが正常稼動しなくなりました。エラーは、ORA-4030「stringバイト(string,string)を割り当てようとしてプロセス・メモリーが不足しました。 」となっており、OS上のメモリ使用が2Gを超えていたため、エラーになりました。 Oracleを使用するアプリケーションは、変更しておらず、処理内容もNTのときと、まったく同様です。なぜ、メモリ使用が高まったのかを知りたいのですが、どなたかこのような現象に遭ったことのある方はいらっしゃいませんでしょうか? また、Oralceへ問い合わせたところ、メモリ使用率が上がっていることまでは、追求できず、メモリを2Gから3Gにすることで、対応指示がきました。 調査する術(どこかの会社に調査依頼ができるかなど)を教えていただけるだけでも、ありがたいです。大変困っておりますので、どうか、お願いします。 (WindowsOsカテゴリーでも質問しましたが、応答がなく、こちらにも書かせていただいている次第です。)

  • ブラウザがこのようになってしまうのはメモリ不足ですか

    光回線で、インターネットしていて、みようとしているホームページが たまにこのような感じになってフリーズしたような形になってしばらくしてページが開くというのはやっぱりメモリ不足のせいですか・ メモリ増やせばサクサク動くようになりますか 一応512めがのめもりに1ギガ足すことにはしました。

  • メモリ不足

    起動時の空きメモリは1300mb位あるのですが、起動後7分で50mbになってしまいます。そしてメモリ不足ですとのメッセージが時々現れて作業ができなくなります。 タスクマネージャーのパーフォーマンスタブに表示されている情報を書きますと、次のような感じです。 物理メモリ(MB) 合計         3261 キャッシュ済み   2165 空きメモリ         3 システム    ハンドル 19745 スレッド 836 プロセス 82 起動時間 ページファイル 1366m/8088m OSはVISTAです。 メモリ不足解消方法をご存知の方教えてください。

  • OSXのメモリ不足について

    お世話になります。 マックOSX(10.1.4)で、Classicを立ち上げて、いくつかのアプリケーションを使っていると、しばらくして「メモリがいっぱいです、、、」のようなメッセージが表示され、ひどいときにはそのまま固まってしまいます。Process Viewerでプロセスのリストを確認すると、LaunchCFMAppという名前のもの(沢山ある??)のうちの一つのメモリ使用率が、様々なアプリケーションを開いたり閉じたりしているうちにどんどんと大きくなっていき、最終的には70%を越えてメモリ不足に陥っているようです。どうやらClassicを立ち上げると同時に立ち上がる何かのアプリケーションもしくはClassicでの何かの設定が関連しているような気もするのですが、これはいったい何者でしょうか?また、このメモリ不足を防ぐ方法はありますでしょうか?みなさまにはこのような問題はないのでしょうか?なにとぞご教授のほどよろしくお願いいたします。

    • ベストアンサー
    • Mac
  • メモリ不足らしいのですが。

    Windows Media Playerで携帯電話に音源を同期しようとすると「メモリ不足のため同期できませんでした」と出ます。 ソフトをインストールする時も「この操作をするのに十分な記憶域がありません」とエラーメッセージが出てしまい出来ません。 アンインストールする時も同じくメモリ不足か、「Install Shield エンジン (iKernel.exe)を起動できませんでした。」というメッセージが出てきます。 とにかくメモリが足らないようなのですが、パソコン初心者なりに調べて、 ・タスクトレイからできるだけ常駐アイコンを減らす。 ・システム起動時に自動起動されるプロセスをなるべく停止。 ・デスクトップのアイコンの数を減らす。 ・デフラグ。 など試しましたが効果ありません。 Cドライブにはまだ80GB以上の空きがあります。 PCはNECのPC-VF5006D Windows xp Home EditionのSP2です。 Celeron 2.00GHzでメモリは512MBです。 これも必要かどうかわかりませんが、タスクマネージャでは、 ハンドル 8939 スレッド 434 プロセス 40 物理メモリ 合計 490988 利用可能 119460 システムキャッシュ 207600 コミットチャージ 合計 348844 制限値 1145932 最大値 408224 カーネルメモリ 合計 57444 ページ 45404 非ページ 12040 です。 これ以上できることはあるでしょうか? お手数かけますが、よろしくお願いします。

  • SSI で #exec 以外で Perl-CGI を実行する方法は?

    最近 CGI に興味をもち Perl を始めました。 簡単なサンプルを無料サーバーにアップロードして cgi だけを 直接実行すると問題なく実行されます。 ですが SSI の #exec を使って HTML ソースに <!--#exec cgi="/cgi-bin/sample.cgi" --> と記述してページを開くと [an error occurred while processing this directive] と表示されてエラーになりました。 無料サーバーは infoseek で CGI/SSI は使えると書かれていたので 試してみました。それでもう一度確認の為に読んで見ると『#exec』は セキュリティ強化のため利用できないことが判明しました。 http://help.www.infoseek.co.jp/isweb/20602.html#7 質問内容: (1)CGI/SSI は使えるが #exec は使えない状況でどうやって Perl-CGI を   HTML ソースに記述して実行すればよいのか? (2)CGI は cgi-bin に置きパーミッションを 755 に設定しています。   設定は infoseek さんの指示通りです。他に設定すべき点ありますか? (3)Perl-CGI の1行目ではちゃんと『#!/usr/local/bin/perl』と記述しています。   こちらも infoseek さんの指示通りです。   Perl の記述で何か気をつけるべき点はありますか?バグ以外で。 (4)HTML ソースの拡張子は shtml にしています。   SSI を使うにはサーバーが対応していれば拡張子を変えるだけで使えるのですか? 今回の質問は Perl-CGI を HTML ソースに記述して実行する?には どうすべきかをお聞きしたいです。infoseek さんの情報は次のリンクです。 http://help.www.infoseek.co.jp/isweb/20601.html またネット検索していたら次のページを発見しました。 http://cocohome.hp.infoseek.co.jp/ssi/ ここの人は私と同じ infoseek で SSI 入門を書いています。 なぜこの方は SSI の #exec が使えるのでしょうか? この辺も知りたいです。 分かる方お願いします。 教えて下さい。

    • ベストアンサー
    • CGI
  • CGI-PerlとPHPの速さについて

    CGI-PerlとPHPの比較サイトを見てまわっていたところ、 「PHPは多くのアクセスがあっても(CGIに比べ)サーバへの負荷が少ない」 という内容を見かけました。 一般に「PHPはCGI-Perlより速い」と言われている気がしますが、 もしかしてそれは、アクセスが多数ある場合に限定した話なのだろうか、と疑問に思いました。 ローカルサーバなどで1人~数人しかアクセスしないという環境でも、 同じことが言えるのかどうか知りたいです。お願いします。

  • メモリ不足の表示

    Dell Optiplex GX6200 OSはWindowsXP ハード容量200G メモリ2Gを使用しています。 図面関係の仕事をしているのですが、今まで問題なく使用できていたものが急にメモリ不足の表示が出て画面がフリーズするようになりました。 特に何かをいじった覚えもなく、さほど大きな容量の仕事でなくてもメモリ不足の表示が出ます。 原因がお分かりの方がいらっしゃいましたら、どなたか教えてください。

  • Perlのアドレスについて

    はじめまして、 Webサーバー初心者です。 CGIを動かすモジュールを入れて実際自分のサーバーでCGIを動かそうと思ったんですが、CGIのプログラムの頭にある「#!user/local/bin/user」(←例です)などのアドレスの指定がよくわかりません。よく、レンタルサーバーとかであると「うちのPerlのアドレスは#!user/local/bin/user」ですなどと表示されていたりしますが、今回は自分がサーバーなのでほかのユーザーがPerlを使うときにアドレスを指定してあげないといけません。どうしたら自分のサーバーのPerlの場所の指定ができるのでしょうか?(ようは,私の場合どのようなアドレスになるのかが知りたいわけです) ちなみにPerlのインストール先は「C:\Perl」でソフトは「Active Perl」を使用しております。サーバーのOSはWindowsXP(Pro)です。 よろしくお願いします。

専門家に質問してみよう