如何将小时级CPU数据聚合为日维度的空闲/使用率百分比?
从小时级CPU监控数据聚合每日空闲/已用百分比的方法
刚好之前处理过类似的服务器监控数据聚合需求,我来给你一步步拆解怎么实现,不管用脚本还是Python都能搞定:
先搞清楚你的数据结构
首先得明确日志里每列的含义,从你给的示例18-JUN-15 05.00.15.571 AM 98.75 .69 .55 .01来看,这应该是类似sar工具输出的CPU监控数据——通常这类数据的字段是用户态、系统态、nice值、空闲率(顺序可能有差异,得确认)。核心逻辑是:空闲率直接取对应字段,已用率=100%-空闲率,这样比加总其他字段更准确。
具体实现方案
方案1:用Shell脚本快速处理(适合Linux服务器直接跑)
假设你的日志文件叫cpu_logs.txt,且每行最后一个数值是空闲率,用awk就能轻松按日期分组算平均值:
awk '{ # 提取日期,这里第一个字段就是"18-JUN-15",直接拿 date = $1 # 累加该日期的空闲率总和,以及数据条数 idle_total[date] += $NF line_count[date] += 1 } END { # 遍历每个日期,计算平均并输出 for (day in idle_total) { avg_idle = idle_total[day] / line_count[day] avg_used = 100 - avg_idle # 四舍五入取整,输出成你要的格式 printf("%s的CPU空闲率为%d%%、忙碌率为%d%%\n", day, int(avg_idle+0.5), int(avg_used+0.5)) } }' cpu_logs.txt | sort
要是你的空闲率不是最后一个字段,把$NF改成对应的字段号就行(比如第4列就写$4)。最后加sort是为了让日期按顺序输出,更直观。
方案2:用Python处理(适合复杂数据或需要后续扩展)
如果日志格式有点乱,或者你需要做数据清洗(比如过滤异常值),Python会更灵活:
from collections import defaultdict # 用字典存每天的累加数据:key是日期,value是[空闲率总和, 数据条数] daily_stats = defaultdict(lambda: [0.0, 0]) # 读取日志文件 with open("cpu_logs.txt", "r") as f: for line in f: line = line.strip() if not line: continue # 拆分每行的字段 parts = line.split() day = parts[0] # 把空闲率转成浮点数,这里假设是最后一个字段,按需调整 idle = float(parts[-1]) # 过滤异常值(比如超过100或者负数的无效数据) if 0 <= idle <= 100: daily_stats[day][0] += idle daily_stats[day][1] += 1 # 按日期排序输出结果 for day in sorted(daily_stats.keys()): total_idle, count = daily_stats[day] avg_idle = total_idle / count avg_used = 100 - avg_idle # 用round函数四舍五入取整,输出成你要的格式 print(f"{day}的CPU空闲率为{round(avg_idle)}%、忙碌率为{round(avg_used)}%")
几个要注意的细节
- 字段确认:一定要先搞清楚哪个字段是空闲率!如果日志里没有直接的空闲率,就把所有非空闲的字段加起来(比如用户态+系统态+等待IO的占比)作为已用率,空闲率=100%-已用率。
- 数据清洗:要是日志里有异常值(比如占比超过100%或者负数),一定要过滤掉,不然会拉低平均值的准确性。
- 时区问题:如果你的监控数据是UTC时间,要确保日期提取是你想要的本地日期,避免跨天的情况。
内容的提问来源于stack exchange,提问作者user1595858
相关产品推荐
相关产品推荐

