[python脚本]论文1.(一)CPU/内存数据分析和分组

CPU

收集到的CPU数据,格式如下:

由于这里6个数据为一组来收集latency的数据以及各个分位值的数据,而本质上每一行都是一次完整的测试,因此这里将这个csv文件分为两个文件,第一个是和latency相关的,将6条数据融合为一条,而剩下的数据比如eps等,单独整理为一个文件。

这里分为两步,第一步单独处理每个实例收集到的数据,第二步是汇总所有实例数据。

对于50个实例收到的数据,先通过将6条合并为一条,一共收集到12条数据(线程4*负载3),然后放在一个csv文件里面,再把不需要合并的数据放在另一个csv文件里面。

#写一个方法来处理这个逻辑
import pandas as pd

# 处理第一个文件
def process_file_1(df):
    print(df.columns.tolist())
    # 检查列名是否存在
    required_columns = ["threads", "cpu_max_prime", "percentile", "min_latency", "avg_latency", "max_latency", "percentile_latency"]
    for col in required_columns:
        if col not in df.columns:
            raise KeyError(f"列名 '{col}' 不存在于文件中")
    
    # 提取需要的列
    df = df[required_columns]
    
    # 按照 threads 和 cpu_max_prime 分组
    grouped = df.groupby(["threads", "cpu_max_prime"])
    
    # 定义新的数据结构
    result = []
    
    for name, group in grouped:
        # 确保每组有 6 条数据(对应 6 个百分位)
        if len(group) == 6:
            # 提取百分位数据
            percentiles = group.set_index("percentile")["percentile_latency"].to_dict()
            
            # 计算 min_latency, avg_latency, max_latency 的最大值、最小值和平均值
            min_latency_max = group["min_latency"].max()
            min_latency_min = group["min_latency"].min()
            min_latency_avg = group["min_latency"].mean()
            
            avg_latency_max = group["avg_latency"].max()
            avg_latency_min = group["avg_latency"].min()
            avg_latency_avg = group["avg_latency"].mean()
            
            max_latency_max = group["max_latency"].max()
            max_latency_min = group["max_latency"].min()
            max_latency_avg = group["max_latency"].mean()
            
            # 构建新的一条数据
            new_row = {
                "threads": name[0],
                "cpu_max_prime": name[1],
                "25percentile": percentiles.get(25, None),
                "50percentile": percentiles.get(50, None),
                "75percentile": percentiles.get(75, None),
                "90percentile": percentiles.get(90, None),
                "95percentile": percentiles.get(95, None),
                "99percentile": percentiles.get(99, None),
                "min_latency_max": min_latency_max,
                "min_latency_min": min_latency_min,
                "min_latency_avg": min_latency_avg,
                "avg_latency_max": avg_latency_max,
                "avg_latency_min": avg_latency_min,
                "avg_latency_avg": avg_latency_avg,
                "max_latency_max": max_latency_max,
                "max_latency_min": max_latency_min,
                "max_latency_avg": max_latency_avg,
            }
            result.append(new_row)
    
    # 转换为 DataFrame
    return pd.DataFrame(result)

随后批量处理,将所有的文件汇总到一个csv文件,每一个实例收集到的数据有一个index标记。

 处理node1,node2的数据,也是将6条合并为一条,最后有51*12条数据。

画箱线图:

def plot_boxplots(path, threads, cpu_max_prime, num_boxes=50, ax=None, save_path=None,label=None,y_min=None, y_max=None):
    """
    新增参数:
    - ax: 要绘制的子图坐标轴
    - save_path: 独立保存路径
    """
    df = pd.read_csv(path)
    # 提取指定线程数和 CPU 负载的数据
    data = df[(df['threads'] == threads) & (df['cpu_max_prime'] == cpu_max_prime)]
    data = data.reset_index(drop=True)

    # 检查是否有数据
    if data.empty:
        raise ValueError(f"没有满足条件的数据 (threads={threads}, cpu_max_prime={cpu_max_prime})!")

    # 将相关列转换为 float 类型
    numeric_columns = ['min_latency_min', '25percentile', '50percentile', '75percentile', '90percentile']
    for col in numeric_columns:
        data[col] = pd.to_numeric(data[col], errors='coerce')

    # 收集箱线图所需的数据
    boxplot_data = {
        'min': data['min_latency_min'].values,
        '25%': data['25percentile'].values,
        '50%': data['50percentile'].values,
        '75%': data['75percentile'].values,
        'max': data['90percentile'].values
    }

    # 使用传入的坐标轴或创建新的
    if ax is None:
        fig, ax = plt.subplots(figsize=(15, 8))
    else:
        plt.sca(ax)  # 激活传入的坐标轴

    # 确定 y 轴的范围
    if y_min is None and y_max is None:
        y_min = data[numeric_columns].min().min()
        y_max = data[numeric_columns].max().max()
        ax.set_ylim(y_min * 0.9, y_max * 1.1)
    else:
    # 显式设置用户定义的边界
        ax.set_ylim(y_min, y_max)
    # 绘制指定数量的箱线图
    for i in range(num_boxes):
        min_val = boxplot_data['min'][i]
        q1_val = boxplot_data['25%'][i]
        median_val = boxplot_data['50%'][i]
        q3_val = boxplot_data['75%'][i]
        max_val = boxplot_data['max'][i]

        # 调试打印
        #print(f"Box {i+1}: Min={min_val:.2f}, Q1={q1_val:.2f}, Median={median_val:.2f}, Q3={q3_val:.2f}, Max={max_val:.2f}")
        
        # 绘制箱子(25% 到 75%)
        ax.fill_between(
            x=[i + 0.8, i + 1.2],
            y1=[q1_val, q1_val],
            y2=[q3_val, q3_val],
            color='lightblue', alpha=0.7
        )

        # 绘制中位线
        ax.plot(
            [i + 0.8, i + 1.2],
            [median_val, median_val],
            color='red', linewidth=0.5
        )

        # 绘制下须(min 到 25%)
        ax.plot(
            [i + 1, i + 1],
            [min_val, q1_val],
            color='black', linewidth=1
        )

        # 绘制上须(75% 到 max)
        ax.plot(
            [i + 1, i + 1],
            [q3_val, max_val],
            color='black', linewidth=1
        )


    # 修改所有 plt.plot -> ax.plot
    ax.set_title(f'Latency Distribution (Threads={threads}, CPU={cpu_max_prime}, First {num_boxes} Tests,{label} plot.)')
    ax.set_xlabel('Test Index')
    ax.set_ylabel('Latency (ms)')
    ax.grid(True, linestyle='--', alpha=0.7)
    ax.set_xticks(range(1, num_boxes + 1))

    # 独立保存逻辑
    if save_path:
        plt.savefig(save_path, dpi=300, bbox_inches='tight')
    return ax

这里有两个生成箱线图的函数,一个是做的25%-75%的,一个是5%-95%的。

这里输出的图的纵坐标应该是相同的,从而更方便比较,所以这里的纵坐标也是一个输入变量。

最后得到的图:

这里使用了箱线图,但是具体的图还得改一下。还要加上一些数据说明。

这里的是CPU的图,类似的图有很多张。

这里要证明的是在时间latency的维度上,这里要比较哪个实例最稳定,当证明了虽然性能比较差,共享型实例最稳定/共享型实例的稳定性较物理设备也差不多的时候,可以进一步论述对于不同的实例,哪些负载的稳定性最高。

内存:

内存没有做,但是估计差不多,可以从本地来循环的做,看看数据分布。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975608.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

綫性與非綫性泛函分析與應用_1.例題(下)-半母本

第1章 實分析與函數論:快速回顧(下) 五、基數;有限集和無限集相關例題 例題1:集合基數的判斷 判斷集合和集合B=\{a,b,c,d,e\}的基數關係。 解析: 可以構造一個雙射,例如,,,,。 所以,兩個集合具有相同的基數。 例題2:可數集的證明 證明整數集是可數集。 解析: …

MQTT实现智能家居------3、源码分析(超详细)

一、连接服务器 1、初始化: mqtt_log_init();是一个空函数,自己定义宏 client mqtt_lease();//创建一个client结构体,从此以后client代表客户端 platform_memory_alloc();//是一个分配内存的总函数,可以适用于Linux、FreeRTos…

Qt常用控件之日历QCalendarWidget

日历QCalendarWidget QCalendarWidget 是一个日历控件。 QCalendarWidget属性 属性说明selectDate当前选中日期。minimumDate最小日期。maximumDate最大日期。firstDayOfWeek设置每周的第一天是周几(影响日历的第一列是周几)。gridVisible是否显示日历…

智慧废品回收小程序php+uniapp

废品回收小程序:数字化赋能环保,开启资源循环新时代 城市垃圾治理难题,废品回收小程序成破局关键 随着城市化进程加速与消费水平提升,我国生活垃圾总量逐年攀升,年均增速达5%-8%,其中超30%为可回收物。然…

SkyWalking集成Kafka实现日志异步采集经验总结

SkyWalking日志异步采集架构 【重点知识】 1、【Agent】kafka-reporter-plugin-x.x.x.jar包放plugins目录后必走kafka(kafka没有正确配置就会报错) 2、【Agent】异步如不开启数据压缩,日志数据较大,pod多、业务大时容易造成网络…

C++第十六讲:红黑树

C第十六讲:红黑树 1.什么是红黑树1.1红黑树的特点 2.MyRBTree实现2.1红黑树的结构2.2红黑树的插入2.2.1插入的总体逻辑2.2.2情况一:变色2.2.3情况二:单旋 变色2.2.4情况三:双旋 变色2.2.4插入代码总结 2.3红黑树的检查2.4完整代…

KubeKey一键安装部署k8s集群和KubeSphere详细教程

目录 一、KubeKey简介 二、k8s集群KubeSphere安装 集群规划 硬件要求 Kubernetes支持版本 操作系统要求 SSH免密登录 配置集群时钟 所有节点安装依赖 安装docker DNS要求 存储要求 下载 KubeKey 验证KubeKey 配置集群文件 安装集群 验证命令 登录页面 一、Ku…

Java 值传递

1 形参&实参 方法的定义可能会用到参数,参数在程序语言中分为: 实参:用于传递给函数/方法的参数,必须有确定的值。 形参:用于定义函数/方法,接收实参,不需要有确定的值。 String hello …

开源一款I2C电机驱动扩展板-FreakStudio多米诺系列

总线直流电机扩展板 原文链接: FreakStudio的博客 摘要 设计了一个I2C电机驱动板,通过I2C接口控制多个电机的转速和方向,支持刹车和减速功能。可连接16个扩展板,具有PWM输出、过流过热保护和可更换电机驱动芯片。支持按键控制…

论文笔记(七十二)Reward Centering(三)

Reward Centering(三) 文章概括摘要3 基于值的奖励中心化4 案例研究: 以奖励为中心的 Q-learning5 讨论、局限性与未来工作致谢 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan…

内部知识库的核心模块是什么?

内容概要 现代企业内部知识库的架构设计遵循系统性、可扩展性与安全性三重原则,其核心模块的协同运作构成完整的知识资产运营体系。在知识存储层,基于结构化分类的存储管理采用多级目录架构(如客户服务库、培训学习库)&#xff0…

kafka基本知识

什么是 Kafka? Apache Kafka 是一个开源的分布式流处理平台,最初由 LinkedIn 开发,后来成为 Apache 软件基金会的一部分。Kafka 主要用于构建实时数据管道和流处理应用程序。它能够高效地处理大量的数据流,广泛应用于日志收集、数…

P8716 [蓝桥杯 2020 省 AB2] 回文日期

1 题目说明 2 题目分析 暴力不会超时&#xff0c;O(n)的时间复杂度&#xff0c; < 1 0 8 <10^8 <108。分析见代码&#xff1a; #include<iostream> #include<string> using namespace std;int m[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};// 判断日期…

手机时钟精确到秒

这里以小米手机 MIUI 系统 举例 进入开发者模式 设置 - 我的设备 - 全部参数与信息 快速连续多次点击 MIUI 版本选框&#xff0c;即可进入开发者模式&#xff1b; 打开时间悬浮窗 设置 - 更多设置 - 开发者选项&#xff1b; 滑动至 输入 模块&#xff0c;开启时间悬浮窗&a…

京东广告基于 Apache Doris 的冷热数据分层实践

一、背景介绍 京东广告围绕Apache Doris建设广告数据存储服务&#xff0c;为广告主提供实时广告效果报表和多维数据分析服务。历经多年发展&#xff0c;积累了海量的广告数据&#xff0c;目前系统总数据容量接近1PB&#xff0c;数据行数达到18万亿行&#xff0c;日查询请求量8…

ubuntu新系统使用指南

1. 更新源 2. 配置rime 输入法 sudo apt install ibus-rimeibus-setup #打开配置界面添加雾凇拼音 cd ~/Documents/Tool/input_source/plumgit clone --depth 1 https://github.com/rime/plum plum #没有梯子就劝退cd plum/bash rime-install iDvel/rime-ice:others/recipe…

给小米/红米手机root(工具基本为官方工具)——KernelSU篇

目录 前言准备工作下载刷机包xiaomirom下载刷机包【适用于MIUI和hyperOS】“hyper更新”微信小程序【只适用于hyperOS】 下载KernelSU刷机所需程序和驱动文件 开始刷机设置手机第一种刷机方式【KMI】推荐提取boot或init_boot分区 第二种刷机方式【GKI】不推荐 结语 前言 刷机需…

Liunx(CentOS-6-x86_64)系统安装MySql(5.6.50)

一&#xff1a;安装Liunx&#xff08;CentOS-6-x86_64&#xff09; 安装Liunx&#xff08;CentOS-6-x86_64&#xff09; 二&#xff1a;下载MySql&#xff08;5.6.50&#xff09; MySql下载官网 二&#xff1a;安装MySql 2.1 将mysql上传到Liunx 文件地址 /usr/local/ 2…

2025版-Github账号注册详细过程

目录 1.访问GitHub官网 2. 点击“Sign up”按钮 3. 填写注册信息 4. 验证机器人 5. 点击“Create account”按钮 6. 验证邮箱 7. 完成注册 8. 初始设置&#xff08;可选&#xff09; 9. 开始使用 注意事项 1.访问GitHub官网 打开浏览器&#xff0c;访问 GitHub官网。 …

基于CentOS7安装kubesphere和Kubernetes并接入外部ES收集日志

一、修改所有节点主机名 主节点就修改成master hostnamectl set-hostname master 然后输入bash刷新当前主机名 工作节点1就修改成node1 hostnamectl set-hostname node1 然后输入bash刷新当前主机名 二、全部节点安装依赖并同步时间 yum -y install socat conntrack ebta…