yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

この記事は3年以上前に書かれた記事で内容が古い可能性があります

vdbenchのログをmatplotlibで分析した話

2017-01-30

vdbenchで出力したログを今までExcelで解析していたが、何十万行となるとExcelさんでは追いつかないので、重い腰を上げてmatplotlibに任せてみたら、思いの外捗った。
24万行近くあったが3秒くらいでグラフプロット完了。

以下のリンクを参考にしました。
http://myenigma.hatenablog.com/entry/2015/10/09/223629

とりあえず色々インポート

% pip install bumpy
% pip install scipy
% pip install matplotlib
% pip install pandas
% pip install seaborn

フォルダ構造

% tree
.
├── seaborn_test.py
└── summary_results.html

0 directories, 2 files

vdbenchのログ
※フィクションのため、実際のログとだいぶ違うかも

% cat summary_results.html

<pre>
Copyright (c) hogehoge
Vdbench summary report, hogehoge
20:16:39.211 1 37451.00 819.53 22945 19.68 1.962 2.089 1.931 38.471 1.528 74.0 1 1
20:16:40.073 2 48067.00 1051.72 22943 20.15 2.167 2.260 2.143 202.375 3.789 105.3 1 1
20:16:41.070 3 50779.00 1110.13 22923 20.13 2.136 2.235 2.111 224.337 3.818 107.0 1 1
20:16:42.068 4 48873.00 1068.42 22923 19.96 2.170 2.323 2.132 262.347 7.321 106.1 1 1
20:16:43.065 5 49300.00 1078.91 22947 20.07 2.167 2.218 2.154 222.376 3.383 107.9 1 1
20:16:44.080 6 51324.00 1122.13 22925 20.12 2.175 2.262 2.153 402.594 4.084 110.6 1 1
20:16:45.060 7 51847.00 1133.87 22931 20.06 2.082 2.092 2.080 214.988 4.439 107.9 1 1

実行ファイルの中身

% cat seaborn_test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import sys
import linecache
import re

# グラフの種類
sns.set_style("whitegrid")

args = sys.argv

#見出し行
header_line = 3
filepath = args[1]
c = int(args[2]) + header_line
e = int(args[3]) + 1

data = open(filepath, "rU")

i = 1
while i <= header_line:
  data_head = next(data) #見出し行を無視
  i += 1

data_title = ["time", "interval", "iops", "MB/s", "bytes i/o", "read pct", "resp time", "read resp", "write resp", "resp", "max", "resp stddev", "queue depth", "cpu%", "sys+u", "cpu%", "sys"]

#何行目の項目を分析するか
#x_row = 1
y_row = 2
#y2_row = 5

x = []
y = []
#y2 = []

print("start line:%i" % (c - header_line))

while c <= e:
  row = linecache.getline(filepath, c)
  row = row.replace('"', '')
  row = row.replace('/', '')
  row = row.replace(':', '')
  row = re.split(" +", row)
  x.append(c)
  y.append(row[y_row])
  #y2.append(row[y2_row])
  c += 1

print("end line:%i" % (c - header_line + 1))

total_len = len(open(filepath).readlines())
print("total line:%i" % (total_len - header_line))

plt.xlabel("log_line")
plt.ylabel(data_title[y_row])

plt.plot(x,y)
#plt.plot(x,y2)

plt.show()

いざ実行

% python seaborn_test.py summary_results.html 1 7
# python <実行ファイル> <分析対象> <始まり行> <終わり行>
start line:1
end line:7
total line:7

行指定をしたかったので、for row in data:ではなくwhileを使っています。

本当はx軸を日付にしたかったが日付をまたぐと順番が前後してしまうとか、
「/」とか「:」が入っているとエラーとなったり、日付の扱いが悩ましい。。