ソースを見る時間がありませんでしたが、ここにいくつかのコメントがあります:
質問1.このような強力なサーバーでは、なぜオペレーティングシステムがそのようなメモリをアプリケーションに提供できないのでしょうか(実行中の唯一のアプリケーションでした)?
ErlangVMが使用可能な空きメモリを超えて消費しようとしたためです。
質問2.私が起動するErlangエミュレーターは、必要な数のプロセスを生成できるように指示されています。値+P13421779。IsErlangVMがこのメモリへのアクセスに失敗するか、プロセスへの割り当てに失敗しますか?
いいえ。プロセスが不足している場合、Erlang VMはそのように言っているでしょう(そしてVMはまだ稼働しています):
=ERROR REPORT==== 18-Aug-2011::10:04:04 ===
Error in process <0.31775.138> with exit value: {system_limit,[{erlang,spawn_link, [erlang,apply,[#Fun<shell.3.130303173>,[]]]},{erlang,spawn_link,1},{shell,get_command,5}, {shell,server_loop,7}]}
質問3.Solarisには、epmdという1つのプロセスがあり、おそらく数千のマイクロスレッドを含み、開始します。 「メモリを大量に消費する」アプリケーションがどれほど多くても、アプリケーションを停止できないようにするために、Solarisにどのような構成を適用できますか?使用可能なスワップスペースは16GB、RAMは20 GBです。正直なところ、何か問題があるはずです。
epmd
Erlangポートマッピングデーモンです。配布されたErlangの管理を担当し、個々のErlangアプリケーションとは何の関係もありません。探す必要のあるプロセスは、beam.smp
という名前になります。 最も可能性が高い。これらはErlangVMなどのOSメモリ消費量を示します。
質問4.特に必要なすべてのメモリがサーバーで利用可能な場合にこれらのヒープメモリのクラッシュダンプを回避するために、Erlangエミュレーターに対してどの構成を行うことができますか? Erlangがまだそのようなメモリを単純なファイルシステムインデクサーに割り当てることができない場合(非常に同時)、このサーバーでより多くのメモリを消費するアプリを実行するにはどうすればよいですか?
Erlang VMは、マシンで使用可能なすべてのメモリを使用できる必要があります。ただし、アプリケーションの作成方法によって異なります。メモリリークには多くの理由が考えられます:
- アトムテーブルがいっぱいになります(作成する一意のアトムが多すぎます)
- ETSまたはMnesiaテーブルはガベージコレクションされません(古い未使用の要素は削除されません)
- プロセスに十分なメモリがありません(生成するプロセスが多すぎます)
- 作成されるバイナリが多すぎます(古いバイナリへの未使用の参照を保持する可能性があります)