設定でメモリオーバーコミットを無効にしましたovercommit_memory=2
。これで、swapoff
次のエラーが発生します。
swapoff: /dev/sda5: swapoff 失敗: メモリを割り当てることができません。
しかし、実際には0 MiB
スワップスペースと空きメモリがたくさんあります! 100に設定してみましたovercommit_ratio
が、何の変更もありませんでした。
一時的にデフォルトに設定し、乱用を再び無効にすると成功する可能性がovercommit_memory=0
あります。swapoff
なぜそんなに奇妙な行動をするのでしょうか?これはバグですか?
編集するコメントで質問したように:
$ grep -E '^Mem|Commit' /proc/meminfo
MemTotal: 2044420 kB
MemFree: 751836 kB
CommitLimit: 4122112 kB
Committed_AS: 2752544 kB
答え1
@Matが指摘したように、Commited_AS> MemTotalです。つまり、実際に持っているよりも多くのメモリを割り当てたため、スワップを無効にした場合はオーバーコミットすることになったはずです。したがって、オーバーコミットを許可しないと、一部のメモリが解放されるまでスワップを無効にすることはできません。
割り当てられたすべてのメモリは実際にはありません。使用されるだから、多くのメモリを割り当てたにもかかわらず、まだ利用可能なメモリが残っています。
答え2
これは非常に一般的な混乱です。いくつかの概念は緩く関連しています。
- 物理メモリ使用量
- スワップ領域の使用量
- 仮想メモリの予約
- 仮想メモリ割り当て
プロセスがメモリ(mallocなど)を割り当てるときに実際に行うことは、メモリを予約することです。デフォルトでは、Linuxは仮想メモリをオーバーコミットするので、保存には大幅に気を使わず、通常は正常に返されます。
予約されたメモリに初めてアクセスするときは、メモリはRAMまたはディスク上のページでサポートする必要があります。
RAMからアクセスされたすべての仮想メモリを収容するのに十分なRAMがない場合、システムはページング(しばしばスワッピングとも呼ばれる)を開始し、パフォーマンスが中断されます。
プロセスがスワップとRAM(一部)を組み合わせたよりも多くのメモリを予約し、システムがメモリをオーバーコミットしないように設定されている場合、割り当ては失敗します。これは、十分な空きRAMがあり、スワップ領域のページを使用しない場合にも発生する可能性があります。これは、アプリをランダムにシャットダウンしないシステムを持つために支払う対価です。
ご使用の場合は、使用可能な仮想メモリが十分ですが、一部が予約されているため、一部のスワップ領域が存在する必要があり、これは後者を削除できないことを意味します。