スワップレス マシンで一連の Python スクリプトのパフォーマンスを評価しようとしています。
コマンドでプロセスを監視するとtop
、常駐メモリ サイズよりもわずかに大きい仮想メモリ サイズが得られます。
この時点で、仮想メモリは何を参照していますか? 常駐メモリは含まれますか?
編集:関係ないというコメントに従ってpythonタグを削除しました
スワップレス マシンで一連の Python スクリプトのパフォーマンスを評価しようとしています。
コマンドでプロセスを監視するとtop
、常駐メモリ サイズよりもわずかに大きい仮想メモリ サイズが得られます。
この時点で、仮想メモリは何を参照していますか? 常駐メモリは含まれますか?
編集:関係ないというコメントに従ってpythonタグを削除しました
この場合、top が仮想メモリの使用量を一覧表示することが理にかなっている理由は 2 つあります。
kindallが指摘したように、メモリマップがあります。その効果により、メモリにマップされるすべてが実際に存在する必要はありません。また、共有ライブラリのような頻繁に使用されるファイルをメモリに一度ロードするだけでよく、複数のプロセスの仮想アドレス空間に単純にマップされるという効果もあります。
Linuxにメモリを要求すると、実際に提供することなく、仮想アドレス空間にメモリがあることをメモするだけです。つまり、提供される可能性があるよりもはるかに多くのメモリを自由に要求でき、top によって割り当てられた仮想メモリとして報告された数字を膨らませることができます。カーネルがメモリを使い果たすと、OOM キラーは単にあなたを撃つだけなので、そのメモリをすべて使用することはできません。
どちらの点も、完全に仮想化されたメモリ システムの下で作業していることを明確に示しています。これでは、任意のページをディスクにスワップ アウトして「グレースフル」な劣化を実現するという別のトリックを行うことはできません。
プログラミングの質問ではありませんが、とんでもないことです。実行可能ファイルとその共有ライブラリは、実行可能ファイルの起動時に一度にロードされるのではなく、RAM にメモリ マップされます。これにより、プロセスの起動時間が短縮され、実メモリの使用量も削減できます (実行可能ファイルのすべてのコードが必要でない場合)。これはスワップではありませんが、VM システムによって行われるため、仮想メモリとしてカウントされます。