メモリ使用量とページフォルト
使用量の種類と共有分を分け、ページ取得の変化を確認します。
説明
メモリの数値には、仮想アドレス空間、物理メモリにある常駐分、空き容量、回収を考慮した利用可能量などがあります。異なる項目を同じ使用量として扱うと、必要な対処を取り違えます。
システム全体と一つのプロセスの記録を読み、仮想サイズと常駐量の差、常駐分の内訳、ページフォルトの増加を調べます。最後に共有ページを含むRSSとPSS、スワップ使用量を確認します。
1システム全体のメモリ
meminfo.txtは4GiB環境の/proc/meminfoから必要項目を抜き出した教材記録です。ここでkBと表記される値は1024バイト単位として換算します。
cat meminfo.txt全体のメモリ記録MemFreeは現在空いている量、MemAvailableはスワップせず新しいアプリケーションに使える量の推定です。Cached等の回収可能性が関わるため、空きが少ないだけでメモリ不足と判断できません。
2空きと利用可能量の差
空きと利用可能量をMiBへ換算します。
awk '/^MemFree:|^MemAvailable:|^Cached:/ {printf "%s %.0f MiB\n",$1,$2/1024}'対象項目を換算 meminfo.txt同じ時点の記録空きは256MiBですが、利用可能量は1536MiBです。Cachedの1024MiBを無条件で全量解放できるという意味ではなく、MemAvailableはカーネルが回収可能性等を考慮した推定値です。
3仮想サイズと常駐量
PID700のstatusから仮想サイズと常駐量を表示します。
cat process-status.txt一つのプロセスのメモリVmSizeは16GiB、VmRSSは256MiBです。仮想アドレス空間が大きくても、そのすべてが物理メモリに常駐しているとは限りません。VmRSS等の簡易集計には精度上の制約があり、詳細にはsmapsなども使います。
4常駐メモリの内訳
匿名・ファイル・共有メモリの常駐分を合計します。
awk '/^RssAnon:|^RssFile:|^RssShmem:/ {sum+=$2; printf "%s %.0f MiB\n",$1,$2/1024} END {printf "sum=%.0f MiB\n",sum/1024}'常駐分の分類と合計 process-status.txtstatusの内訳匿名192MiB、ファイル64MiB、共有メモリ0MiBで、合計256MiBです。ファイルに対応するページも常駐量に含まれます。匿名という分類だけで、そのページが他プロセスと物理的に共有されていないと断定することはできません。
5ページフォルトの増加
faults.csvは同じPIDのminor/major fault累積値を20秒間隔で整理した表です。差分を取り出します。
awk -F, 'NR==2 {minor=$3; major=$4} NR==3 {printf "minor=%d major=%d\n",$3-minor,$4-major}'二種類のフォルト差分 faults.csv同じプロセスの記録minorが4100回、majorが2回増えています。minorはディスクからページを読む必要がなかったフォルトです。majorは読込みを伴うため、同じフォルト数として一括すると負担の違いを見落とします。いずれも必ずプログラム異常を意味する例外ではありません。
6RSSを単純合計した場合
二つのプロセスが同じ64MiBを共有し、それぞれ192MiBを専有するモデルです。各RSSと比例配分したPSSを集計します。
cat pss.csv各プロセスの値; awk -F, 'NR>1 {rss+=$2; pss+=$3} END {printf "RSS=%.0f MiB PSS=%.0f MiB\n",rss/1024,pss/1024}' pss.csv合計と共有の二重計上RSS合計は512MiB、PSS合計は448MiBです。共有64MiBをRSSでは両方に計上し、PSSでは各32MiBへ配分します。この二プロセスだけで共有している条件では、PSS合計は専有192×2+共有64に対応します。
7スワップ量だけで不足を決めない
システムのスワップ使用量と、このプロセスのVmSwapを確認します。
awk '/^SwapTotal:/ {total=$2} /^SwapFree:/ {printf "system_swap_used=%.0f MiB\n",(total-$2)/1024}' meminfo.txtシステムの使用量; awk '/^VmSwap:/ {printf "process_swap=%.0f MiB\n",$2/1024}' process-status.txt対象プロセスの使用量どちらも0MiBです。この値だけで将来の割当てが成功すると保証できるわけではありません。利用可能量、cgroupの制限、回収やフォルトの変化など、対象と区間をそろえて調べます。
まとめ
仮想サイズ、常駐量、利用可能量は別の対象を測っています。
minorとmajorの差分を取り、読込みを伴うページ取得を分けて確認します。
共有ページを含むRSSの単純合計は、物理メモリ量を重複計上する場合があります。
操作履歴と解説を振り返れます。
Bash / Linuxの記録
cat meminfo.txtMemTotal: 4194304 kB MemFree: 262144 kB MemAvailable: 1572864 kB Buffers: 65536 kB Cached: 1048576 kB SwapTotal: 2097152 kB SwapFree: 2097152 kB
awk '/^MemFree:|^MemAvailable:|^Cached:/ {printf "%s %.0f MiB\n",$1,$2/1024}' meminfo.txtMemFree: 256 MiB MemAvailable: 1536 MiB Cached: 1024 MiB
cat process-status.txtName: worker Pid: 700 VmSize: 16777216 kB VmRSS: 262144 kB RssAnon: 196608 kB RssFile: 65536 kB RssShmem: 0 kB VmSwap: 0 kB
awk '/^RssAnon:|^RssFile:|^RssShmem:/ {sum+=$2; printf "%s %.0f MiB\n",$1,$2/1024} END {printf "sum=%.0f MiB\n",sum/1024}' process-status.txtRssAnon: 192 MiB RssFile: 64 MiB RssShmem: 0 MiB sum=256 MiB
awk -F, 'NR==2 {minor=$3; major=$4} NR==3 {printf "minor=%d major=%d\n",$3-minor,$4-major}' faults.csvminor=4100 major=2
cat pss.csv; awk -F, 'NR>1 {rss+=$2; pss+=$3} END {printf "RSS=%.0f MiB PSS=%.0f MiB\n",rss/1024,pss/1024}' pss.csvPID,RSS_KIB,PSS_KIB 700,262144,229376 701,262144,229376 RSS=512 MiB PSS=448 MiB
awk '/^SwapTotal:/ {total=$2} /^SwapFree:/ {printf "system_swap_used=%.0f MiB\n",(total-$2)/1024}' meminfo.txt; awk '/^VmSwap:/ {printf "process_swap=%.0f MiB\n",$2/1024}' process-status.txtsystem_swap_used=0 MiB process_swap=0 MiB
演習完了