記憶の蜃気楼、パート2:PSS


これは一般的にLinuxカーネルメモリ管理に関するブログシリーズです.この部分はLinuxメモリ統計' pss ':比例セットサイズです.
このシリーズの最初の部分はRSSについてでした:レジデントセットサイズ.それは根本的に重要な統計であり、OEMキラー(メモリキラーのうち)が使用する統計です.
しかし、居住者が設定したサイズは、少なくともLinuxで使用されるメモリについての“絶対”真理ではありません.Linuxが子プロセスの親プロセスのメモリページへのアクセスをコピーすることができます.(スレッド化されたプロセスは、全てのスレッドに対するプロセスのメモリ領域へのアクセス権を持っている)
これは、fork ()やclone ()のプロセスがLinuxアプリケーションに対して、これらのアプリケーションに読み込み専用のアクセスを提供するメモリページを共有する機能を提供することを意味します.そのようなアプリケーションの一つはPostgreSQLです.
[[email protected] ~]$ ps -ef | grep $(pgrep -f postmaster)
postgres     886       1  0 11:16 ?        00:00:00 /usr/pgsql-11/bin/postmaster -D /var/lib/pgsql/11/data/
postgres     888     886  0 11:16 ?        00:00:00 postgres: logger
postgres     890     886  0 11:16 ?        00:00:00 postgres: checkpointer
postgres     891     886  0 11:16 ?        00:00:00 postgres: background writer
postgres     892     886  0 11:16 ?        00:00:00 postgres: walwriter
postgres     893     886  0 11:16 ?        00:00:00 postgres: autovacuum launcher
postgres     894     886  0 11:16 ?        00:00:00 postgres: stats collector
postgres     895     886  0 11:16 ?        00:00:00 postgres: logical replication launcher
postmasterプロセスはPID 1を親とし、すべてのバックグラウンドプロセスはpostmasterを親として持つ.
しかし、それはすべて素晴らしいです、私はこれが起こっているという証拠を持っていますか?この証明はproc meta filesystem ' smaps 'ファイルで見つけられます.これは、メモリの割り当てを示します.
[[email protected] ~]$ sudo grep -A6 00400000 /proc/886/smaps
00400000-00af7000 r-xp 00000000 fd:00 101318716                          /usr/pgsql-11/bin/postgres
Size:               7132 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Rss:                3128 kB
Pss:                1053 kB
Shared_Clean:       2688 kB
これはpostmasterプロセスのPostgres実行可能ファイルのためのテキスト(コード)セグメントです.前のポストで説明された要求ページングメカニズムに基づいて、それは3128 KBでページングされるだけでした.また、このコードセグメントを使用するいくつかのプロセスを回避したため、比例して1053 KBとなります.
これは物事が少しぼやけて取得されます.プロセスはメモリを使用するかどうか、つまりページの完全な4 KBを使用します.上の例のPSSは1053 KBである.つまり、1053/4 = 263.25ということになるので、分数ページを示します.Linuxプロセスは、メモリのページ数を使用しません.
カーネルは単にページを使用するプロセスの量のメモリページにカウンタを保持します.エイリアスはプロセススペースにページをページ化しておきます.PSS図形が要求されるとき、ページのサイズはそれが共有されるプロセスの数によって分割されます.そして、それは本当のサイズの代わりに比例メモリのサイズを提供します.
これは実際のスペース使用量計算のために意味します、あなたはPSSに基づいて使われる総記憶を計算するために意味のある数字を得るために、その瞬間にその瞬間にメモリセグメントに関係するすべてのプロセスのすべてのPSSサイズを計算しなければなりません.
あなたが私がなぜメモリ使用量計算に言及しているかについて疑問に思うならば、これは私が言及されていて、私がそれの中で働く時からずっと試みられるのを見たということです.すべての一度は、誰かがアプリケーションの使用中のメモリの正確な、実際の量を計算したい.
PostgreSQLでは、メモリの最も論理的に大きいのはバッファキャッシュとして使用している共有メモリセグメントになります.バッファキャッシュは、共有されたものとして明示的に定義されます.また、バッファキャッシュがメモリのかなりのパーセンテージを含むようにサイズが大きさであるなら、実行可能で図書館メモリセグメントのためのページ共有は限界かもしれません.しかし、共有メモリセグメントには、同じ比例共有が適用される.
それは多くの仕事procですべてのsmapsファイルを検査することです.幸いにも、すべての' smaps 'ファイルを通過することなく、PSSの数字を与えることができるユーティリティがあります.そのユーティリティは' smem 'です.' Smem 'ユーティリティはEPEL(エンタープライズLinux用の追加パッケージ)で利用可能です.ほとんどのELベースのLinuxesでyum install epel-releaseを介して追加されました.
Postgres 11を使った仮想マシンALM 8仮想マシンの場合は以下のようになります.
[[email protected] ~]$ sudo smem -U postgres -tk
  PID User     Command                         Swap      USS      PSS      RSS
 4727 postgres postgres: logger                   0   152.0K   537.0K     4.4M
 4733 postgres postgres: stats collector          0   144.0K   591.0K     4.7M
 4730 postgres postgres: background writer        0   216.0K     1.0M     6.4M
 4729 postgres postgres: checkpointer             0   272.0K     1.3M     7.3M
 4734 postgres postgres: logical replicati        0   460.0K     1.4M     6.6M
 4732 postgres postgres: autovacuum launch        0   492.0K     1.7M     7.6M
 4731 postgres postgres: walwriter                0   212.0K     2.7M     9.5M
 4724 postgres /usr/pgsql-11/bin/postmaste        0     6.9M    11.2M    24.0M
-------------------------------------------------------------------------------
    8 1                                           0     8.9M    20.5M    70.4M
このユーティリティは別の略語を紹介します.という意味です.それはPSSの反対で、プロセスにユニークに割り当てられるメモリを数えます.プロセスによって変更されたメモリページは、USSとしてカウントされます.
上記のSMEM出力は非常によく、それが起こることができる倍のカウントを示します:Postgres実行可能ファイルのためのこのシステムの実際の配分は8.9 m(USS)+ 20.5 m(PSS)= 29.4 mです.私の説明では、この巧みなページ共有の読み取り専用ページによって、RSSサイズはメモリを2倍にすることができます.