本文先通过top采集所有进程的CPU和内存情况并保存到文件,然后提取指定进程的数据,最后通过 python 对采集的数据进行可视化。
一、使用脚本采集top数据
1. 单次top输出如下
2. 编写脚本每隔1秒采集一次top数据保存到文件
#!/bin/bash
# 按照年月日十分秒格式命名文件,例如top_20240907190348
filename=filename="top_$(date "+%Y%m%d%H%M%S").txt"# 每1秒采集一次top,并将top命令输出的内容保存到文件中
# 按 ctrl+c 退出
while true; dotimestamp=$(date "+%Y%m%d%H%M%S")# 打印当前时间到终端echo "Current time: $timestamp"# 将当前时间记录到文件echo $timestamp >> "$filename"# 将当前的top信息记录到文件top -b -n 1 >> "$filename"# 睡眠1秒sleep 1
done
3. 脚本使用实例
脚本运行后,每采集一次会在终端打印时间信息,按ctrl+c可停止采集
bash get_top.sh
脚本运行输出如下
二、提取指定进程mainboa的CPU和内存数据
1. 提取进程数据
grep mainboa ~/top_bpu20240905180932
2. 提取第9列和第10列数据并保存到CSV文件
# 将第9列和第10列的CPU和内存两列数据提取出来保存到 mainboard.csv
grep mainboa ~/top_bpu20240905180932 | awk '{print $9 "," $10}' > mainborad.csv
三、使用python生成数据统计图
绘制折线图,并将最大值,平均值,90分位值并显示到图片中
1. python脚本
import pandas as pd
import matplotlib.pyplot as plt# 读取CSV文件
df = pd.read_csv('mainborad.csv')# 对于每一列数据,画一个折线图
for column in df.columns:plt.figure() # 创建一个新的图形df[column].plot(kind='line') # 画折线图# draw max value as a horizon lineplt.axhline(y=df[column].max(), color='r', linestyle='--') # 画一个水平线表示最大# draw a text label nemed max:value for max value besize the lineplt.text(0, df[column].max(), 'max:%d' % df[column].max(), fontsize=12, color='r') # 在最大值处标注最大值# draw mean value as a horizon lineplt.axhline(y=df[column].mean(), color='g', linestyle='--') # 画一个水平线表示平均# draw a text label nemed mean:value for mean value besize the lineplt.text(0, df[column].mean(), 'mean:%d' % df[column].mean(), fontsize=12, color='g') # 在平均值处标注平均值# draw p90 value as a horizon lineplt.axhline(y=df[column].quantile(0.9), color='b', linestyle='--') # 画一个水平线表示90分位# draw a text label nemed p90:value for p90 value besize the lineplt.text(0, df[column].quantile(0.9), 'p90:%d' % df[column].quantile(0.9), fontsize=12, color='b') # 在90分位处标注90分plt.title("data") # 设置图形的标题为列名plt.show() # 显示图形
2. 执行脚本生成图片
python draw_csv.py
脚本读取CSV文件,并先后显示每一列的数据统计图
首先是显示第一列CPU占用的数据,可拖拽或者放大查看细节
-
CPU数据统计视图
-
内存数据统计视图
关闭CPU的统计图之后会显示第二列内存占用的数据,可拖拽或者放大查看细节
关注非科班CPP程序员,一起学习,一起进步