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