この質問 から続きます。それが重要な場合、Debian。
一部のメモリがフォークされたプロセス間で共有されていることを理解しています。次に、フォークされたプロセスのプロセス/セットによって使用されているメモリの量をどのように判断できますか?
この同様の質問 で推奨されているsmemツールを使用すると、次のような値が得られます。
Command Swap USS PSS RSS
/usr/sbin/spamd --create-pr 0 16820 24974 41628
spamd chil 0 19388 27581 44176
spamd chil 0 32328 40038 55708
スワップ列を理解しました。RSS列は通常報告されるものです(例:ps)。 smemのドキュメントを読むと、USSはその子専用のメモリであり、PSSはプロセス間で共有されるメモリの一部であるように思われます。ただし、USSをPSSに追加すると、RSSよりも高い値が得られるため、共有の意味は少なくなると思いました(したがって、おそらく誤って解釈しています)。
私はsmemツールに縛られていません。プロセスが使用している実際のメモリの量をある程度正確に反映する「メモリ使用」数を取得する方法が必要です。
比例セットサイズは、おそらく、利用可能なプロセスごとのメモリ使用量の最良の数値です。これは、一意のセットサイズ+(共有ページ/共有プロセス数)です。
したがって、1つのプロセスで44176ページが使用され、そのうち19388ページがそのプロセスに固有のものです。これは、24788が他の人と共有されていることを意味します。
PSSをUSS +(共有ウェイト)と見なします。この場合の重みは8193で、これはこのプロセスに起因する共有メモリページ(24788)の割合です。ページを共有しているアプリケーションのインスタンスが多いほど、各プロセスの重みは低くなります。
複数のプロセスにわたってPSSを合計することができ、共有ページを2回以上カウントすることはありません。ただし、PSSにはすでにUSSが含まれているため、USSとPSSを合計してRSSを期待することはできません。
私が理解しているように(しかし、私が間違っている場合は誰かが私を訂正してください)、プロセスがフォークするときにプログラムセグメントのみが共有されます-データセグメントは分離されます。
したがって、実行可能ファイル(バイナリ)とロードされた共有ライブラリは、プロセス間で共有されます。
各プロセスは、フォークの前に割り当てられたメモリの独自のコピー(*)を取得しますが、その後に割り当てられたメモリは、そのプロセスに固有のものになります。
(*)本当に賢いO/Sは、コピーオンライトアルゴリズムを使用して、実際に子のコピーにデータセグメントを割り当てる必要をなくすことができます。 、いずれかのプロセスがメモリを変更しようとした場合にのみメモリが割り当てられるようにします。 ここを参照してください。