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

| 類別 | 指標 | 採集方式 | 頻率 |
|---|---|---|---|
| 系統級 | 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 接口 | 業務定義 |
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 文件鎖防重啟agent.conf(採集項/頻率/上報目標)下篇將實現轉發服務端:
主機模塊是監控體系的「神經末梢」,其設計核心在於:採集全面準確、調度高效精準、報文緊湊可擴展、網絡韌性可靠、部署極簡安全。掌握此模塊開發,即掌握了構建企業級基礎設施監控平台的核心能力。