0

ログファイルに次のメッセージがあるため、プロセスの1つが何度も再起動しています。

Wed Jun 13 10:07:32 2012: terminate called after throwing an instance of 'std::bad_alloc'

Wed Jun 13 10:07:32 2012:   what():  St9bad_alloc

これは、「新しい」リクエストにメモリを割り当てることができないためだと理解しています。私が理解していないのは、「free -m」が、キャッシュを破棄して多くの空きメモリが利用可能であることを示していることです:

-bash-3.00$ 無料 -m

         total       used       free     shared    buffers     cached

Mem:         32175      32113         61          0        412      24021

-/+ buffers/cache:       7679      24495

Swap:        12287          0      12287 

空きメモリ (現在のキャッシュを使用) が非常に少ないため、問題が発生していますが、「新しい」要求に対応するために、このキャッシュを解放できると思います。または、キャッシュを強制的に解放するために何かをオンにする必要がありますか、それとも何か他の問題が発生していますか?

4

1 に答える 1

5

いくつかの理由が考えられますが、まず、要求しているメモリ量を把握することから始めてください。

これが発生する理由は 2 つ考えられます。負のサイズの割り当て、または大きなサイズ (32 ビット マシンで 4GB 以上) の割り当てです。または断片化の問題 (多くの割り当てなしの呼び出しの後に発生する可能性がありますが、それほど一般的ではありません)。

メモリの断片化を確認するには、魔法の SysRq キーを使用できます。次のコマンドを実行するだけです。

echo m > /proc/sysrq-trigger このコマンドは、現在のメモリ情報を /var/log/messages にダンプします。RHEL3 32 ビット システムの例を次に示します。

7 月 23 日 20:19:30 localhost カーネル: 0*4kB 0*8kB 0*16kB 1*32kB 0*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 0*4096kB = 1952kB)

==EDIT== 結果の読み方: システムが起動すると、メモリが連続メモリの 4Mb (4096Kb) チャンクに分割されます。システムがメモリを割り当てるたびに、これらのチャンクは小さなサイズに分割され、OS は最も近い 2 乗のメモリ チャンクを割り当てます。

したがって、「1*1024kB」は、システムに 1 Mb の連続メモリがあることを意味します。

「4*1024kB 0*2048kB 0*4096kB」のような場合、4Mb の空き容量がありますが、4 つの 1Mb チャンクに分割されます。OS に 4 Mb の 1 つの割り当てを要求すると、1 つの割り当てが連続したメモリを返さなければならないため失敗します。

これがあなたにとって意味のあるものであることを願っています(-;

于 2012-06-13T12:15:42.993 に答える