読者です 読者をやめる 読者になる 読者になる

tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

メモリの状況を見るとかとか(/proc/meminfo、ps、top、free、vmstat、dstat)

はじめに

なんかやだなー遅いぽいなーと思ったとき見る指標がいろいろあるかと思いますが
その中でも「メモリを見る」についてメモ

今回つかうコマンド

今回は下記のコマンド(ファイル)を使います

  • 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
んで

・このマシンのメモリは約12GB
・メモリを使ってるのは覆い順にmongod、ruby(td-agent)、mongostat

とわかりました

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:のused

2.vmstatでブロックが発生してるか、swapが発生してるかを把握
→procsのb、swapのsi&so

3.topやpsでどいつがメモリを食ってるか把握

ってことで、毎度毎度忘れないようにメモでした!