python 画多盘的写放大曲线方法
在服务器测试中我们经常会遇见客户要求画出每个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")
图片如下:



相关文章:
python 画多盘的写放大曲线方法
在服务器测试中我们经常会遇见客户要求画出每个SSD的WAF曲线,也就是写放大,通常的做法就是我们每隔10分钟记录一下每个SSD的host写入量和nand写入量,下面我们介绍一下python处理多盘的WAF的做法 如图所示 假设这是一个记录多盘的写入量信息的…...
计算机网络TCP/UDP知识点
这是一些在学习过程中关于计算机网络八股文的一些知识点记录: TCP/UDP TCP怎么保证可靠性 1.序列号,确认应答,超时重传 数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号…...
JavaScript 文档元素获取
目录 通过id获取文档元素 任务描述 相关知识 什么是DOM 文档元素 节点树 通过id获取文档元素 编程要求 通过类名获取文档元素 任务描述 相关知识 通过类名获取文档元素 编程要求 通过标签名获取文档元素 任务描述 相关知识 通过标签的名字获取文档元素 获取标…...
docker pull实现断点续传
问题背景 在使用Docker拉取DockerHub的镜像时,经常会出现网络不稳定的问题,这就导致拉取到一半的镜像会重新拉取,浪费时间。例如下面这种情况: 第二次拉取 这是一个网络中断的场景,第二次重新拉取的时候,同…...
无字母数字webshell之命令执行
源码 题目限制: webshell长度不超过35位除了不包含字母数字,还不能包含$和_ 这里使用php5来解决 可以围绕以下两点展开: shell下可以利用.来执行任意脚本Linux文件名支持用glob通配符代替 .或者叫period,它的作用和source一样…...
华为OD笔试
机试总分400。三道题目。100+100+200 华为od考试时间为150分钟,共有三道编程题,分数分别为100、100和200。如果你是目标院校(查看目标院校请戳)的话,及格线是160分,非目标院校则不确…...
HAProxy理论+实验
目录 一、基于cookie的会话保持 1、配置选项 2、配置示例 3、验证cookie信息 二、IP透传 1、layer4 与 layer7 (1)四层:IPPORT转发 (2)七层:协议内容交换 三、haproxy的ACL应用 1、ACL配置选项 (1…...
Spring Boot ⽇志
1. ⽇志概述 为什么要学习⽇志 ⽇志对我们来说并不陌⽣, 从JavaSE部分, 我们就在使⽤ System.out.print 来打印⽇志了. 通过打 印⽇志来发现和定位问题, 或者根据⽇志来分析程序的运⾏过程. 在Spring的学习中, 也经常根据控制台 的⽇志来分析和定位问题. 随着项⽬的复杂…...
最详细!教你学习haproxy七层代理
一、工作原理 (1)包括 监听端口:HAProxy 会在指定的端口上监听客户端的请求。 例如,它可以监听常见的 HTTP 和 HTTPS 端口,等待客户端连接。请求接收:当客户端发起请求时,HAProxy 接收到请求。…...
ElementUI 事件回调函数传参技巧与自定义参数应用
ElementUI 事件回调函数传参技巧与自定义参数应用 在使用elementUI时,事件回调函数传递参数是一个常见的需求。根据搜索结果,我们可以了解到两种主要的方法来传递自定义参数: 使用回调函数:当elementUI组件触发事件时,…...
优化Next的webpack配置
众所周知,next的webpack打包实际上分成了两个部分,一个是服务器端、一个是客户端,我们这里的配置主要是针对客户端的配置。 目的在于降低_app.js包大小,合理划分基础包、工具包、常用方法包、拆分lodash按需引入效果。 拆分lodas…...
Q-Dir vs 传统文件管理器:为何开发者更偏爱这款神器?
前言 在这个信息爆炸的时代,我们每天都在与海量的文件和文件夹打交道;你是否曾经为了找一个文件而翻遍了整个硬盘?是否因为繁琐的文件夹操作而头疼不已?今天,就让我小江湖带你走进一个全新的世界——Q-Dir,…...
日常疑问小记录
1、在抢票过程中,有些人显示服务器崩溃而另一些人仍能访问,可能是由于以下几个原因: (1)负载均衡:服务器可能采用了负载均衡技术,将用户请求分配到多个服务器上。部分用户可能被引导到正常运行…...
Java Web —— 第四天(HTTP协议,Tomcat)
HTTP-概述 概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则 特点: 1. 基于TCP协议:面向连接,安全 2.基于请求-响应模型的:一次请求对应一次响应 3. HTTP协议是无状态的协议: 对于事务处理没有…...
C++ list的基本使用
目录 1.list简要介绍 2. list的构造 3. list中迭代器的使用 (1). 双向迭代器与随机访问迭代器使用区别 4.判空、获取元素个数 5. list头、尾元素的访问 6. 插入与删除操作 (1). 头插头删,尾插尾删 (2). 插入,删除与清空 (3). 交换 7. list容器迭代…...
云中韧性:Spring Cloud服务调用重试机制深度解析
标题:云中韧性:Spring Cloud服务调用重试机制深度解析 在微服务架构中,服务间的调用可能会因为网络问题、服务不可达、资源竞争等原因失败。Spring Cloud作为微服务架构的主流实现框架,提供了一套完整的服务调用重试机制…...
83.SAP ABAP从前台找字段所在表的两种方法整理笔记
目录 方法1:F1查看技术信息 F1 技术信息 方法2:ST05开启跟踪 Activate Trace Input and save data Deactivate Trace Display Trace 分析你想要的表 方法1:F1查看技术信息 从前台找一个屏幕字段所在表,一般通过按F1来查找…...
docker为普通用户设置sudo权限
在 Linux 上使用 Docker 命令时,默认情况下需要 sudo 权限。这是因为 Docker 守护进程(Docker daemon)通常运行在 root 用户下,而访问和管理 Docker 守护进程的权限也默认被限制给 root 用户。 然而,为了方便日常使用…...
Nginx + PHP 8.0支持视频上传
在 Ubuntu 20.04 上配置 Nginx PHP 8.0 的架构以支持视频上传,需要从 Nginx 和 PHP 两个方面进行配置,以确保服务器能够处理大文件上传。以下是详细的步骤: 1. Nginx 配置 1.1 增加上传文件大小限制 默认情况下,Nginx 对上传文…...
MySQL基础详解(3)
文章目录 索引普通索引创建索引修改表结构(添加索引)创建表的时候直接指定删除索引的语法 唯一索引创建索引修改表结构创建表的时候直接指定 使用ALTER 命令添加和删除索引使用ALTER 命令添加和删除主键显示索引信息 约束非空约束:唯一约束:主键约束&…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
