web-dev-qa-db-ja.com

`top`に示すようにLinuxに20Gの「キャッシュ」メモリがある場合、malloc()がNULLを返すことができるのはなぜですか?

Linuxにはディスクキャッシュ(20G)で使用される十分なメモリがありましたが、私のアプリケーションは16Mチャンクを割り当てようとしてランダムにOOMエラーを返しました。

スワッピングが無効になっています。 OSの制限はすべて問題ないようです。

Drop_cachesでLinuxキャッシュをクリアした後、エラーが消えました。

何をチェックするべきか、それともどういうわけか予想される動作ですか?

1
nonobe

十分なメモリがありましたが、おそらく断片化されているため、16MBの連続チャンクを取得できませんでした。 Drop_cachesはメモリのデフラグをトリガーするため、その後、malloc要求を受け入れるのに十分な連続メモリが利用可能になります。

(この質問は、おそらくプログラミングフォーラムの1つに適しています。)

2
Tonny

Malloc()は物理メモリを割り当てず、仮想メモリを割り当てます。 Malloc()は、仮想メモリの不足(継続的な空きチャンク)またはコミット制限の超過が原因で失敗する可能性があります。

  1. pstop、またはpmampコマンドを使用して、プロセスの仮想メモリ使用量を確認します。 64ビットアーキテクチャ(AMD64)は非常に大きな仮想メモリを備えており、基本的にそれを使い果たすことは不可能ですが、32ビットプロセスは最大4GBの仮想メモリに制限されます。
  2. 小切手 /proc/sys/vm/overcommit_memoryおよびCommitted_ASおよびCommitLimit行の/proc/meminfo。 overcommit_memoryが1の場合、CommitLimitを超えると、malloc()が失敗します。
2
x22