/proc 是一個虛擬文件系統,不佔磁盤空間,掛載在內存中,提供內核數據結構的只讀/可寫接口。每個進程一個 /proc/PID/ 目錄,全局信息直接在 /proc/ 下。本文系統梳理高頻文件含義、讀取示例、監控腳本編寫與容器化注意事項。
| 文件 | 含義 | 典型用途 |
|---|---|---|
cmdline | 啟動命令行參數(以 \0 分隔) | 識別進程用途、容器入口點 |
cwd | 當前工作目錄(符號鏈接) | 定位進程操作目錄 |
environ | 環境變量(\0 分隔) | 排查配置注入、敏感信息洩露 |
exe | 可執行文件路徑(符號鏈接) | 驗證二進制完整性、發現替換 |
fd/ | 文件描述符目錄(符號鏈接指向實際文件/管道/Socket) | 排查文件洩漏、Socket 連接對端 |
maps | 內存映射區域(起止地址、權限、偏移、設備、inode、路徑) | 分析堆/棧/共享庫/匿名映射、定位內存洩漏 |
smaps | 每個映射的詳細統計(Size、Rss、Pss、Shared_Clean/Dirty、Private_Clean/Dirty、Swap、KernelPageSize、MMUPageSize、Locked、VmFlags) | 精準計算進程實際物理內存佔用 (PSS) |
status | 進程狀態人類可讀摘要(PID、PPID、State、Uid/Gid、VmPeak/VmSize/VmRSS/VmSwap、Threads、SigQ、SigPnd/ShdPnd/BlkPnd/IgnPnd/CgtPnd) | 快速概覽進程資源佔用、線程數、信號屏蔽 |
stat | 內核原始統計(供 top/ps 解析) | 腳本化采集 |
io | IO 統計(rchar/wchar/syscr/syscw/read_bytes/write_bytes/cancelled_write_bytes) | 定位 IO 密集型進程 |
limits | 資源限制(Max open files、Max processes、Address space、File size、Core file size...) | 排查「Too many open files」等限制問題 |
cgroup | 控制組路徑 | 容器資源配額驗證、systemd slice 確認 |
ns/ | 命名空間 inode 符號鏈接 (ipc/mnt/net/pid/user/uts/cgroup/time) | 容器隔離性驗證、nsenter 目標 |
oom_score / oom_score_adj | OOM Killer 分數與調整值 | 保護關鍵進程不被殺 |
| 文件/目錄 | 含義 | 關鍵指標 |
|---|---|---|
cpuinfo | CPU 型號、頻率、緩存、特性標志、bogomips | 核心數、架構、虛擬化特性 |
meminfo | 內存總量、可用、緩衝/緩存、Swap、HugePages、Slab、Committed_AS、PageTables、Vmalloc | MemAvailable、SwapFree、HugePages_Free |
loadavg | 1/5/15 分鐘負載、運行/總任務數、最近 PID | 負載趨勢 |
stat | CPU 時間片 (user/nice/system/idle/iowait/irq/softirq/steal/guest)、上下文切換、進程創建、中斷、啟動時間 | CPU 利用率分解、ctxt、processes |
uptime | 啟動秒數、空閒秒數 | 系統運行時長 |
version | 內核版本、編譯器、編譯時間 | 內核版本確認 |
interrupts | 每 CPU 每中斷號計數、類型、驅動名 | 中斷負載均衡、網卡/磁盤中斷親和性 |
softirqs | 軟中斷計數 (NET_RX/TX, BLOCK, TASKLET, SCHED, RCU...) | 網絡/塊設備軟中斷熱點 |
devices | 字符/塊設備主設備號與驅動名映射 | 驅動加載驗證、mknod 參考 |
partitions | 分區主/次設備號、塊數、名稱 | 磁盤分區掃描 |
mounts | 當前掛載點(設備、掛載點、類型、選項) | 比 /etc/mtab 更準確(含手工掛載) |
filesystems | 內核支持的文件系統類型(nodev 表示無設備) | 模塊加載狀態 |
swaps | Swap 設備/文件、大小、已用、優先級 | Swap 使用情況 |
vmstat | 內核級虛擬內存統計 (pgpgin/out, pswpin/out, pgalloc/free, pgfault/majfault...) | 頁面換入出、缺頁中斷 |
slabinfo | Slab 分配器緩存統計(名稱、活躍/總對象數、大小、頁數) | 內核內存洩漏分析 |
modules | 已加載內核模塊(名稱、大小、引用計數、依賴、狀態、地址) | lsmod 數據源 |
net/ | 網絡協議棧統計(dev 設備統計、tcp/udp 連接表、arp、route、snmp 協議計數器) | 網絡流量、連接狀態、協議錯誤 |
sys/ | 內核參數運行時調整接口(/proc/sys = /sys` 部分重疊) | sysctl 底層實現 |
scsi/ | SCSI 設備層級信息 | 存儲設備診斷 |
bus/ | 總線設備 (PCI/USB/Input...) | 硬件枚舉 |
irq/ | 中斷親和性配置(smp_affinity) | 中斷綁核優化 |
# 1. 批量讀取進程 cmdline (以空格分隔顯示)
for pid in /proc/[0-9]*; do
printf "%-6s %s\n" "${pid##*/}" "$(tr '\0' ' ' < "$pid/cmdline")"
done
# 2. 計算進程真實物理內存 (PSS) 總和
awk '/^Pss:/ {sum+=$2} END {print "Total PSS:", sum, "kB"}' /proc/[0-9]*/smaps 2>/dev/null
# 3. 監控系統負載變化
watch -n 1 'cat /proc/loadavg'
# 4. 查看網卡流量統計
cat /proc/net/dev | awk '$1 ~ /^eth|^ens|^enp/ {rx+=$2; tx+=$10} END {print "RX:", rx/1024/1024, "MB TX:", tx/1024/1024, "MB"}'
# 5. 實時觀察中斷分布
watch -n 1 'cat /proc/interrupts | grep -E "eth|nvme|irq"'
# 6. 獲取容器進程在宿主機的 PID
# 容器內 cat /proc/self/status | grep NSpid
# 最後一列即宿主機 PID
/proc 包含所有容器進程,容器內默認只見自己 PID 命名空間內的進程(--pid=host 可共享)。/proc/meminfo 在容器內默認顯示宿主機內存(除非使用 lxcfs 或 cgroup v2 + proc_pid_cgroup 過濾),導致 free、top 誤導。Java 等依賴 MemTotal 計算堆大小的應用需配置 -XX:MaxRAMPercentage 或掛載 lxcfs。/proc/PID/,hidepid=2 掛載選項可隱藏他人進程目錄。# 典型調優
echo 1 > /proc/sys/vm/overcommit_memory # 允許過度提交內存
echo 10 > /proc/sys/vm/swappiness # 降低 Swap 傾向
echo 262144 > /proc/sys/vm/max_map_count # 適配 Elasticsearch 等大映射應用
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse # 復用 TIME_WAIT
echo 65535 > /proc/sys/fs/file-max # 系統級文件描述符上限
echo 1000000 > /proc/sys/fs/nr_open # 單進程文件描述符上限 (需 ulimit 配合)
# 永久生效請寫入 /etc/sysctl.d/99-custom.conf 並 sysctl --system
/proc 是 Linux 內核狀態的「全息投影」,掌握核心文件含義、熟練用 cat/awk/watch 組合拳提取關鍵指標,是系統運維、性能分析、容器故障排查的基本功。建議將高頻讀取封裝為腳本或 Prometheus Exporter,構建自動化觀測體系。