日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

python将Linux下使用top命令获取的进程信息进行分析做可视化展示

發布時間:2024/1/18 linux 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python将Linux下使用top命令获取的进程信息进行分析做可视化展示 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python將Linux下使用top命令獲取的進程信息進行分析做可視化展示

版本

版本作者日期備注
v1.0ZY2020.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)

pip install pyinstaller pyinstaller -F xxx.py

打包后的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命令获取的进程信息进行分析做可视化展示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。