一覧OS-15-2 · OS状態の読み取り

メモリ使用量とページフォルト

使用量の種類と共有分を分け、ページ取得の変化を確認します。

説明

メモリの数値には、仮想アドレス空間、物理メモリにある常駐分、空き容量、回収を考慮した利用可能量などがあります。異なる項目を同じ使用量として扱うと、必要な対処を取り違えます。

システム全体と一つのプロセスの記録を読み、仮想サイズと常駐量の差、常駐分の内訳、ページフォルトの増加を調べます。最後に共有ページを含む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の記録

1
cat meminfo.txt
MemTotal:        4194304 kB
MemFree:          262144 kB
MemAvailable:    1572864 kB
Buffers:           65536 kB
Cached:          1048576 kB
SwapTotal:       2097152 kB
SwapFree:        2097152 kB
2
awk '/^MemFree:|^MemAvailable:|^Cached:/ {printf "%s %.0f MiB\n",$1,$2/1024}' meminfo.txt
MemFree: 256 MiB
MemAvailable: 1536 MiB
Cached: 1024 MiB
3
cat process-status.txt
Name: worker
Pid: 700
VmSize: 16777216 kB
VmRSS: 262144 kB
RssAnon: 196608 kB
RssFile: 65536 kB
RssShmem: 0 kB
VmSwap: 0 kB
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.txt
RssAnon: 192 MiB
RssFile: 64 MiB
RssShmem: 0 MiB
sum=256 MiB
5
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
6
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
PID,RSS_KIB,PSS_KIB
700,262144,229376
701,262144,229376
RSS=512 MiB PSS=448 MiB
7
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
system_swap_used=0 MiB
process_swap=0 MiB

演習完了