dstat(システム計測ソフト)と dstat データのグラフ描画(Ubuntu 上)
dstat は Linux で動くシステム計測のソフトウェア.
dstat データをグラフ化するプログラムも付けている(サーバマシンでの利用を想定し,グラフィックスではなく,文字を組み合わせてグラフ化).
dstat のインストール(Ubuntu 上)
Ubuntu で OS のシステム更新を行うときは, 次のコマンドを実行.
sudo apt -y update
sudo apt -yV upgrade
sudo /sbin/shutdown -r now
dstat のインストール操作
sudo apt -y update
sudo apt -y install dstat
dstat を動かしてみる
dstat -tcdyml -C 0,1,2,3,4,5,6,7
プロセッサのコア,ストレージのリード・ライト,メモリ使用量についての情報がリアルタイムで表示される.

dstat データのグラフ描画
dstat データをグラフ化するプログラム.
サーバマシンでの利用を想定し,グラフィックスではなく,文字を組み合わせてグラフ化.
#!/usr/bin/python3
# 48 のところは表示の横幅
# 20 のところは表示の縦幅
# 表示が始まるまで「表示の横幅」秒待つこと.
# dstat -tcdylm -C 0,1,2,3,4,5,6,7 | python3 dstatplot.py 48 20
#
# これで次のような dstat データが得られる
# ----system---- -----cpu0-usage---- -----cpu1-usage---- -----cpu2-usage---- -----cpu3-usage---- -----cpu4-usage---- -----cpu5-usage---- -----cpu6-usage---- -----cpu7-usage---- -dsk/total- ---system-- ---load-avg--- ------memory-usage-----
# time |usr sys idl wai stl:usr sys idl wai stl:usr sys idl wai stl:usr sys idl wai stl:usr sys idl wai stl:usr sys idl wai stl:usr sys idl wai stl:usr sys idl wai stl| read writ| int csw | 1m 5m 15m | used free buff cach
# 08-09 11:42:30| 0 0 100 0 0: 1 0 99 0 0: 0 0 100 0 0: 0 0 100 0 0: 0 0 100 0 0: 0 0 100 0 0: 0 0 100 0 0: 0 0 100 0 0| 25k 148k| 75 105 |0.16 0.29 0.17| 408M 13.2G 15.4M 1657M
#
import sys
import re
# n is counter. widht is the max number of elements of list
n = 0
width = int(sys.argv[1])
height = int(sys.argv[2])
a05list = list()
a10list = list()
a15list = list()
a20list = list()
a25list = list()
a30list = list()
a35list = list()
a40list = list()
a45list = list()
a46list = list()
a52list = list()
def calcpoint(old, a):
if old == '.':
return a
else:
return '*'
def myfloat(s):
if len(s) <= 1:
return 0.0
if s[-1] == 'b':
return float(s[:-1])/1000000000
elif s[-1] == 'B':
return float(s[:-1])/1000000000
elif s[-1] == 'k':
return float(s[:-1])/1000000
elif s[-1] == 'K':
return float(s[:-1])/1000000
elif s[-1] == 'm':
return float(s[:-1])/1000
elif s[-1] == 'M':
return float(s[:-1])/1000
elif s[-1] == 'G':
return float(s[:-1])
elif s[-1] == 'g':
return float(s[:-1])
else:
return float(s)
# dstat データを整える.
# 「 - 」は「 0 」に変換,:, |, - の除去, 制御文字等の除去
def removeletters(s):
a = re.sub(" - ", ' 0 ', s)
b = re.sub("\[0;0m", ' ', a)
c = re.sub(r'\x1b|:|\||-', ' ', b)
return c
# 98, 12.3, 100K などの取り出し
def getdata(s):
m = re.match(r'[0-9\.]+(b|B|k|K|m|M|g|G|t|T)*', s)
if m:
return m.group()
else:
return ''
for line in sys.stdin:
# 数字と空白だけを残す。そして。複数の空白が連続するものは1つにする。
# print(line)
vallist = removeletters(line).split()
# print(vallist)
numlist = list(map(myfloat, list(map(getdata, vallist))))
# print(numlist)
# print(len(vallist))
# 長さ width の list を維持
# store values into lists
if len(numlist) > 52:
a05 = numlist[5]
a10 = numlist[10]
a15 = numlist[15]
a20 = numlist[20]
a25 = numlist[25]
a30 = numlist[30]
a35 = numlist[35]
a40 = numlist[40]
a45 = numlist[45]
a46 = numlist[46]
# used + buff + cach
a52 = numlist[52] + numlist[54] + numlist[55]
a05list.append(a05)
a10list.append(a10)
a15list.append(a15)
a20list.append(a20)
a25list.append(a25)
a30list.append(a30)
a35list.append(a35)
a40list.append(a40)
a45list.append(a45)
a46list.append(a46)
a52list.append(a52)
if n >= width:
a05list.pop(0)
a10list.pop(0)
a15list.pop(0)
a20list.pop(0)
a25list.pop(0)
a30list.pop(0)
a35list.pop(0)
a40list.pop(0)
a45list.pop(0)
a46list.pop(0)
a52list.pop(0)
n = n + 1
#
# plot lists
if n >= width:
maxcpuval = 100.0
arr = [['.'] * width for i in range(height)]
for i in range(width):
y = int(height * a05list[i]/(maxcpuval + 1))
if y >= height:
print(line)
print(vallist)
print('a05')
print(a05)
print(y)
y = (height - 1)
arr[(height - 1) - y][i] = calcpoint(arr[(height - 1) - y][i], '1')
y = int(height * a10list[i]/(maxcpuval + 1))
if y >= height:
print(line)
print(vallist)
print('a10')
print(a10)
print(y)
y = (height - 1)
arr[(height - 1) - y][i] = calcpoint(arr[(height - 1) - y][i], '2')
y = int(height * a15list[i]/(maxcpuval + 1))
if y >= height:
print(line)
print(vallist)
print('a15')
print(a15)
print(y)
y = (height - 1)
arr[(height - 1) - y][i] = calcpoint(arr[(height - 1) - y][i], '3')
y = int(height * a20list[i]/(maxcpuval + 1))
if y >= height:
print(line)
print(vallist)
print('a20')
print(a20)
print(y)
y = (height - 1)
arr[(height - 1) - y][i] = calcpoint(arr[(height - 1) - y][i], '4')
y = int(height * a25list[i]/(maxcpuval + 1))
if y >= height:
print(line)
print(vallist)
print('a25')
print(a25)
print(y)
y = (height - 1)
arr[(height - 1) - y][i] = calcpoint(arr[(height - 1) - y][i], '5')
y = int(height * a30list[i]/(maxcpuval + 1))
if y >= height:
print(line)
print(vallist)
print('a30')
print(a30)
print(y)
y = (height - 1)
arr[(height - 1) - y][i] = calcpoint(arr[(height - 1) - y][i], '6')
y = int(height * a35list[i]/(maxcpuval + 1))
if y >= height:
print(line)
print(vallist)
print('a35')
print(a35)
print(y)
y = (height - 1)
arr[(height - 1) - y][i] = calcpoint(arr[(height - 1) - y][i], '7')
y = int(height * a40list[i]/(maxcpuval + 1))
if y >= height:
print(line)
print(vallist)
print('a40')
print(a40)
print(y)
y = (height - 1)
arr[(height - 1) - y][i] = calcpoint(arr[(height - 1) - y][i], '8')
y = int(height * a45list[i]/0.2)
if y >= height:
print(line)
print(vallist)
print('a45')
print(a45list[i])
print(y)
y = (height - 1)
arr[(height - 1) - y][i] = calcpoint(arr[(height - 1) - y][i], 'r')
y = int(height * a46list[i]/0.2)
if y >= height:
print(line)
print(vallist)
print('a46')
print(a46list[i])
print(y)
y = (height - 1)
arr[(height - 1) - y][i] = calcpoint(arr[(height - 1) - y][i], 'w')
y = int(height * a52list[i]/(10 + 1))
if y >= height:
print(line)
print(vallist)
print('a52')
print(a52list[i])
print(y)
y = (height - 1)
arr[(height - 1) - y][i] = calcpoint(arr[(height - 1) - y][i], 'm')
print(*(['-'] * width))
for i in arr:
print(*i)