linux程序性能數據採集方案

1 背景

因公司需要對開發的軟件進行性能測試,需採集並記錄測試過程中程序及系統的性能數據,包括cpu使用率、內存使用率、磁盤使用率等,方便開發人員對程序的性能表現進行分析。監控程序要求能夠運行在x86或者Arm嵌入式平臺上的linux系統,採集性能數據的程序須儘可能輕量化和可定製,於是個人利用工作之餘設計本方案。

爲了使用者能夠實時查看到監視目標的 運行情況,方案選擇C/S架構實現功能。性能採集服務運行在檢測目標所在的環境,採集並記錄性能數據,用戶可通過客戶端遠程連接服務,並實時獲取數據。

方案劃分爲三個子模塊:

PD-001 性能數據採集模塊
PD-002 性能數據網絡傳輸模塊
PD-003 數據可視化模塊

2 方案描述

2.1 性能數據採集模塊

2.1.1 模塊說明

在服務器測試或運行的過程中,實時監測程序的性能數據是判斷程序是否運行健康的重要依據。隨着物聯網領域的不斷髮展,數據採集點、邊緣節點爆發式增長,爲了能夠實時監視這些節點的運行健康狀況,需要專門的性能數據採集服務器,對節點的維護相關的數據進行實時採集,並對採集的數據進行分析、決策、展示。從而在海量的設備、節點、服務中定位問題點,提高服務質量,同時降低運維成本。

本方案僅涉及數據採集相關技術,描述類Unix系統中,有哪些運維相關的性能數據源、描述採集方法、提供基本性能數據採集庫、並提供數據採集開發框架。

2.1.2 方案設計

系統性能數據

/proc/stat 系統cpu使用率統計,多核時包括各個核心
/proc/<PID>/stat 進程基本信息
/proc/<PID>/commandLine 進程執行指令
/proc/meminfo 系統內存使用統計
/proc/top 進程列表數據

【1】項目路徑:https://github.com/csjy309450/Pump/tree/master/modules/drone

2.2 性能數據網絡傳輸模塊

2.2.1 模塊說明

性能監視主體和目標往往不在同一臺主機上,因此需要在採集數據後實現數據的網絡傳輸。

爲了實現網絡傳輸,需要開發接收性能採集請求並處理採集任務的服務器程序和發出性能數據採集請求並收受性能數據返回的客戶端程序,並制定性能數據在網絡上傳輸的通信協議。爲方便與現有的應用程序體系集成,服務器、客戶端遵循http協議,性能數據採集協議則採用restful風格http+json。採集服務運行在被監視點,如遠程服務端或者邊緣節點。

2.2.2 方案設計

協議URI規範

名稱

URI

操作

說明

系統全局性能參數

/drone/proc/top

GET/POST

GET 獲取全部數據
POST 獲取指定參數

服務數據採集能力

/drone/system/capacity

OPTION

獲取採集服務支持的接口

單個進程性能參數

/drone/proc/<PID>/xxx

GET/POST

GET 獲取全部數據
POST 獲取指定參數

http服務器基於ACE JAWS改造,之後單獨寫博文介紹。

2.3 數據可視化模塊

2.3.1 echarts簡介

echarts是百度提供基於JavaScript 實現的開源可視化庫。可以流暢的運行在 PC 和移動設備上,兼容當前絕大部分瀏覽器(IE8/9/10/11,Chrome,Firefox,Safari等)。底層依賴矢量圖形庫 ZRender,提供直觀,交互豐富,可高度個性化定製的數據可視化圖表。

特性:
1.豐富的可視化類型
2.多種數據格式無需轉換直接使用
3.千萬數據的前端展現
4.移動端優化
...
具體自己查看官網

2.3.2 方案說明

在桌面應用程序領域,一直缺乏類似web頁面一般友好直觀的數據可視化工具。雖然也有mathGL\Gnuplot之類的c++數據可視化庫,但是與基於js的數據可視化庫所帶來的體驗相比,無論從數據展現的角度還是從交互體驗的角度,都遜色很多。個人認爲基於js的數據可視化庫之所以在用戶體驗上能夠領先其他技術的根本原因,在於html+js+css三種技術多年來專注於數據可視化領域,經過多年發展,相互分工明確、配合密切,自然在體驗上領先於其他技術。

而echarts是衆多基於js的數據可視化解決方案中非常優秀的一套解決方案,其設計初衷是在網站頁面上完美展現數據圖表。進過前幾代的發展,echarts4無論是在性能上、可視化類型上以及交互體驗上都已經非常成熟。如此優秀的數據可視化方案,僅能在web頁面上集成對開發者來說是可惜的。近些年,雖然隨着web服務器技術的不斷髮展,越來越多的公司選擇通過遠程服務器+web瀏覽器這種方式向客戶提供服務,但傳統的桌面應用程序在很多應用領域仍然具有不可替代性,因此若能夠在桌面應用程序中集成echarts庫,將極大提高應用程序數據可視化的用戶體驗。

2.3.3 方案設計

要在桌面窗口程序中集成echarts庫,最關鍵的技術是實現在桌面窗口程序中渲染網頁。所幸,隨着google chromium的開源,當前已經有相當多的桌面應用框架集成了chromium,並實現了在桌面窗口中渲染web頁面的功能。 

c++

Qt5.x WebEngine

python

PyQt5 WebEngine

c#

CefSharp

java                                                          

JxBrowser

js

Electron

方案的另一個技術點,在於根據用戶的要求產生echarts配置代碼。echarts提供的圖標類型及配置項非常豐富,如果只是提供固定模板供界面調用無法獲得最優的體現,因此可以對echarts提供的配置項進行封裝,程序根據用戶的要求產生echarts配置代碼,從而在界面上渲染出圖表。因爲echarts的配置代碼是一個json對象,產生配置代碼的過程就是json序列化的過程,因此需要實現內存數據->json功能。

本方案的目標是能夠使各種語言開發的桌面應用程序能夠集成,因此提供的SDK由c++開發,並提供c接口的動態庫,方便多語言集成。

總之,爲了實現在桌面應用中集成echarts,本方案採用的技術首先是通過對c++對echarts配置項進行封裝,爲客戶提供配置、生成echarts圖表模板的API,然後在現有窗口類的比如Qt WebEngineView的基礎上,封裝Echarts窗口,方便用戶集成。並提供使用說明文檔和實例代碼。

注:當前echart桌面化代碼不夠完善,工作量比我預想的很多,特別是各種圖標的配置。目前只實現了折線圖的基本功能,所以沒有放在github上。另外,數據序列化方案採用自家開發的AC框架。

參考:

【1】AC——c++數據序列化方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章