在服务器测试中我们经常会遇见客户要求画出每个SSD的WAF曲线,也就是写放大,通常的做法就是我们每隔10分钟记录一下每个SSD的host写入量和nand写入量,下面我们介绍一下python处理多盘的WAF的做法
如图所示 假设这是一个记录多盘的写入量信息的表格
我们最终的目的是生成对应的每个SSD的WAF的图品,那么该如何简单快速的实现呢?
第一步,就是把第一列的disk分组。这里让pandan帮忙处理
import pandas as pd
from matplotlib import pyplot as plt
# 读取CSV文件
df = pd.read_excel('waaaf.xls')
# 按照 disk 列分组
grouped = df.groupby('disk')
# 创建一个字典来存储每个 disk 的 WAF 值
waf_dict = {}
# 计算每个 disk 的 WAF 值
for name, group in grouped:
waf_values = []
print('----------', name)
结果如下:
C:\Users\13737\AppData\Local\Programs\Python\Python312\python.exe D:/python_pro/chap1/waf.py
---------- nvme0
---------- nvme1
---------- nvme2
进程已结束,退出代码为 0
第二步,就是把每个disk的WAF计算出来,并且存放在字典里
import pandas as pd
from matplotlib import pyplot as plt
# 读取CSV文件
df = pd.read_excel('waaaf.xls')
# 按照 disk 列分组
grouped = df.groupby('disk')
# 创建一个字典来存储每个 disk 的 WAF 值
waf_dict = {}
# 计算每个 disk 的 WAF 值
for name, group in grouped:
waf_values = []
# 按照索引计算相邻行的 WAF
for i in range(1, len(group)):
# 当前行和前一行的 nand 和 host 值
nand_diff = group.iloc[i]['nand'] - group.iloc[i - 1]['nand']
host_diff = group.iloc[i]['host'] - group.iloc[i - 1]['host']
# 计算 WAF
if host_diff != 0:
waf = nand_diff / host_diff
formatted_waf = format(waf, '.2f')
waf_values.append(formatted_waf)
# 将 WAF 值存储到字典中
waf_dict[name] = waf_values
# 打印 WAF 值
for disk, wafs in waf_dict.items():
print(f"Disk: {disk}")
print(f"WAF Values: {wafs}")
运行结果如下:
Disk: nvme0
WAF Values: ['1.11', '0.45', '1.14', '2.67', '1.00']
Disk: nvme1
WAF Values: ['0.50', '0.55', '1.44', '1.78', '9.50']
Disk: nvme2
WAF Values: ['0.60', '1.75', '0.85', '2.00', '1.87']
第三步,就是把这个字典生成对应的每个SSD的CSV文件
import pandas as pd
from matplotlib import pyplot as plt
# 读取CSV文件
df = pd.read_excel('waaaf.xls')
# 按照 disk 列分组
grouped = df.groupby('disk')
# 创建一个字典来存储每个 disk 的 WAF 值
waf_dict = {}
# 计算每个 disk 的 WAF 值
for name, group in grouped:
waf_values = []
# 按照索引计算相邻行的 WAF
for i in range(1, len(group)):
# 当前行和前一行的 nand 和 host 值
nand_diff = group.iloc[i]['nand'] - group.iloc[i - 1]['nand']
host_diff = group.iloc[i]['host'] - group.iloc[i - 1]['host']
# 计算 WAF
if host_diff != 0:
waf = nand_diff / host_diff
formatted_waf = format(waf, '.2f')
waf_values.append(formatted_waf)
# 将 WAF 值存储到字典中
waf_dict[name] = waf_values
# 打印 WAF 值
for disk, wafs in waf_dict.items():
print(f"Disk: {disk}")
print(f"WAF Values: {wafs}")
for disk_waf in wafs:
print(disk_waf)
with open(f'{disk}.csv', 'a') as file:
file.write(f'{str(disk_waf)}\n')
运行会生成对应的每个SSD的CSV文件
第四步把每个对应CSV表格转化成图片就可以啦
import pandas as pd
from matplotlib import pyplot as plt
# 读取CSV文件
df = pd.read_excel('waaaf.xls')
# 按照 disk 列分组
grouped = df.groupby('disk')
# 创建一个字典来存储每个 disk 的 WAF 值
waf_dict = {}
# 计算每个 disk 的 WAF 值
for name, group in grouped:
waf_values = []
# 按照索引计算相邻行的 WAF
for i in range(1, len(group)):
# 当前行和前一行的 nand 和 host 值
nand_diff = group.iloc[i]['nand'] - group.iloc[i - 1]['nand']
host_diff = group.iloc[i]['host'] - group.iloc[i - 1]['host']
# 计算 WAF
if host_diff != 0:
waf = nand_diff / host_diff
formatted_waf = format(waf, '.2f')
waf_values.append(formatted_waf)
# 将 WAF 值存储到字典中
waf_dict[name] = waf_values
# 打印 WAF 值
for disk, wafs in waf_dict.items():
print(f"Disk: {disk}")
print(f"WAF Values: {wafs}")
for disk_waf in wafs:
print(disk_waf)
with open(f'{disk}.csv', 'a') as file:
file.write(f'{str(disk_waf)}\n')
for disk in waf_dict.keys():
data = pd.read_csv(f"{disk}.csv")
fig = plt.figure(figsize=(10, 6), dpi=300)
y1 = data.iloc[:, 0]
plt.xlabel(u'time (10min)', size=10)
plt.ylabel("WAF")
plt.plot(y1, label='WAF')
plt.title(f"{disk}_waf")
plt.grid(alpha=0.4)
plt.xlim(xmin=0)
plt.ylim(ymin=0)
plt.savefig(str(disk) + ".png")
图片如下: