こんにちは。サイオステクノロジーの橋本です。
前回は CPU 使用率の見方について確認したので
今回はリソースの見方 (メモリ使用率) について今一度確認してみましょう
前回 :リソースの見方を今一度確認してみよう~CPU使用率~
前提
前回にもお伝えしましたが「使用率が高い状況 = 悪」と一概には言えない点に注意してください。
特にメモリに関しては急激に使用率が上がったり、下がったりという事はあまりないです。
そのためメモリ使用率が 90 % で安定しているサーバも多数存在するものと考えます。
サーバに搭載されているメモリ量の確認方法
/proc/meminfo を確認いただければメモリ量が確認できます。
$ grep MemTotal /proc/meminfo
MemTotal: 3704456 kB
$
現在の メモリ 使用率の見方
さてメモリ使用率ですが、CPU 使用率と違いちょっと癖があります。
まずはメモリ使用率を確認する中で最もメジャーと言えるコマンド free で確認してみましょう
RHEL 7~9 いずれのバージョンでも以下のような見え方となります。
$ free
total used free shared buff/cache available
Mem: 3704456 161332 2557232 46964 985892 3266472
Swap: 0 0 0
$
シンプルにメモリの空き容量を確認したいなら「available」を確認してください。
※ RHEL 6 系では項目 available は存在しません
基本的に Linux は空きメモリをキャッシュに割り当てようとします。
そのため稼働が長いサーバであるなら、必然的に free (空きメモリサイズ) は小さくなる傾向があります。
キャッシュの中でも開放ができる領域と開放ができない領域があります。
もし、メモリが必要になった場合、解放できるキャッシュ領域を解放し、必要なメモリに割り当て直します。
つまり、available は free 領域に加えて解放可能なキャッシュ領域の値を加算した値となります。
基本的に available に空きがあれば、問題ないと判断できます。
free をみて「空き領域が少ない!」とならないように気を付けてください。
他に確認したい項目としては sar -B で確認できる pgscand/s があります。
# sar -B
Linux 4.18.0-477.43.1.el8_8.x86_64 (ip-172-31-11-137.ap-northeast-1.compute.internal) 2024年10月02日 _x86_64_ (2 CPU)
15:50:54 LINUX RESTART (2 CPU)
16時00分06秒 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
16時10分01秒 1.72 2.54 258.94 0.03 174.93 0.00 0.00 0.00 0.00
16時20分01秒 254.52 12.28 382.56 0.10 284.06 0.00 0.00 0.00 0.00
16時30分06秒 0.00 3.28 246.27 0.00 166.72 0.00 0.00 0.00 0.00
#
ログローテートなどで巨大なファイルを処理するシーンなど、それなりのサイズのメモリが必要になることがあります。
この際、Linux は巨大なファイルを扱うだけのサイズをメモリを確保しようとし、
開放可能なキャッシュ領域を走査し、解放します。
システムが至急必要になったため、メモリの空き領域をスキャンしようとした回数が pgscand/s となります。
定期的に pgscand/s も確認し、非常に高い値を記録しているなら メモリ不足を疑う…という定常作業も行うとより good です。
※メモリが不足しているか否かのもう一つの判断ポイントは SWAP ですが、
それは別回で解説します。
vmstat でもメモリ使用率は確認できなくはないですが、-a オプションをつける必要があります。
$ vmstat -at 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
r b swpd free inact active si so bi bo in cs us sy id wa st JST
0 0 0 393816 1205080 1989776 0 0 34 667 274 511 4 3 92 0 1 2024-10-03 14:56:13
0 0 0 393592 1205308 1989780 0 0 0 8 487 476 1 2 96 0 0 2024-10-03 14:56:14
0 0 0 393676 1205264 1989780 0 0 0 8 379 414 1 2 97 0 1 2024-10-03 14:56:15
$
「free + inact ≒ available」となります。
そのため直感的なわかりやすさで言うと free コマンドに軍配があがりますね
メモリ を利用しているプロセスの特定方法
コマンド「ps auxww –sort=-%mem」で特定可能です。
このコマンドで以下のように CPU 使用率が高い順で表示してくれます。
# ps auxww --sort=-%mem | head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
pg-user 1016 0.0 1.2 702004 45620 ? Ss 15:45 0:00 /usr/pgsql-12/bin/postmaster -D /pgdb/data
root 680 0.3 0.8 558064 31836 ? Ssl 15:45 0:02 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
polkitd 923 0.0 0.6 1610032 23736 ? Ssl 15:45 0:00 /usr/lib/polkit-1/polkitd --no-debug
root 676 0.0 0.4 379688 18508 ? Ssl 15:45 0:00 /usr/sbin/NetworkManager --no-daemon
#
過去のメモリ使用率の見方
基本的に過去のリソース使用状況はデフォルトの状態では見ることはできません。
sysstat サービスを有効化し、sar コマンドが利用できる状況にしておく必要があります。
sar コマンドでは「どのプロセスが メモリ を利用しているか」まではわからないので、
将来的に発生する可能性がある障害に備えて 5 分間隔で ps auxww コマンドの結果をログに残す等の監視をご検討ください。
特にメモリリークが発生している場合、ある程度の期間分の ps auxww の結果を比較する必要となり、
保存する必要性が高いと言えます。