はじめに
なんかやだなー遅いぽいなーと思ったとき見る指標がいろいろあるかと思いますが
その中でも「メモリを見る」についてメモ
今回つかうコマンド
今回は下記のコマンド(ファイル)を使います
- less /proc/meminfo → マシンのメモリ情報を知ってみる
- ps aux | sort -r -k4 | head -n10 → メモリ消費順に表示してみる
- top(top表示後に大文字Mで消費メモリ順)→ 消費メモリ順を表示してみる
- free -m → メモリの動作状況を知る
- vmstat -Sm 1 10 → メモリの動作状況を知る
- dstat -tclm → vmstat+α的な感じで見てみる
less /proc/meminfo
マシンのメモリ情報を知ってみます
これはまぁそのままですね。
# less /proc/meminfo MemTotal: 12144800 kB MemFree: 204868 kB Buffers: 662904 kB Cached: 10162160 kB SwapCached: 1472 kB Active: 5276240 kB Inactive: 6080668 kB Active(anon): 222824 kB Inactive(anon): 309224 kB Active(file): 5053416 kB Inactive(file): 5771444 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 14335992 kB SwapFree: 14330100 kB Dirty: 2548 kB Writeback: 0 kB AnonPages: 530404 kB Mapped: 6298596 kB Shmem: 212 kB Slab: 431988 kB SReclaimable: 395076 kB SUnreclaim: 36912 kB KernelStack: 3152 kB PageTables: 26632 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 20408392 kB Committed_AS: 1325336 kB VmallocTotal: 34359738367 kB VmallocUsed: 311016 kB VmallocChunk: 34359406316 kB HardwareCorrupted: 0 kB AnonHugePages: 382976 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 5056 kB DirectMap2M: 2045952 kB DirectMap1G: 10485760 kB
んで
・MemTotalによりこのマシンのメモリは12144800(約12GB)
とわかりました
ps aux | sort -r -k4 | head -n10
今度はpsコマンドを使ってメモリを消費してる順に表示してみます
root 13116 1.2 52.8 68589020 6422616 ? Sl Jan28 39:00 /usr/local/mongodb/bin/mongod --logpath /usr/local/mongodb/logs/mon USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND td-agent 45537 4.4 3.0 549792 365124 ? Sl Jan28 157:52 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent --config /etc/td root 35398 0.0 0.3 78076 38804 pts/1 S+ Jan28 0:09 /usr/local/mongodb/bin/mongostat -u admin -p xxxx 10 td-agent 45534 0.0 0.1 118276 21064 ? Sl Jan28 0:00 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent --config /etc/td root 1404 0.0 0.0 249856 7412 ? Sl 2013 4:55 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5 root 5635 0.0 0.0 197780 2900 ? S 2013 28:05 /usr/sbin/snmpd -LS0-6d -Lf /dev/null -p /var/run/snmpd.pid root 45615 0.0 0.0 134944 3192 pts/5 Ss 12:39 0:00 -zsh root 37963 0.0 0.0 130848 3336 pts/1 Ss Jan27 0:01 -zsh root 9481 0.0 0.0 130828 3332 pts/0 Ss Jan24 0:00 -zsh
psコマンドは良いとして、
sortコマンドで%MEM(-k4:4列め)を多い順(-r)に並べてます。
んで、headコマンドで10行のみ表示。
項目はこんな意味です(メモリ関連のみ)。
※Resident Set Size(常駐セットサイズ)
他の値などはこちらを参考→http://www.itmedia.co.jp/help/tips/linux/l0158.html
しかし、タイトル行より68589020のほうが大きい値として上に来てしまってます。
こんなときは--no-headingでタイトル行を消しても良いかもです
# ps aux --no-heading | sort -r -k4 | head -n 10 root 13116 1.2 52.3 68589020 6358760 ? Sl Jan28 39:40 /usr/local/mongodb/bin/mongod --logpath /usr/local/mongodb/logs/mo td-agent 45537 4.4 3.0 549792 364412 ? Sl Jan28 160:25 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent --config /etc/t root 35398 0.0 0.3 78076 38804 pts/1 S+ Jan28 0:09 /usr/local/mongodb/bin/mongostat -u admin -p xxxx 10 td-agent 45534 0.0 0.1 118276 21064 ? Sl Jan28 0:00 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent --config /etc/t root 1404 0.0 0.0 249856 7412 ? Sl 2013 4:55 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5 root 5635 0.0 0.0 197780 2900 ? S 2013 28:07 /usr/sbin/snmpd -LS0-6d -Lf /dev/null -p /var/run/snmpd.pid root 45615 0.0 0.0 134944 3192 pts/5 Ss 12:39 0:00 -zsh root 37963 0.0 0.0 130848 3336 pts/1 Ss Jan27 0:01 -zsh root 9481 0.0 0.0 130828 3332 pts/0 Ss Jan24 0:00 -zsh root 41328 0.0 0.0 130752 3276 ? Ss Jan12 0:00 -zsh
top(top表示後に大文字Mで消費メモリ順)
今度はtopコマンドで消費メモリ順に表示してみます。
TOPを打った後に大文字Mと打ちます。
top - 14:58:43 up 44 days, 20:50, 10 users, load average: 0.00, 0.01, 0.00 Tasks: 257 total, 1 running, 256 sleeping, 0 stopped, 0 zombie Cpu(s): 0.4%us, 0.1%sy, 0.0%ni, 99.2%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 12144800k total, 12001048k used, 143752k free, 665548k buffers Swap: 14335992k total, 5892k used, 14330100k free, 10220676k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 45537 td-agent 20 0 536m 355m 3052 S 4.0 3.0 158:10.49 ruby 13116 root 20 0 65.4g 6.1g 6.0g S 1.3 52.9 39:05.20 mongod 9974 root 20 0 15172 1376 952 R 0.3 0.0 0:00.02 top 10584 root 20 0 15172 1380 952 S 0.3 0.0 8:39.23 top 37961 root 20 0 98.0m 4044 3068 S 0.3 0.0 0:02.94 sshd 1 root 20 0 19360 1376 1140 S 0.0 0.0 1:00.75 init
からの大文字M↓
top - 14:59:05 up 44 days, 20:50, 10 users, load average: 0.00, 0.01, 0.00 Tasks: 257 total, 1 running, 256 sleeping, 0 stopped, 0 zombie Cpu(s): 0.4%us, 0.0%sy, 0.0%ni, 99.3%id, 0.4%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 12144800k total, 11989516k used, 155284k free, 665548k buffers Swap: 14335992k total, 5892k used, 14330100k free, 10204008k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13116 root 20 0 65.4g 6.1g 6.0g S 0.0 52.7 39:05.46 mongod 45537 td-agent 20 0 536m 356m 3052 S 4.4 3.0 158:11.47 ruby 35398 root 20 0 78076 37m 6828 S 0.0 0.3 0:09.73 mongostat 45534 td-agent 20 0 115m 20m 1152 S 0.0 0.2 0:00.00 ruby 1404 root 20 0 244m 7412 988 S 0.0 0.1 4:55.29 rsyslogd 23540 root 20 0 98.0m 4052 3072 S 0.0 0.0 0:09.79 sshd
ついでにl、t、m(上のほう消す)↓
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13116 root 20 0 65.4g 6.1g 6.0g S 0.0 52.8 39:07.03 mongod 45537 td-agent 20 0 536m 349m 3052 S 31.0 2.9 158:17.89 ruby 35398 root 20 0 78076 37m 6828 S 0.0 0.3 0:09.74 mongostat 45534 td-agent 20 0 115m 20m 1152 S 0.0 0.2 0:00.00 ruby 1404 root 20 0 244m 7412 988 S 0.0 0.1 4:55.31 rsyslogd 23540 root 20 0 98.0m 4052 3072 S 0.0 0.0 0:09.79 sshd 23889 root 20 0 98.0m 4052 3068 S 0.0 0.0 0:02.60 sshd
んで
・このマシンのメモリは約12GB
・メモリを使ってるのは覆い順にmongod、td-agent、mongostat
とわかりました(ps結果と変わらず)
free
次に、メモリの動作状況を見てみます
-mオプションで容量をメガバイト単位で表示します
# free -m total used free shared buffers cached Mem: 11860 11705 155 0 650 9967 -/+ buffers/cache: 1087 10772 Swap: 13999 5 13994
各項目はこんな感じ
領域 | 項目 | 説明 |
Mem | total | 実メモリの全容量 |
used | 実メモリの使用容量 | |
free | 実メモリの空き容量 | |
shared | 共有メモリ容量 | |
buffers | バッファメモリ容量(ブロックデバイスの読み書き用) | |
cached | ファイルキャッシュメモリ容量(ファイルのページキャッシュ用) | |
-/+ buffers/cache | used | 実メモリの used から buffers と cached を引いた容量 |
free | 実メモリの free に buffers と cached を加えた容量 | |
Swap | total | スワップ領域の全容量 |
used | スワップ領域の使用容量 | |
free | スワップ領域の空き容量 |
こちらを参考にさせて頂きました(参考というかパクr・・)
→free コマンドの実行結果の見方
で、free(空き容量)が155とめっちゃ少ないです。
しかしメモリが足りないわけではなくこんな意味を持っています。
各プロセスにメモリを割り振った残りを
・バッファ(buffer)
・キャッシュ(cache)
として利用してディスク入出力の負荷を減らしている
つまり、bufferとcacheにあらかじめメモリを割り当てているため。と
メモリの実質残りは
Mem:のfree + buffer + cache
= 155 + 650 + 9967
= 10772
= -/+ buffers/cache:のfree
となります。
さらに、swapを多少使用していますが、
bufferとcacheにメモリを割り当てるのとは別にあんまり活動してないやつをメモリからswapに追い出しているらしい。
詳しくはこちら
→Linux のメモリー管理(メモリ−が足りない?,メモリーリークの検出/防止)
てことで
・このマシンのメモリは約12GB
・メモリを使ってるのは覆い順にmongod、td-agent、mongostat
・メモリの空き容量は約10MB(-/+ buffers/cacheのfree=10772)
・swapは今のところ気にするほどでもない(Swapのused=5)
とわかりました
vmstat -Sm 1 10
メモリの動作状況をみてみます
オプションは「-S単位 時間間隔 回数」です。※今回は-Smなのでメガ
# vmstat -Sm 1 10 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 6 142 681 10464 0 0 0 4 0 1 0 0 100 0 0 0 0 6 142 681 10464 0 0 128 216 1069 956 1 0 99 0 0 0 0 6 144 681 10464 0 0 128 64 910 884 1 0 99 0 0 0 0 6 144 681 10464 0 0 128 16 772 839 0 0 99 0 0 0 0 6 144 681 10464 0 0 0 24 763 773 0 0 99 0 0 0 0 6 143 681 10464 0 0 256 388 957 925 1 0 98 2 0 0 0 6 144 681 10465 0 0 0 660 893 789 0 0 99 0 0 0 0 6 144 681 10465 0 0 0 24 882 948 0 0 99 0 0 0 0 6 144 681 10465 0 0 0 0 801 767 0 0 100 0 0 0 0 6 144 681 10465 0 0 0 0 695 720 0 0 100 0 0
今回見るのは主にprocsとswap
- procs
r … 実行可能でな実行キューに入っているプロセス数
b … ブロックされているプロセス数
- swap
si : スワップイン = スワップ領域から読み込んでメモリに展開したデータの量
so : スワップアウト = メモリからスワップ領域に書き込んだデータの量
procsのbを見ることで入出力待ちなどで動作が停滞しているかを把握し
swapのsi、soでswap領域の活動状況を知る、的な。
今回はあんまり注視しませんが、cpuのid(idle=なにもしてない割合)が少ないとかだとcpuががんばってます。
vmstatについてはこちらを参考にさせて頂きました
→vmstatの見方と考え方
というわけで
・このマシンのメモリは約12GB
・メモリを使ってるのは覆い順にmongod、td-agent、mongostat
・メモリの空き容量は約10MB(-/+ buffers/cacheのfree=10772)
・swapは今のところ気にするほどでもない(Swapのused=5)
・swapはぜんぜん活動してない、cpuもなにもしてない
とわかりました
swapしまくってるときをとりたかったですが、こういうときに限って落ち着いてます(><)
-dstat -tclm
さいごはおまけでvmstat+α的な感じで見てみます。
使い方はこちらを。
----system---- ----total-cpu-usage---- ---load-avg--- ------memory-usage----- date/time |usr sys idl wai hiq siq| 1m 5m 15m | used buff cach free 30-01 16:41:37| 0 0 100 0 0 0|0.18 0.22 0.27|1098M 643M 9959M 161M 30-01 16:41:38| 0 0 99 0 0 0|0.18 0.22 0.27|1096M 643M 9959M 162M 30-01 16:41:39| 0 0 99 0 0 0|0.18 0.22 0.27|1097M 643M 9959M 161M 30-01 16:41:40| 0 0 100 0 0 0|0.18 0.22 0.27|1096M 643M 9959M 162M 30-01 16:41:41| 0 0 99 0 0 0|0.18 0.22 0.27|1096M 643M 9959M 162M
vmstatにない値や時間も表示できて良いですね!
まとめ
重いなーみたいなとき、とくにメモリを疑うときは下記の順番で見ると良さそうメモ
1.freeで今の状態のメモリ、swapの状態を把握
→-/+ buffers/cacheのfree、Swap:のused2.vmstatでブロックが発生してるか、swapが発生してるかを把握
→procsのb、swapのsi&so3.topやpsでどいつがメモリを食ってるか把握
ってことで、毎度毎度忘れないようにメモでした!