在 Linux 系統程式開發中,即時獲取 CPU、記憶體、負載、網路流量、進程狀態等核心指標是監控、調度、容器化等場景的基礎。本文深度解析來自 mooon 專案的 CInfo 類,展示一個結構清晰、介面豐富、採用純 C++ 封裝 /proc 與系統調用的跨平台資訊採集元件。
CInfo 在命名空間 SYS_NAMESPACE 內定義了六大 POD 結構體,涵蓋系統級與進程級指標:
sys_info_tuptime_second:開機至今秒數average_load[3]:1/5/15 分鐘負載ram_total / free / shared / buffer:主記憶體細分統計swap_total / free:交換空間統計process_number:當前進程總數process_time_t記錄用戶態/核心態 CPU 時間,含子進程累計值,單位為 jiffies (通常 1/100 秒)。
cpu_info_t提供總計、用戶態、nice、核心態、閒置、I/O 等待、硬/軟中斷等細分計數器,支援多核心陣列查詢 get_cpu_info_array。
mem_info_t對應 /proc/meminfo 關鍵欄位:total/free/buffers/cached/swap 等。
kernel_version_t結構化拆解 major/minor/revision,便於版本判斷 (minor 偶數為穩定版)。
process_info_t (38 欄位)完整映射 /proc/[pid]/stat,涵蓋 PID、狀態碼 (R/S/D/Z...)、父/組/會話 ID、頁錯誤、調度時間、優先級、執行緒數、虛擬/常駐記憶體、代碼/堆棧地址、信號位圖、CPU 親和性等。
net_info_t單網卡收發位元組/封包/錯誤/丟包/衝突/載波等計數器,支援單卡 get_net_info 與全卡陣列 get_net_info_array。
process_page_info_t以頁為單位統計代碼段、資料段、庫、共享、常駐集大小。
| 方法 | 說明 |
|---|---|
get_sys_info(sys_info_t&) | 系統整體快照 |
get_mem_info(mem_info_t&) | 記憶體使用詳情 |
get_cpu_info(cpu_info_t&) | 總 CPU 統計 |
get_cpu_info_array(vector<cpu_info_t>&) | 每核心 CPU 統計 |
get_kernel_version(kernel_version_t&) | 核心版本號 |
get_process_info(process_info_t&) | 當前進程完整狀態 |
get_process_page_info(process_page_info_t&) | 進程分頁統計 |
get_process_times(process_time_t&) | 進程 CPU 時間 |
get_net_info(iface, net_info_t&) | 指定網卡流量 |
get_net_info_array(vector<net_info_t>&) | 所有網卡流量 |
static,無需實例化,適合作為工具類調用。cpu_info_t 中保留 stealstolen/guest 註解欄位,適配 2.6.11/2.6.24+ 核心新增指標。net_info_t 直接提供累計計數器,應用層只需兩次採樣相減除以間隔即得即時帶寬。sys_info_t/cpu_info_t/mem_info_t 上報 Prometheus/Open-Falcon。process_info_t.vsize/rss 判斷是否超限。get_net_info_array 計算各網卡實時吞吐,動態調整傳輸策略。get_kernel_version 確認最低版本需求。完整實現 (含 info.cpp 解析 /proc/stat//proc/meminfo//proc/net/dev 等) 可至專案倉庫瀏覽:
info.cpp 原始碼
來源:飛月博客