python将Linux下使用top命令获取的进程信息进行分析做可视化展示
python將Linux下使用top命令獲取的進程信息進行分析做可視化展示
版本
| v1.0 | ZY | 2020.11.10 | 初版完成 |
文章目錄
- python將Linux下使用top命令獲取的進程信息進行分析做可視化展示
- 版本
- 一、目標
- 二、源碼
- (1)、top命令簡單說明:
- (2)、常用的top獲取信息并存儲文件
- (3)、python處理思路
- (4)、小技巧
- (5)、源碼
- (6)、打包
- 三、最后
一、目標
Linux下我們通常使用top命令過濾某個進程獲取該進程的內存以及CPU占用等信息,而進行長時間拷機時更可以將該信息重定向到文件中,拷機完成后我們直接分析該文件查看內存是否穩定,cpu占用是否存在飆升等,目前大數據分析火熱的情況,我們想到將該文件數據做下簡單的大數據分析,將常用數據利用python做下分析后以圖表的形式展現出來并寫入excel形成一次拷機的分析文檔,這樣將中間分析過程以及結果的歸檔過程代碼化、自動化了,后續回溯也變得很方便了。
二、源碼
(1)、top命令簡單說明:
top ? 或者top -h之后: Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]-m num Maximum number of processes to display.-n num Updates to show before exiting.-d num Seconds to wait between updates.-s col Column to sort by (cpu,vss,rss,thr).-t Show threads instead of processes.-h Display this help screen.(2)、常用的top獲取信息并存儲文件
將process進程的信息獲取并存儲到top文件: top | grep process > ./top(3)、python處理思路
- 讀取top文件獲取原始數據
- 簡單清洗原始數據,獲取需要進行分析的cpu等字段信息并轉換成int/float等便于進行數據計算的數據類習慣
- 關鍵字段進行數學運算,比如計算最大值、最小值、平均值等
- 將內存等信息變化過程利用圖表展示出來
- 將分析結果寫入excel
- 將python腳本打包,比如Windows下的exe,使得不用安裝python環境即可運行
(4)、小技巧
- 傳入top文件時使用外部傳參的方式獲取任意名稱的top文件,這樣打包成exe后拖入任意名稱的top文件即可
- pandas的excel處理會覆蓋sheet,因此需要結合openpyxl進一步處理excel
(5)、源碼
思路清晰之后,結合python豐富的包,代碼只有100+行,很方便,這里沒有做過多的函數封裝,后續可以優化一下(試用了pandas、openpyxl、matplotlib等):
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2020/11/6 0006 9:24 # @Author : ZYimport time import sys import openpyxl import pandas as pd from openpyxl import load_workbook import matplotlib.pyplot as plt from openpyxl.drawing.image import Imagedef add_sheet(data, excel_writer, sheet_name):"""不改變原有Excel的數據,新增sheet。注:使用openpyxl操作Excel時Excel必需存在,因此要新建空sheet無論如何sheet頁都會被新建,只是當sheet_name已經存在時會新建一個以1結尾的sheet,如:test已經存在時,新建sheet為test1,以此類推:param data: DataFrame數據:param excel_writer: 文件路徑:param sheet_name: 新增的sheet名稱:return:"""book = load_workbook(excel_writer.path)excel_writer.book = bookdata.to_excel(excel_writer=excel_writer, sheet_name=sheet_name, index=None, header=True)excel_writer.close()# pandas讀取top文件 if len(sys.argv) == 2:original_data = pd.read_csv(sys.argv[1], sep='\\s+', encoding='utf-8') else:print("參數個數錯誤,請指定解析文件")sys.exit(-1)# 以當前時間創建文件名 path = './' + 'top數據分析結果_' + time.strftime("%Y%m%d%H%M%S") + '.xlsx' print(path)# 創建空excel,添加sheet的接口必須文件存在 excel_write = pd.ExcelWriter(path, engine='openpyxl') pd.DataFrame().to_excel(path, sheet_name='Sheet1')# 可能存儲的top文件沒有線程調度策略這一項 if original_data.shape[1] == 10:original_data.columns = ['進程id(PID)', '進程優先級(PR)', 'CPU占用率(CPU%)', '進程狀態(S)', '線程數(#THR)','虛擬內存(VSS)', '實際使用的物理內存(RSS)', '線程調度策略(PCY)', '進程所有者的ID(UID)', '進程名字(Name)'] elif original_data.shape[1] == 9:original_data.columns = ['進程id(PID)', '進程優先級(PR)', 'CPU占用率(CPU%)', '進程狀態(S)', '線程數(#THR)','虛擬內存(VSS)', '實際使用的物理內存(RSS)', '進程所有者的ID(UID)', '進程名字(Name)'] print(original_data)# 刪除有空值的一行,即取出最后一列進程名字不為空的數據 topdata = original_data[original_data['進程名字(Name)'].notna()].copy() print(topdata)# 去除CPU占用中的%和內存中的K topdata['CPU占用率(CPU%)'].replace(regex=True, inplace=True, to_replace='%', value='') topdata['實際使用的物理內存(RSS)'].replace(regex=True, inplace=True, to_replace='K', value='') # 轉換類型為int/float topdata['CPU占用率(CPU%)'] = topdata['CPU占用率(CPU%)'].astype('float64') topdata['實際使用的物理內存(RSS)'] = topdata['實際使用的物理內存(RSS)'].astype('float64')# 計算統計結果 min_mem = topdata['實際使用的物理內存(RSS)'].min() max_mem = topdata['實際使用的物理內存(RSS)'].max() avg_mem = round(topdata['實際使用的物理內存(RSS)'].mean(), 2) statistical_res = {'統計結果': ['總行數:' + str(len(topdata)),'ky_stb PID:' + str(topdata.iat[0, 0]),'運行時長:' + str(round(len(topdata) * 3 / 60 / 60, 2)) + 'h','ky_stb重啟次數:' + str(topdata['進程id(PID)'].value_counts().count() - 1),'最小CPU:' + str(topdata['CPU占用率(CPU%)'].min()) + '%','最大CPU:' + str(topdata['CPU占用率(CPU%)'].max()) + '%','平均CPU:' + str(round(topdata['CPU占用率(CPU%)'].mean(), 2)) + '%','最小內存:' + str(min_mem) + 'KB' + '(' + str(round(min_mem / 1024, 2)) + 'M)','最大內存:' + str(max_mem) + 'KB' + '(' + str(round(max_mem / 1024, 2)) + 'M)','平均內存:' + str(avg_mem) + 'KB' + '(' + str(round(avg_mem / 1024, 2)) + 'M)']}# 將內存數據轉換為折線圖并存儲為圖片 mem_show = pd.DataFrame(topdata['實際使用的物理內存(RSS)'], index=topdata.index) fig = plt.figure() # 設置字體,防止默認字體不存在告警以及顯示方塊 plt.rcParams['font.sans-serif'] = ['SimHei'] ax = fig.add_subplot(1, 1, 1) mem_show.plot(ax=ax) fig.savefig('mem.png')# 將統計結果放入新sheet中 add_sheet(pd.DataFrame(statistical_res), excel_write, sheet_name='統計結果') # 添加清洗后的未分析數據到excel的新sheet中 add_sheet(pd.DataFrame(topdata), excel_write, sheet_name='原始top數據清洗結果') # 添加最原始的數據 add_sheet(pd.DataFrame(original_data), excel_write, sheet_name='原始top數據') # 保存之前的修改 excel_write.save()# 刪除創建時的空sheet excel_file = path wb = openpyxl.load_workbook(excel_file) ws = wb['Sheet1'] wb.remove(ws) # 設置統計結果列的列寬 ws = wb[wb.sheetnames[0]] ws.column_dimensions['A'].width = 50 # 插入內存處理后的圖片到D3位置 img = Image('mem.png') ws.add_image(img, 'D3')wb.save(excel_file)(6)、打包
使用pyinstaller打包:
(這個是其官網,可以總體了解一下:http://www.pyinstaller.org)
打包后的exe在生成的dist目錄下。
期間打包后運行報錯:could not find the matplotlib data files,最后發現是matplotlib版本和pyinsteller版本不匹配導致的,我這里重新安裝3.1.1即可:
pip uninstall matplotlib pip install matplotlib==3.1.1三、最后
python流行自有其原因,豐富的包確實讓開發應用快捷很多,但是其執行效率和打包后的大小確實也比較大。總體來說,python及數據處理是值得下功夫琢磨的。
總結
以上是生活随笔為你收集整理的python将Linux下使用top命令获取的进程信息进行分析做可视化展示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机组成原理----思维导图
- 下一篇: 利用控制台进入某个目录下文件