Linux 將核心運行狀態以虛擬檔案形式暴露於 /proc 檔案系統,無需額外工具即可獲取豐富效能指標。本文詳細解析五大核心維度的資料來源、計算方法與實戰腳本,助您建立輕量級監控體系。
cpu 256279030 0 11832528 1637168262 0 0 0 0 0 0
cpu0 123456789 0 5678901 818584131 ...
欄位依序:user、nice、system、idle、iowait、irq、softirq、steal、guest、guest_nice(單位:jiffies,通常 1/100 秒或 1/1000 秒)。
採樣間隔 Δt(秒)內:
Total_delta = Σ(欄位_delta)
Idle_delta = idle_delta + iowait_delta
CPU% = 100 * (Total_delta - Idle_delta) / Total_delta
cpu_usage() {
read -r _ u n s i io irq sirq st g gn < /proc/stat
sleep 1
read -r _ u2 n2 s2 i2 io2 irq2 sirq2 st2 g2 gn2 < /proc/stat
total=$((u2-u+n2-n+s2-s+i2-i+io2-io+irq2-irq+sirq2-sirq+st2-st+g2-g+gn2-gn))
idle=$((i2-i+io2-io))
echo $((100 * (total - idle) / total))
}
MemTotal:總物理記憶體MemFree:完全未使用MemAvailable:核心 3.14+ 關鍵指標,估算不觸發 swap 可分配記憶體(含可回收 page cache/slab)Buffers、Cached、SReclaimable:可回收快取SwapTotal/Free:交換空間# 真實使用率(排除可回收快取)
Used = MemTotal - MemAvailable
Usage% = 100 * Used / MemTotal
避免解析 df 輸出,直接呼叫 statfs() 獲取指定路徑分區資訊:
struct statfs st;
statfs("/var/lib/mysql", &st);
total_GB = st.f_bsize * st.f_blocks / 1024^3;
avail_GB = st.f_bsize * st.f_bavail / 1024^3;
關鍵差異:f_bfree 含 root 保留區塊,f_bavail 僅非 root 可用。
major minor name reads reads_merged sectors_read ms_read
writes writes_merged sectors_written ms_write
ios_in_progress ms_io weighted_ms_io
(reads_delta + writes_delta) / Δt(sectors_read_delta + sectors_write_delta) * 512 / 1024^2 / Δt(ms_read_delta + ms_write_delta) / (reads_delta + writes_delta)ms_io_delta / (Δt * 1000) * 100Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
eth0: 12345678 12345 0 0 0 0 0 0 87654321 12345 0 0 0 0 0 0
bytes_delta / Δtpackets_delta / Δterrs_delta / packets_delta * 100%#!/bin/bash
# collect_metrics.sh - 每秒採樣輸出 JSON
while true; do
ts=$(date +%s)
cpu=$(cpu_usage)
mem=$(awk '/MemTotal|MemAvailable/{printf "%s ", $2}' /proc/meminfo | awk '{print 100*($1-$2)/$1}')
disk=$(df -B1 / | tail -1 | awk '{print 100*$3/$2}')
rx=$(awk '/eth0:/{print $2}' /proc/net/dev)
tx=$(awk '/eth0:/{print $10}' /proc/net/dev)
sleep 1
rx2=$(awk '/eth0:/{print $2}' /proc/net/dev)
tx2=$(awk '/eth0:/{print $10}' /proc/net/dev)
echo "{\"ts\":$ts,\"cpu\":$cpu,\"mem\":$mem,\"disk\":$disk,\"rx_bps\":$((rx2-rx)),\"tx_bps\":$((tx2-tx))}"
done
掌握 /proc 核心指標解析,即可在無代理、零依賴的環境下構建高頻監控系統,為容器編排、自動擴縮容、異常偵測提供最原始、最準確的數據源。