10
10

More than 5 years have passed since last update.

シェルとPythonでデータを簡単にグラフ化する

Last updated at Posted at 2016-02-25

はじめに

定期的に取得したデータをグラフ化するのは簡単かつ得られものも大きいことが少なくない。
ただ未経験の人にはハードルが高く感じられると思うので、入り口の提供になればと思う。
(あとは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

mem_plot.png

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10