1

私の問題は次のとおりです。

多くのメモリを使用する perl スクリプトがあります (キャッシュのために予想される動作)。しかし、キャッシングをすればするほど遅くなり、プロセスがほとんどの時間をスリープ モードで過ごすことに気付きました。

プロセスにメモリを事前に割り当てると、パフォーマンスが向上する可能性があると考えました。

誰かがここに何かアイデアを持っていますか?

更新

ここではあまり明確ではないと思います。私はより明確な方法で質問をします:

perl スクリプト内で事前に割り当てる方法を探しているわけではありません。ここではあまり役に立たないと思います。私が興味を持っているのは、後で入ってくる他のプロセスと競合する必要がないように、OS に perl スクリプトに X 量のメモリを割り当てるように指示する方法です。

メモリ使用量を回避できないと仮定します。とはいえ、私もそれを減らす方法を模索していますが、そこに大きな改善は期待できません. 参考までに、私はsolaris 10マシンで作業しています。

4

10 に答える 10

4

あなたの投稿とコメントから私が集めたものはこれです:

  • メモリ使用量が増えるとプログラムが遅くなる
  • あなたのプログラムは、コンピューティングではなく睡眠にますます時間を費やしています。

最も可能性の高い展開: スリープとは、リソースが利用可能になるのを待つことを意味します。この場合、リソースはメモリである可能性が最も高くなります。確認するには、vmstat 1 コマンドを使用します。sr 列を見てください。一貫して 150 を超える場合、システムは要求を満たすためにページを解放しようとします。これには、pi、po、fr 列の高いアクティビティが伴います。

これが実際に当てはまる場合、最良の選択肢は次のとおりです。

  • 需要を満たすためにシステムメモリをアップグレードする
  • 手元のシステムに適したレベルまでメモリ使用量を減らします。

メモリの事前割り当ては役に立ちません。どちらの場合でも、メモリの需要はある時点で使用可能なメイン メモリを超えます。次に、カーネルは、どのページを今すぐメモリに入れる必要があるか、どのページをクリアして、より緊急に必要なページに再利用できるかを決定する必要があります。定期的に必要なすべてのページ (ワーキング セット) がメイン メモリのサイズを超えると、システムはページをセカンダリ ストレージとの間で絶えず移動します (スワップ)。その場合、システムはスラッシング状態であると言われ、有用な作業にあまり時間を費やしません。メモリを追加するか使用量を減らす以外に、これについてできることは何もありません。

于 2008-09-27T00:25:00.020 に答える
2

コメントから:

メモリの制限はそれほど深刻ではありませんが、メモリのフットプリントは簡単に GB にまで膨れ上がり、メモリをめぐって競合するプロセスがあると非常に遅くなります。他のプロセスが多すぎてもスラッシングが最小限になるように、OS からメモリを確保したいと考えています。ジャグマル

それでは、別のタックを取りましょう。問題は、特に Perl スクリプトにあるわけではありません。代わりに、マシン上のすべてのプロセスがメモリを消費しすぎて、マシンが構成どおりに処理できなくなります。

メモリを「予約」できますが、スラッシングを防ぐことはできません。実際、メモリを使用しているのか、後で使用するためにメモリを保存しているのかを OS が認識できないため、問題が悪化する可能性があります。

私はあなたが共有地の悲劇に苦しんでいると思います。問題のマシンに他の多くのユーザーがいるというのは正しいですか? もしそうなら、これは技術的な問題というより社会的な問題です。必要なのは、介入してマシン上のすべてのプロセスを調整する人 (おそらくシステム管理者) です。彼らは、最も贅沢なメモリ ホグを見つけ、プログラマと協力してシス​​テム リソースのコストを削減する必要があります。さらに、リソースの割り当てが効率的になるようにプロセスをスケジュールするように手配する必要があります。最後に、予想されるシステム負荷を処理するために、ハードウェアの追加または改善が必要になる場合があります。

于 2008-09-26T19:17:43.083 に答える
0

私は最近、アレイの事前割り当てを含む優れたRandalL.Schwartzの記事を再発見しました。これが問題であると仮定すると、そのコードのバリエーションを使用して事前割り当てをテストできます。ただし、必ず結果をテストしてください。

キャッシュが増えるとスクリプトが遅くなる理由は、スラッシングである可能性があります。おそらく、そもそもキャッシュする理由は、パフォーマンスを向上させるためです。したがって、簡単な答えは、キャッシュを減らすことです。

これで、メインメモリの使用量を減らし、スラッシングを回避するようにキャッシュスキームを変更する方法があるかもしれません。たとえば、メモリではなくファイルまたはデータベースにキャッシュすると、パフォーマンスが向上する場合があります。ファイルシステムとデータベースのキャッシュは、アプリケーションのキャッシュよりも効率的であり、複数のインスタンス間で共有できることがわかりました。

別のアイデアは、他の領域でのメモリ使用量を減らすためにアルゴリズムを変更することかもしれません。たとえば、ファイル全体をメモリにプルする代わりに、Perlプログラムは行ごとに読みやすくなる傾向があります。

最後に、メモ化モジュールについて調べましたか?すぐには適用できないかもしれませんが、アイデアの源になる可能性があります。

于 2008-09-24T16:22:30.847 に答える
0
my @array;
$#array = 1_000_000; # pre-extend array to one million elements,
                     # http://perldoc.perl.org/perldata.html#Scalar-values

my %hash;
keys(%hash) = 8192; # pre-allocate hash buckets 
                    # (same documentation section)

あなたのコードに精通していないので、ここでいくつかの野蛮な憶測を思い切って[笑い]、これらのテクニックはあなたのスクリプトに新しい大きな効率を提供しないだろうが、事前割り当ては少し役立つかもしれないと思います。

幸運を!

-ダグラスハンター

于 2008-09-24T15:46:34.037 に答える
0

これを行う方法はまだ見つかりませんでした。

でも、わかった(詳しくはこちら

レキシカル (つまり、my() 変数) に割り当てられたメモリは、たとえスコープ外に出ても、再利用または再利用できません。変数がスコープに戻った場合に備えて予約されています。グローバル変数に割り当てられたメモリは、undef()ing および/または delete() を使用して (プログラム内で) 再利用できます。

したがって、ここでの可能性は、特定の時点でレキシカル変数の合計メモリ出力を減らすことができるかどうかを確認することであると考えています。

于 2008-09-25T12:38:32.953 に答える
0

http://metacpan.org/pod/Devel::Sizeを見てください。

上記を行うために ac 関数をインライン化することもできます。

私の知る限り、Perl から直接メモリを割り当てることはできません。XS モジュールを作成するか、前述のようにインライン C 関数を使用することで、これを回避できます。

于 2008-09-24T15:32:54.663 に答える
0

できることの 1 つは、solaris ゾーン (コンテナー) を使用することです。
プロセスをゾーンに配置して、RAM や CPU などのリソースを割り当てることができます。
いくつかのチュートリアルへの 2 つのリンクを次に示します。

  1. Solaris コンテナ ハウツー ガイド
  2. Solaris 10 08/07 OS でのゾーン リソース制御
于 2008-10-01T06:49:20.283 に答える
0

limitまたはulimitを探しているようです。しかし、制限を超えたスクリプトが失敗する原因になると思いますが、これはおそらくあなたが望んでいるものではありません。

キャッシュされたデータをプロセス間で共有することをお勧めします。私の経験では、データをデータベースまたはファイルに入れることはうまくいきます。

言いたくないのですが、メモリの制限がこれほど厳しい場合、Perl はおそらくこのアプリケーションに適した言語ではありません。Cの方が良い選択だと思います。

于 2008-09-25T15:27:40.643 に答える
0

あなたが要求したように事前に割り当てているわけではありませんが、perl が OS にプログラム用により多くのメモリを要求する必要がある場合に、より大きなチャンクでそれを取得できるように、ラージ ページ サイズのオプションを確認することもできます。

この違いとその方法の詳細については、 Solaris Internals: Multiple Page Size Supportを参照してください。

于 2009-01-12T00:29:34.050 に答える
0

自問するかもしれないいくつかの質問:

  • 私のデータ構造は目の前のタスクに本当に役立つでしょうか?
  • 本当にそんなにキャッシュする必要がありますか?
  • しばらくしてからキャッシュされたデータを破棄できますか?
于 2008-09-24T15:16:21.583 に答える