站长推荐产品上海百度搜索优化
在服务器测试中我们经常会遇见客户要求画出每个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 = []# 按照索引计算相邻行的 WAFfor 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']# 计算 WAFif host_diff != 0:waf = nand_diff / host_diffformatted_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 = []# 按照索引计算相邻行的 WAFfor 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']# 计算 WAFif host_diff != 0:waf = nand_diff / host_diffformatted_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 = []# 按照索引计算相邻行的 WAFfor 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']# 计算 WAFif host_diff != 0:waf = nand_diff / host_diffformatted_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")
图片如下: