首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

系統監控主機模塊設計實戰:UDP 心跳上報與多維指標采集

     編輯:關於C語言

系統監控

專案背景與架構定位

Unix 服務器缺乏圖形化監控界面,故障發現滯後。本專案構建三層監控體系:

  • 主機模塊(Agent):部署於被監控 Unix 主機,定時采集系統/應用指標,經 UDP 上報
  • 信息轉發模塊(Server/Relay):接收 Agent 數據,按訂閱轉發給顯示端
  • 顯示端模塊(Console):Windows GUI,多媒體化呈現(圖表/聲光報警)

監控模塊關系圖

主機模塊核心職責

  1. 指標采集器集合:模組化實現各類指標採集邏輯
  2. 調度引擎:按策略(固定間隔、隨機抖動、優先級)觸發采集
  3. 報文編碼器:將採集數據序列化為緊湊 UDP 報文
  4. 網絡發送器:非阻塞 UDP 發送,帶重試/熔斷
  5. 自註冊/心跳:啟動時向轉發端註冊,定期發送心跳存活聲明

關鍵採集指標清單

類別指標採集方式頻率
系統級CPU 使用率(用戶/系統/空閒/IOWAIT)/proc/stat 差值計算10s
內存使用(總/可用/緩衝/緩存/交換)/proc/meminfo 解析10s
磁盤空間(各掛載點使用率/Inode)statvfs() 系統調用60s
磁盤 IO(讀寫吞吐/IOPS/await/util)/proc/diskstats 差值10s
網絡級接口流量(收發字節/包/錯誤/丟包)/proc/net/dev 解析10s
TCP 連接狀態統計(ESTAB/TIME_WAIT 等)/proc/net/tcp 統計30s
Socket 監聽端口存活檢測connect() 探活60s
應用級關鍵進程存活(PID/CPU/MEM/線程數/打開句柄)/proc// 解析10s
消息隊列狀態(msgid/當前消息數/最大字節)msgctl(IPC_STAT)30s
共享內存段狀態shmctl(IPC_STAT)30s
信號量集狀態semctl(IPC_STAT)30s
業務自定義日誌錯誤率/業務吞吐/隊列積壓/緩存命中率讀取共享內存/文件/HTTP 接口業務定義

UDP 報文格式設計(緊湊二進制,網絡序)

struct __attribute__((packed)) MonitorPkt {
    uint32_t magic;        // 0x4D4F4E49 ("MONI")
    uint16_t version;      // 1
    uint16_t pkt_type;     // 1=心跳 2=指標數據 3=告警事件
    uint32_t agent_id;     // 主機唯一ID(IP哈希或配置)
    uint32_t timestamp;    // Unix時間戳
    uint16_t seq_num;      // 包序號,檢測丟包
    uint16_t payload_len;  // 負載長度
    // 以下為負載(根據 pkt_type 解析)
};

// 指標數據負載結構(TLV 鏈)
struct MetricTLV {
    uint16_t metric_id;    // 指標ID(如 1001=CPU用戶態%)
    uint8_t  data_type;    // 1=uint32 2=float 3=string
    uint16_t data_len;     // 數據長度
    uint8_t  data[];       // 變長數據
};

調度引擎實現策略

// 定時器堆(最小堆),O(log n) 插入/取出最近到期任務
typedef struct TimerNode {
    time_t next_run;       // 下次運行時間
    int interval;          // 間隔秒數
    void (*collector)(void*); // 采集回調
    void *arg;             // 回調參數
    int priority;          // 優先級(高優先先執行)
} TimerNode;

// 主循環
while (running) {
    time_t now = time(NULL);
    // 1. 處理到期定時器
    while (heap_top() && heap_top()->next_run <= now) {
        TimerNode *tn = heap_pop();
        tn->collector(tn->arg);           // 執行采集
        tn->next_run = now + tn->interval; // 重算下次時間
        heap_push(tn);                    // 重入堆
    }
    // 2. 發送緩衝區數據
    flush_send_buffer();
    // 3. 計算下次最近到期時間,select/poll 等待
    int timeout = heap_empty() ? 1000 : (heap_top()->next_run - time(NULL)) * 1000;
    select(0, NULL, NULL, NULL, &timeout_tv);
}

工程化關鍵點

  • 單例守護進程:daemon(1,0) + PID 文件鎖防重啟
  • 配置熱加載:SIGHUP 觸發重讀 agent.conf(採集項/頻率/上報目標)
  • 自我保護:CPU/內存佔用超閾值自動降級(減少採集頻率/項目)
  • 網絡韌性:UDP 發送失敗入本地環形緩衝區,恢復後補發;轉發端多 IP 故障切換
  • 安全加固:報文簽名(HMAC-SHA256)、時間戳防重放、可選 DTLS 加密
  • 零依賴部署:靜態鏈接 musl libc,單二進制文件 < 500KB,拷貝即用

下一步:信息轉發模塊

下篇將實現轉發服務端:

  • UDP 接收 Agent 數據,解析、校驗、入庫(時序數據庫 InfluxDB/TimescaleDB)
  • TCP 長連接管理顯示端註冊/訂閱/推送
  • 規則引擎:閾值告警/趨勢異常/日誌關鍵字匹配 → 多渠道通知(郵件/短信/鉤子/語音)
  • 集群模式:一致性哈希分片、主備切換、水平擴展

總結

主機模塊是監控體系的「神經末梢」,其設計核心在於:採集全面準確、調度高效精準、報文緊湊可擴展、網絡韌性可靠、部署極簡安全。掌握此模塊開發,即掌握了構建企業級基礎設施監控平台的核心能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved