shell和Python 两种方法分别画 iostat的监控图

在服务器存储的测试中,经常需要看performance的性能曲线,这样最能直接观察HDD或者SSD的性能曲线。

如下这是一个针对HDD跑Fio读写的iostat监控log,下面介绍一下分别用shell 和Python3 写画iostat图的方法

1 shell脚本

环境:linux OS gnuplot工具

第一步 :解析iostat log。提取要作图的一行

bash 复制代码
#!/bin/bash
hdd=$1
cat ${hdd}_iostat.log  |grep -i Device |head -1  >${hdd}_iostat.txt
cat ${hdd}_iostat.log  |grep -i ${hdd}  >>${hdd}_iostat.txt

第二步:把画图的列(监控读写的IOPS)求出来

bash 复制代码
#!/bin/bash
hdd=$1
cat ${hdd}_iostat.log  |grep -i Device |head -1  >${hdd}_iostat.txt
cat ${hdd}_iostat.log  |grep -i ${hdd}  >>${hdd}_iostat.txt
num_read_iops=`head -1 ${hdd}_iostat.txt | awk  '{for (i=1;i<=NF;i++) {if ($i=="r/s") {print i}}}'`
num_write_iops=`head -1 ${hdd}_iostat.txt | awk  '{for (i=1;i<=NF;i++) {if ($i=="w/s") {print i}}}'`

第三步:直接调用gnuplot工具作图

bash 复制代码
#!/bin/bash
hdd=$1
cat ${hdd}_iostat.log  |grep -i Device |head -1  >${hdd}_iostat.txt
cat ${hdd}_iostat.log  |grep -i ${hdd}  >>${hdd}_iostat.txt
num_read_iops=`head -1 ${hdd}_iostat.txt | awk  '{for (i=1;i<=NF;i++) {if ($i=="r/s") {print i}}}'`
num_write_iops=`head -1 ${hdd}_iostat.txt | awk  '{for (i=1;i<=NF;i++) {if ($i=="w/s") {print i}}}'`
echo "
      	set terminal png 
      	set title 'Random_${hdd}_IOPS'
      	set output 'IOPS_${hdd}.png'
      	set xlabel 'count:1s'
      	set ylabel  'IOPS'
        set key right top
      	plot '${hdd}_iostat.txt' using :$num_write_iops  title 'w/s' with lines lw 1,\
       '${hdd}_iostat.txt' using :$num_read_iops title 'r/s' with lines lw 1
      	" | gnuplot

运行 :bash gnuplot.sh sde

2 python 脚本

环境:python3

python库: sys(引用参数), re(正则匹配), pandas(做表格), matplotlib(画图工具)

第一步:解析iostat log

python 复制代码
import sys
import re
import pandas as pd
from matplotlib import pyplot as plt
hdd = sys.argv[1]
rs = []
ws = []
logfile = open(f"{hdd}_iostat.log","r")

for log in logfile:
    if hdd in log:
        data = re.sub(' +', ' ', log)
        rs.append(data.split(" ")[3])
        ws.append(data.split(" ")[4])

第二步:将需要作图的列(这次监控带宽)导入CSV

python 复制代码
import sys
import re
import pandas as pd
from matplotlib import pyplot as plt
hdd = sys.argv[1]
rs = []
ws = []
logfile = open(f"{hdd}_iostat.log","r")

for log in logfile:
    if hdd in log:
        data = re.sub(' +', ' ', log)
        rs.append(data.split(" ")[3])
        ws.append(data.split(" ")[4])

dic = {"read": rs, "write": ws}
df = pd.DataFrame(dic)
df.to_csv(f"{hdd}_iostat.csv")
data = pd.read_csv(f"{hdd}_iostat.csv")

第三步:用matplotlib库直接作图

python 复制代码
import sys
import re
import pandas as pd
from matplotlib import pyplot as plt
hdd = sys.argv[1]
rs = []
ws = []
logfile = open(f"{hdd}_iostat.log","r")

for log in logfile:
    if hdd in log:
        data = re.sub(' +', ' ', log)
        rs.append(data.split(" ")[3])
        ws.append(data.split(" ")[4])

dic = {"read": rs, "write": ws}
df = pd.DataFrame(dic)
df.to_csv(f"{hdd}_iostat.csv")
data = pd.read_csv(f"{hdd}_iostat.csv")

fig = plt.figure(figsize=(10, 6), dpi=300)
x = data.iloc[:, 0]
y1 = data.iloc[:, 1]
y2 = data.iloc[:, 2]
plt.xlabel(u'time (s)', size=10)
plt.ylabel("BW(kB/s)")
plt.plot(x, y1, label='rKB/s', color='orange', linestyle=':')
plt.plot(x, y2, label='wKB/s', color='cyan', linestyle='-.')
plt.legend(loc="upper right")
plt.title(f"{hdd}_BW")
plt.grid(alpha=0.4)
plt.savefig(str(hdd) + ".png")

运行 :python3 plot.py sde

相关推荐
笨笨聊运维24 分钟前
CentOS官方不维护版本,配置python升级方法,无损版
linux·python·centos
Gerardisite27 分钟前
如何在微信个人号开发中有效管理API接口?
java·开发语言·python·微信·php
小毛驴8501 小时前
软件设计模式-装饰器模式
python·设计模式·装饰器模式
jun_bai1 小时前
python写的文件备份网盘程序
运维·服务器·网络
Warren981 小时前
Python自动化测试全栈面试
服务器·网络·数据库·mysql·ubuntu·面试·职场和发展
闲人编程1 小时前
Python的导入系统:模块查找、加载和缓存机制
java·python·缓存·加载器·codecapsule·查找器
HIT_Weston1 小时前
39、【Ubuntu】【远程开发】拉出内网 Web 服务:构建静态网页(二)
linux·前端·ubuntu
weixin_457760001 小时前
Python 数据结构
数据结构·windows·python
欢喜躲在眉梢里2 小时前
CANN 异构计算架构实操指南:从环境部署到 AI 任务加速全流程
运维·服务器·人工智能·ai·架构·计算