はじめに
定期的に取得したデータをグラフ化するのは簡単かつ得られものも大きいことが少なくない。
ただ未経験の人にはハードルが高く感じられると思うので、入り口の提供になればと思う。
(あとはpythonの布教)
meminfoのグラフ化
例として定期的に取得した/proc/meminfo
の情報をシェルとpythonで簡単にグラフ化してみる。
meminfoの情報は<日付>/<時分秒>/meminfo.log
の形式で保存されているとする(例:20160224/105312/meminfo.log
)
meminfoのフォーマットはこんな感じ
MemTotal: 511476 kB
MemFree: 269240 kB
Buffers: 13936 kB
Cached: 56044 kB
SwapCached: 0 kB
Active: 36944 kB
Inactive: 47324 kB
Active(anon): 14648 kB
Inactive(anon): 208 kB
Active(file): 22296 kB
Inactive(file): 47116 kB
Unevictable: 0 kB
Mlocked: 0 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 511476 kB
LowFree: 269240 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 14304 kB
Mapped: 16548 kB
Shmem: 568 kB
Slab: 7416 kB
SReclaimable: 2600 kB
SUnreclaim: 4816 kB
KernelStack: 504 kB
PageTables: 784 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 255736 kB
Committed_AS: 195212 kB
VmallocTotal: 1548288 kB
VmallocUsed: 8428 kB
VmallocChunk: 1350896 kB
meminfoの中でCommitted_AS
の値をグラフ化したいとする
$ find . -name 'meminfo.log' | sort | xargs grep Committed_AS
とすると以下のような出力が得られる。
./20160211/190409/meminfo.log:Committed_AS: 389260 kB
./20160211/191528/meminfo.log:Committed_AS: 389300 kB
./20160211/192648/meminfo.log:Committed_AS: 394600 kB
これを更にgawkで処理して日付 数値
のフォーマットにする
$ find . -name 'meminfo.log' | sort | xargs grep Committed_AS | gawk 'match($0, /\/([0-9]+)\/([0-9]+).*[0-9]+ kB/, a) {print a[1] a[2], $2}'
20160211190409 389260
20160211191528 389300
20160211192648 394600
あとはmatplotでこれを描画する
plot_date.py
#!/usr/bin/env python3
import matplotlib.pyplot as plt
from datetime import datetime as dt
import sys
[date, y] = zip(*[l.split() for l in sys.stdin])
date=[dt.strptime(d, "%Y%m%d%H%M%S") for d in date]
plt.plot(date,y)
plt.show()
$ find . -name 'meminfo.log' | sort | xargs grep Committed_AS | gawk 'match($0, /\/([0-9]+)\/([0-9]+).*[0-9]+ kB/, a) {print a[1] a[2], $2}' | python3 plot_date.py