金子邦彦研究室データ処理SQL, リレーショナルデータベースの活用dstat(システム計測ソフト)と dstat データのグラフ描画(Ubuntu 上)

dstat(システム計測ソフト)と dstat データのグラフ描画(Ubuntu 上)

dstat は Linux で動くシステム計測のソフトウェア.

dstat データをグラフ化するプログラムも付けている(サーバマシンでの利用を想定し,グラフィックスではなく,文字を組み合わせてグラフ化).

dstat のインストール(Ubuntu 上)

UbuntuUbuntu で OS のシステム更新を行うときは, 次のコマンドを実行.

UbuntuUbuntu のインストールは別ページ »で説明

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 

プロセッサのコア,ストレージのリード・ライト,メモリ使用量についての情報がリアルタイムで表示される.

[image]

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)