最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux進程資源占用詳解

 更新時間:2025年11月11日 09:35:29   作者:REDcker  
本文檔詳細介紹了在Linux系統(tǒng)下分析和監(jiān)控進程資源占用的方法,涵蓋了多種工具和命令,如top、htop、ps、pidstat、atop、sar、vmstat、pmap、smem、ss、iotop、lsof等,這些工具可以幫助用戶快速查看和監(jiān)控CPU、內存、I/O等關鍵指標,從而有效定位和解決資源使用問題

Linux進程資源占用分析指南

本文檔介紹在 Linux 系統(tǒng)下如何分析和監(jiān)控進程的資源占用情況,包括 CPU、內存、I/O 等關鍵指標的查看方法。

快速開始

前提條件

已知進程 ID (PID)

獲取 PID 的方法:

# 通過進程名查找
pgrep process_name
ps aux | grep process_name

# 通過端口查找
lsof -i :port
netstat -tlnp | grep :port

命令行工具

1.top命令(實時監(jiān)控)

基本用法:

top -p PID

交互式操作:

  • 1 - 顯示每個 CPU 核心的使用情況
  • c - 切換顯示完整命令行
  • M - 按內存使用排序
  • P - 按 CPU 使用排序
  • f - 添加或刪除顯示的字段
  • q - 退出

輸出說明:

  • %CPU - CPU 使用百分比
  • %MEM - 內存使用百分比
  • VIRT - 虛擬內存大小
  • RES - 物理內存使用(RSS)
  • SHR - 共享內存

2.htop(增強版 top,推薦)

基本用法:

htop -p PID

功能特點:

  • 更直觀的彩色界面
  • 樹狀視圖顯示進程關系(按 F5
  • 可直接查看進程打開的文件(按 F2 添加列)
  • 支持鼠標操作
  • 實時顯示 CPU 和內存使用率

快捷鍵:

  • F2 - 設置
  • F5 - 樹狀視圖
  • F6 - 排序選擇
  • F9 - 發(fā)送信號
  • F10 - 退出

3.ps命令(快照查看)

基本資源查看:

ps -p PID -o pid,ppid,%cpu,%mem,vsz,rss,cmd

詳細資源報告:

ps -p PID -o user,pid,ppid,ni,%cpu,%mem,vsz,rss,tty,stat,start,time,cmd,etime

字段說明:

  • pid - 進程 ID
  • ppid - 父進程 ID
  • %cpu - CPU 使用百分比
  • %mem - 內存使用百分比
  • vsz - 虛擬內存大?。↘B)
  • rss - 物理內存使用(KB)
  • cmd - 完整命令行
  • etime - 進程運行時間
  • stat - 進程狀態(tài)

連續(xù)監(jiān)控:

watch -n 1 'ps -p PID -o pid,%cpu,%mem,vsz,rss,cmd'

4.pidstat(詳細資源統(tǒng)計)

安裝:

# Ubuntu/Debian
sudo apt-get install sysstat

# CentOS/RHEL
sudo yum install sysstat

基本用法:

# 每2秒刷新一次,共顯示5次
pidstat -p PID 2 5

詳細資源監(jiān)控:

# 磁盤 I/O 統(tǒng)計
pidstat -d -p PID

# 內存頁錯誤統(tǒng)計
pidstat -r -p PID

# 棧使用統(tǒng)計
pidstat -s -p PID

# 線程級統(tǒng)計
pidstat -t -p PID

# 綜合統(tǒng)計(CPU、內存、I/O)
pidstat -u -r -d -p PID 2 5

輸出指標:

  • %usr - 用戶態(tài) CPU 使用率
  • %system - 內核態(tài) CPU 使用率
  • %guest - 虛擬化 CPU 使用率
  • %CPU - 總 CPU 使用率
  • minflt/s - 次要頁錯誤率
  • majflt/s - 主要頁錯誤率
  • VSZ - 虛擬內存大小
  • RSS - 物理內存使用
  • kB_rd/s - 讀取速率(KB/s)
  • kB_wr/s - 寫入速率(KB/s)

5.atop(高級監(jiān)控)

安裝:

# Ubuntu/Debian
sudo apt-get install atop

# CentOS/RHEL
sudo yum install atop

基本用法:

atop -p PID

功能亮點:

  • 顯示磁盤負載詳情
  • 網絡帶寬使用統(tǒng)計
  • 進程級 GPU 使用(需插件支持)
  • 歷史資源記錄(按 t 切換時間點)
  • 支持記錄和回放

快捷鍵:

  • t - 切換時間點
  • m - 顯示內存信息
  • d - 顯示磁盤信息
  • n - 顯示網絡信息
  • q - 退出

6.nmon(可視化監(jiān)控)

安裝:

# Ubuntu/Debian
sudo apt-get install nmon

# CentOS/RHEL
sudo yum install nmon

基本用法:

nmon -p PID

交互式界面:

  • c - 查看 CPU 使用情況
  • m - 查看內存使用情況
  • d - 查看磁盤 I/O
  • n - 查看網絡統(tǒng)計
  • t - 查看進程/線程統(tǒng)計
  • q - 退出

7.iotop(I/O 監(jiān)控)

安裝:

# Ubuntu/Debian
sudo apt-get install iotop

# CentOS/RHEL
sudo yum install iotop

基本用法:

# 實時監(jiān)控指定進程的 I/O
iotop -p PID

# 顯示累計 I/O
iotop -a -p PID

輸出說明:

  • DISK READ - 磁盤讀取速率
  • DISK WRITE - 磁盤寫入速率
  • SWAPIN - 交換分區(qū)使用率
  • IO - I/O 使用百分比

8.lsof(列出打開文件)

基本用法:

# 查看進程打開的所有文件
lsof -p PID

# 查看進程打開的網絡連接
lsof -p PID -i

# 查看進程打開的文件描述符數量
lsof -p PID | wc -l

# 查看進程打開的具體文件類型
lsof -p PID | grep -E 'REG|DIR|CHR|FIFO|SOCK'

# 查看進程的端口占用
lsof -p PID -iTCP -sTCP:LISTEN

# 查看進程的工作目錄
lsof -p PID | grep cwd

# 查看進程打開的文件并按類型統(tǒng)計
lsof -p PID | awk '{print $5}' | sort | uniq -c

字段說明:

  • COMMAND - 命令名
  • PID - 進程 ID
  • USER - 用戶
  • FD - 文件描述符
  • TYPE - 文件類型(REG=普通文件, DIR=目錄, CHR=字符設備等)
  • DEVICE - 設備號
  • SIZE/OFF - 文件大小或偏移量
  • NODE - inode 號
  • NAME - 文件路徑

9.sar(系統(tǒng)活動報告)

安裝:

# Ubuntu/Debian
sudo apt-get install sysstat

# CentOS/RHEL
sudo yum install sysstat

基本用法:

# 查看當前 CPU 使用(每1秒刷新,共5次)
sar -u 1 5

# 查看內存使用
sar -r 1 5

# 查看 I/O 統(tǒng)計
sar -b 1 5

# 查看進程相關統(tǒng)計
sar -x PID 1 5

# 查看歷史數據(需要啟用 sysstat 數據收集)
sar -u
sar -r
sar -b

# 生成綜合報告
sar -A > sar_report.txt

優(yōu)勢:

  • 可以查看歷史性能數據
  • 適合長期監(jiān)控和趨勢分析
  • 數據可以保存和回放

10.vmstat(虛擬內存統(tǒng)計)

基本用法:

# 每2秒刷新一次,共顯示5次
vmstat 2 5

# 查看進程相關統(tǒng)計
vmstat -p /dev/sda1 2 5

# 顯示詳細的內存統(tǒng)計
vmstat -s

輸出說明:

  • procs - 進程統(tǒng)計(r=運行隊列, b=阻塞)
  • memory - 內存統(tǒng)計(swpd=交換分區(qū), free=空閑內存)
  • swap - 交換分區(qū)使用
  • io - I/O 統(tǒng)計(bi=塊讀取, bo=塊寫入)
  • system - 系統(tǒng)統(tǒng)計(in=中斷, cs=上下文切換)
  • cpu - CPU 使用百分比

11.pmap(內存映射查看)

基本用法:

# 查看進程的內存映射
pmap -x PID

# 顯示詳細信息
pmap -XX PID

# 顯示設備格式
pmap -d PID

# 顯示擴展格式
pmap -X PID

# 查看內存映射摘要
pmap -q PID

輸出說明:

  • Address - 內存地址范圍
  • Kbytes - 內存大小(KB)
  • RSS - 實際物理內存(KB)
  • Dirty - 臟頁大?。↘B)
  • Mode - 內存權限(r=讀, w=寫, x=執(zhí)行, s=共享, p=私有)
  • Mapping - 映射的文件或設備

用途:

  • 分析內存占用分布
  • 查找內存泄漏
  • 查看共享庫占用

12.smem(內存使用統(tǒng)計)

安裝:

# Ubuntu/Debian
sudo apt-get install smem

# CentOS/RHEL
sudo yum install smem

基本用法:

# 查看進程內存使用(按 PSS 排序)
smem -P process_name

# 查看指定 PID 的內存使用
smem -p PID

# 顯示詳細統(tǒng)計
smem -t -k -p PID

# 按用戶統(tǒng)計
smem -u

# 生成報告
smem -t -k -P process_name -c "pid user command pss rss"

優(yōu)勢:

  • PSS (Proportional Set Size): 更準確的內存統(tǒng)計,考慮了共享內存
  • USS (Unique Set Size): 進程獨占的內存
  • RSS (Resident Set Size): 實際物理內存

13.ss(現(xiàn)代網絡連接工具)

基本用法:

# 查看進程的網絡連接
ss -tulpn | grep PID

# 查看 TCP 連接
ss -tpn | grep PID

# 查看 UDP 連接
ss -upn | grep PID

# 顯示詳細信息
ss -tulnap | grep PID

# 查看監(jiān)聽端口
ss -tlnp | grep PID

# 統(tǒng)計連接數
ss -s

相比 netstat 的優(yōu)勢:

  • 更快速
  • 顯示更多信息
  • 更好的過濾選項

14.time命令(執(zhí)行時間統(tǒng)計)

基本用法:

# 使用 time 命令運行程序并統(tǒng)計資源
time command

# 使用 /usr/bin/time 獲取更詳細信息
/usr/bin/time -v command

# 查看進程運行時間
time -p sleep 5

# 詳細資源統(tǒng)計
/usr/bin/time -f "%E real, %U user, %S sys, %M KB memory" command

輸出說明:

  • real - 實際運行時間(墻鐘時間)
  • user - 用戶態(tài) CPU 時間
  • sys - 內核態(tài) CPU 時間
  • %M - 最大內存使用(KB)

15.taskset/numactl(CPU 親和性和 NUMA)

基本用法:

# 查看進程的 CPU 親和性
taskset -p PID

# 查看進程的 NUMA 節(jié)點
numactl --show

# 查看進程的 NUMA 統(tǒng)計
numastat -p PID

# 查看系統(tǒng) NUMA 信息
numactl --hardware

用途:

  • 優(yōu)化進程的 CPU 綁定
  • 在 NUMA 系統(tǒng)上優(yōu)化內存訪問
  • 提高緩存命中率

16.prlimit(資源限制查看)

基本用法:

# 查看進程的資源限制
prlimit --pid=PID

# 查看特定資源限制
prlimit --pid=PID --as    # 虛擬內存限制
prlimit --pid=PID --rss   # 物理內存限制
prlimit --pid=PID --nofile # 文件描述符限制
prlimit --pid=PID --cpu   # CPU 時間限制

常用資源限制:

  • AS - 虛擬內存大小
  • RSS - 物理內存大小
  • NOFILE - 文件描述符數量
  • CPU - CPU 時間(秒)
  • NPROC - 進程數限制

17.systemd-cgtop(systemd 進程組監(jiān)控)

基本用法:

# 查看 systemd 管理的進程組資源使用
systemd-cgtop

# 查看特定服務的資源使用
systemd-cgtop /system.slice/service-name.service

# 查看用戶服務的資源使用
systemd-cgtop /user.slice/user-1000.slice

適用場景:

  • 監(jiān)控 systemd 管理的服務
  • 查看容器資源使用(如果使用 systemd-nspawn)
  • 分析服務資源消耗

18.slabtop(內核 slab 緩存監(jiān)控)

基本用法:

# 實時查看內核 slab 緩存使用
slabtop

# 按使用量排序
slabtop -s c

# 只顯示正在使用的緩存
slabtop -o

用途:

  • 診斷內核內存泄漏
  • 查看內核緩存使用情況
  • 分析系統(tǒng)內存壓力

系統(tǒng)文件分析

/proc文件系統(tǒng)(底層信息)

/proc/PID/ 目錄提供了進程的詳細底層信息。

CPU 使用情況
# 查看進程 CPU 時間統(tǒng)計
cat /proc/PID/stat | awk '{print "用戶態(tài)CPU: " $14 " 時鐘周期"; print "內核態(tài)CPU: " $15 " 時鐘周期"}'

# 實時監(jiān)控 CPU 使用率
while true; do
  cat /proc/PID/stat | awk '{utime=$14; stime=$15; total=$14+$15; print "用戶態(tài): " utime " 內核態(tài): " stime " 總計: " total}'
  sleep 1
done
內存使用情況
# 查看內存詳細信息
cat /proc/PID/status | grep -E 'VmPeak|VmSize|VmRSS|VmSwap|VmHWM|VmData|VmStk|VmExe'

# 字段說明:
# VmPeak  - 虛擬內存峰值(KB)
# VmSize  - 當前虛擬內存大?。↘B)
# VmRSS   - 實際物理內存使用(KB)
# VmSwap  - 交換分區(qū)使用(KB)
# VmHWM   - 物理內存峰值(KB)
# VmData  - 數據段大?。↘B)
# VmStk   - 棧大小(KB)
# VmExe   - 可執(zhí)行文件大?。↘B)
打開文件描述符
# 查看打開的文件描述符數量
ls -l /proc/PID/fd | wc -l

# 查看具體打開的文件
ls -l /proc/PID/fd

# 查看打開的文件列表(帶路徑)
for fd in /proc/PID/fd/*; do
  readlink -f "$fd"
done
I/O 統(tǒng)計
# 查看 I/O 統(tǒng)計信息
cat /proc/PID/io

# 輸出字段說明:
# rchar        - 讀取字符數(包括緩存)
# wchar        - 寫入字符數(包括緩存)
# syscr        - 系統(tǒng)調用讀取次數
# syscw        - 系統(tǒng)調用寫入次數
# read_bytes   - 實際磁盤讀取字節(jié)數
# write_bytes  - 實際磁盤寫入字節(jié)數
# cancelled_write_bytes - 取消的寫入字節(jié)數
線程信息
# 查看線程數量
ls /proc/PID/task | wc -l

# 查看每個線程的詳細信息
for tid in /proc/PID/task/*; do
  echo "線程 ID: $(basename $tid)"
  cat $tid/stat | awk '{print "CPU時間: " $14+$15}'
done
上下文切換
# 查看上下文切換統(tǒng)計
cat /proc/PID/status | grep -E 'voluntary_ctxt_switches|nonvoluntary_ctxt_switches'

# 字段說明:
# voluntary_ctxt_switches     - 自愿上下文切換(等待資源)
# nonvoluntary_ctxt_switches  - 非自愿上下文切換(時間片到期)
網絡連接
# 查看進程的網絡連接
cat /proc/PID/net/tcp
cat /proc/PID/net/udp

# 或使用 netstat/lsof
netstat -anp | grep PID
lsof -p PID -i
資源限制
# 查看進程的資源限制
cat /proc/PID/limits

# 字段說明:
# Limit           - 資源類型
# Soft Limit      - 軟限制(可超過但會收到信號)
# Hard Limit      - 硬限制(不可超過)
# Units           - 單位
環(huán)境變量
# 查看進程的環(huán)境變量
cat /proc/PID/environ | tr '\0' '\n'

# 查找特定環(huán)境變量
cat /proc/PID/environ | tr '\0' '\n' | grep VARIABLE_NAME
命令行和工作目錄
# 查看命令行參數
cat /proc/PID/cmdline | tr '\0' ' '

# 查看工作目錄
readlink /proc/PID/cwd

# 查看可執(zhí)行文件路徑
readlink /proc/PID/exe
內存映射詳情
# 查看詳細的內存映射
cat /proc/PID/maps

# 查看內存映射摘要
cat /proc/PID/smaps

# smaps 提供更詳細的信息:
# - 每個映射區(qū)域的詳細統(tǒng)計
# - 共享/私有內存大小
# - 臟頁統(tǒng)計
# - 交換分區(qū)使用
進程關系
# 查看進程樹
pstree -p PID

# 查看子進程
ps --ppid PID

# 查看進程會話和進程組
cat /proc/PID/stat | awk '{print "會話ID: " $6 " 進程組: " $5}'

Cgroup 資源監(jiān)控

Cgroup v1 文件系統(tǒng)

如果進程在 cgroup 中運行(如 Docker 容器、systemd 服務),可以通過 cgroup 文件系統(tǒng)查看資源使用:

# 查找進程的 cgroup 路徑
cat /proc/PID/cgroup

# 查看 CPU 使用(如果使用 CPU cgroup)
cat /sys/fs/cgroup/cpu/cgroup_name/cpuacct.usage
cat /sys/fs/cgroup/cpu/cgroup_name/cpu.stat

# 查看內存使用(如果使用 Memory cgroup)
cat /sys/fs/cgroup/memory/cgroup_name/memory.usage_in_bytes
cat /sys/fs/cgroup/memory/cgroup_name/memory.stat
cat /sys/fs/cgroup/memory/cgroup_name/memory.limit_in_bytes

# 查看 I/O 統(tǒng)計(如果使用 blkio cgroup)
cat /sys/fs/cgroup/blkio/cgroup_name/blkio.io_service_bytes
cat /sys/fs/cgroup/blkio/cgroup_name/blkio.io_serviced

# 查看進程數限制
cat /sys/fs/cgroup/pids/cgroup_name/pids.current
cat /sys/fs/cgroup/pids/cgroup_name/pids.max

Cgroup v2 文件系統(tǒng)

現(xiàn)代 Linux 系統(tǒng)使用 cgroup v2:

# 查找進程的 cgroup 路徑
cat /proc/PID/cgroup

# 查看資源統(tǒng)計(統(tǒng)一接口)
cat /sys/fs/cgroup/cgroup_name/cpu.stat
cat /sys/fs/cgroup/cgroup_name/memory.current
cat /sys/fs/cgroup/cgroup_name/memory.stat
cat /sys/fs/cgroup/cgroup_name/io.stat

# 查看資源限制
cat /sys/fs/cgroup/cgroup_name/memory.max
cat /sys/fs/cgroup/cgroup_name/cpu.max

systemd 服務資源監(jiān)控

# 查看服務的資源使用
systemd-cgtop

# 查看特定服務的統(tǒng)計
systemctl status service-name
systemd-cgtop /system.slice/service-name.service

# 查看服務資源限制配置
systemctl show service-name | grep -i limit

Docker 容器資源監(jiān)控

# 查看容器的資源使用
docker stats container_name

# 查看容器的詳細資源統(tǒng)計
docker stats --no-stream container_name

# 查看容器的 cgroup 信息
docker inspect container_name | grep -i cgroup

# 進入容器查看
docker exec container_name cat /proc/self/cgroup

高級監(jiān)控工具

bpftrace(動態(tài)追蹤)

安裝:

# Ubuntu 20.04+
sudo apt-get install bpftrace

# 或從源碼編譯

基本用法:

# 實時監(jiān)控 CPU 使用(按用戶態(tài)堆棧)
bpftrace -e 'profile:hz:99 /pid == PID/ { @[ustack] = count(); }'

# 監(jiān)控系統(tǒng)調用
bpftrace -e 'tracepoint:syscalls:sys_enter_* /pid == PID/ { @[probe] = count(); }'

# 監(jiān)控 I/O 操作
bpftrace -e 'tracepoint:block:block_rq_issue /pid == PID/ { @[comm] = count(); }'

# 監(jiān)控內存分配
bpftrace -e 'uprobe:/lib/x86_64-linux-gnu/libc.so.6:malloc /pid == PID/ { @[ustack] = count(); }'

perf(性能分析)

安裝:

# Ubuntu/Debian
sudo apt-get install linux-perf

# CentOS/RHEL
sudo yum install perf

基本用法:

# 實時查看熱點函數
perf top -p PID

# 記錄性能數據
perf record -p PID -g sleep 10

# 查看報告
perf report

# 統(tǒng)計系統(tǒng)調用
perf stat -p PID sleep 5

# 追蹤特定事件
perf trace -p PID

strace(系統(tǒng)調用追蹤)

基本用法:

# 追蹤系統(tǒng)調用并統(tǒng)計
strace -cp PID

# 追蹤特定系統(tǒng)調用
strace -e trace=open,read,write -p PID

# 顯示時間戳
strace -t -p PID

# 統(tǒng)計系統(tǒng)調用耗時
strace -c -p PID

關鍵指標說明

指標對照表

指標命令/文件說明正常范圍參考
CPU 使用ps -o %cpu進程占用 CPU 百分比0-100%
內存使用ps -o %mem,rss,vsz%mem=物理內存百分比,rss=實際物理內存(KB),vsz=虛擬內存大小(KB)根據系統(tǒng)內存調整
線程數ls /proc/PID/task任務目錄數量即為線程數根據應用類型
I/O 讀取/proc/PID/ioread_bytes 顯示實際磁盤讀取根據應用需求
I/O 寫入/proc/PID/iowrite_bytes 顯示實際磁盤寫入根據應用需求
上下文切換/proc/PID/statusvoluntary_ctxt_switches/nonvoluntary_ctxt_switches過高可能存在問題
運行時間ps -o etime進程已運行時間 (格式: [[DD-]hh:]mm:ss)-
文件描述符ls /proc/PID/fd打開的文件描述符數量注意是否有泄漏

內存相關指標詳解

  • VIRT (Virtual Memory Size): 進程使用的虛擬內存總量,包括代碼、數據、共享庫等
  • RES (Resident Set Size): 進程實際使用的物理內存,不包括交換分區(qū)
  • SHR (Shared Memory): 共享內存大小,可能被多個進程共享
  • %MEM: RES 占系統(tǒng)總物理內存的百分比

CPU 相關指標詳解

  • %CPU: 進程在采樣周期內的 CPU 使用百分比,可能超過 100%(多核系統(tǒng))
  • 用戶態(tài)時間: 進程在用戶空間執(zhí)行的時間
  • 內核態(tài)時間: 進程在內核空間執(zhí)行的時間(系統(tǒng)調用)

常見問題排查

1. CPU 使用率過高

診斷步驟:

# 查看 CPU 熱點函數
perf top -p PID

# 統(tǒng)計系統(tǒng)調用
strace -cp PID

# 查看線程 CPU 使用
top -H -p PID

# 使用 bpftrace 追蹤
bpftrace -e 'profile:hz:99 /pid == PID/ { @[ustack] = count(); }'

可能原因:

  • 無限循環(huán)或死循環(huán)
  • 頻繁的系統(tǒng)調用
  • 計算密集型任務
  • 鎖競爭導致的忙等待

2. 內存使用過高

診斷步驟:

# 查看詳細內存映射
pmap -x PID

# 查看內存使用趨勢
watch -n 1 'ps -p PID -o pid,%mem,rss,vsz'

# 使用 gdb 查看內存區(qū)域
gdb -p PID -ex "info proc mappings" --batch

# 檢查內存泄漏(需要持續(xù)監(jiān)控)
valgrind --leak-check=full ./program

可能原因:

  • 內存泄漏
  • 緩存過大
  • 數據結構設計不合理
  • 內存碎片

3. I/O 瓶頸

診斷步驟:

# 實時監(jiān)控 I/O
iotop -p PID

# 查看 I/O 統(tǒng)計
cat /proc/PID/io

# 使用 SystemTap 追蹤文件操作(需要 root)
stap -e 'probe vfs.* { if (pid() == PID) printf("%s\n", pp()) }'

# 查看磁盤使用情況
iostat -x 1

可能原因:

  • 頻繁的小文件讀寫
  • 未使用緩沖
  • 磁盤性能瓶頸
  • 網絡 I/O 延遲

4. 線程/進程過多

診斷步驟:

# 查看線程數量
ls /proc/PID/task | wc -l

# 查看線程詳情
ps -T -p PID

# 查看進程樹
pstree -p PID

5. 文件描述符泄漏

診斷步驟:

# 監(jiān)控文件描述符數量
watch -n 1 'ls /proc/PID/fd | wc -l'

# 查看打開的文件
lsof -p PID

# 查看具體文件類型分布
ls -l /proc/PID/fd | awk '{print $NF}' | xargs -I {} readlink {} | sort | uniq -c

自動化監(jiān)控腳本

綜合監(jiān)控腳本

創(chuàng)建一個綜合監(jiān)控腳本,定期采集進程的各項資源指標:

#!/bin/bash

# 進程資源監(jiān)控腳本
# 用法: ./monitor_process.sh <PID> [interval] [count]

if [ -z "$1" ]; then
  echo "用法: $0 <PID> [刷新間隔(秒)] [監(jiān)控次數]"
  echo "示例: $0 12345 2 10"
  exit 1
fi

PID=$1
INTERVAL=${2:-2}
COUNT=${3:-5}

# 檢查進程是否存在
if ! kill -0 $PID 2>/dev/null; then
  echo "錯誤: 進程 $PID 不存在"
  exit 1
fi

echo "===== 進程 $PID 資源監(jiān)控 (每 ${INTERVAL} 秒刷新,共 ${COUNT} 次) ====="
echo ""

for i in $(seq 1 $COUNT); do
  echo "--- 第 $i 次監(jiān)控 ($(date '+%Y-%m-%d %H:%M:%S')) ---"
  
  # 基本信息
  echo "【基本信息】"
  ps -p $PID -o user,pid,ppid,ni,%cpu,%mem,vsz,rss,tty,stat,start,time,cmd --no-headers 2>/dev/null || echo "進程已結束"
  
  # CPU 使用
  if [ -f /proc/$PID/stat ]; then
    echo -e "\n【CPU 使用】"
    cat /proc/$PID/stat | awk '{
      utime = $14
      stime = $15
      cutime = $16
      cstime = $17
      total = utime + stime + cutime + cstime
      printf "用戶態(tài)CPU: %d 時鐘周期\n", utime
      printf "內核態(tài)CPU: %d 時鐘周期\n", stime
      printf "子進程用戶態(tài): %d 時鐘周期\n", cutime
      printf "子進程內核態(tài): %d 時鐘周期\n", cstime
      printf "總CPU時間: %d 時鐘周期\n", total
    }'
  fi
  
  # 內存使用
  if [ -f /proc/$PID/status ]; then
    echo -e "\n【內存使用】"
    grep -E 'VmPeak|VmSize|VmRSS|VmSwap|VmHWM|VmData|VmStk|VmExe' /proc/$PID/status
  fi
  
  # I/O 統(tǒng)計
  if [ -f /proc/$PID/io ]; then
    echo -e "\n【I/O 統(tǒng)計】"
    cat /proc/$PID/io
  fi
  
  # 打開文件描述符
  if [ -d /proc/$PID/fd ]; then
    echo -e "\n【打開文件描述符數量】"
    echo "$(ls -l /proc/$PID/fd 2>/dev/null | wc -l) 個"
  fi
  
  # 線程數
  if [ -d /proc/$PID/task ]; then
    echo -e "\n【線程數】"
    echo "$(ls /proc/$PID/task 2>/dev/null | wc -l) 個"
  fi
  
  # 上下文切換
  if [ -f /proc/$PID/status ]; then
    echo -e "\n【上下文切換】"
    grep -E 'voluntary_ctxt_switches|nonvoluntary_ctxt_switches' /proc/$PID/status
  fi
  
  echo ""
  echo "=========================================="
  echo ""
  
  if [ $i -lt $COUNT ]; then
    sleep $INTERVAL
  fi
done

echo "監(jiān)控完成"

保存監(jiān)控數據腳本

#!/bin/bash

# 將監(jiān)控數據保存到文件
# 用法: ./save_monitor.sh <PID> <output_file> [interval]

PID=$1
OUTPUT=${2:-"monitor_${PID}_$(date +%Y%m%d_%H%M%S).log"}
INTERVAL=${3:-5}

echo "開始監(jiān)控進程 $PID,數據保存到 $OUTPUT"
echo "監(jiān)控間隔: ${INTERVAL} 秒,按 Ctrl+C 停止"

while true; do
  TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
  
  # 檢查進程是否存在
  if ! kill -0 $PID 2>/dev/null; then
    echo "[$TIMESTAMP] 進程已結束" >> "$OUTPUT"
    break
  fi
  
  # 采集數據
  {
    echo "===== $TIMESTAMP ====="
    ps -p $PID -o pid,%cpu,%mem,vsz,rss,cmd --no-headers
    [ -f /proc/$PID/status ] && grep -E 'VmRSS|VmSize' /proc/$PID/status
    [ -f /proc/$PID/io ] && cat /proc/$PID/io
    echo ""
  } >> "$OUTPUT"
  
  sleep $INTERVAL
done

echo "監(jiān)控數據已保存到 $OUTPUT"

工具選擇建議

根據不同場景選擇合適的工具:

場景推薦工具說明
快速查看ps簡單快速,適合腳本集成
實時監(jiān)控htop 或 top交互式界面,適合手動監(jiān)控
詳細統(tǒng)計pidstat適合定期采樣和數據分析
歷史數據sar查看歷史性能數據,適合趨勢分析
I/O 分析iotop專門用于 I/O 監(jiān)控
內存分析pmap、smempmap 查看內存映射,smem 提供更準確的內存統(tǒng)計
網絡連接ss、lsofss 更現(xiàn)代快速,lsof 功能更全面
文件描述符lsof查看進程打開的文件和網絡連接
綜合監(jiān)控atop功能全面,適合系統(tǒng)管理員
性能分析perf 或 bpftrace適合深度性能調優(yōu)
系統(tǒng)調用strace追蹤和統(tǒng)計系統(tǒng)調用
資源限制prlimit查看和設置進程資源限制
CPU 親和性taskset、numactl查看和設置 CPU 綁定和 NUMA
容器監(jiān)控docker stats、cgroup監(jiān)控容器資源使用
systemd 服務systemd-cgtop監(jiān)控 systemd 管理的服務
自動化/proc 文件系統(tǒng)適合腳本和自動化工具
問題排查strace + perf + pmap綜合工具定位性能問題

總結:分析 Linux 進程資源占用有多種方法,選擇合適的工具可以事半功倍:

常用方法分類

日常監(jiān)控

  • 實時監(jiān)控:htop、top、atop
  • 快照查看:ps、pidstat
  • 歷史數據:sar(需啟用 sysstat 數據收集)

專項分析

  • 內存pmap(內存映射)、smem(準確統(tǒng)計)、/proc/PID/smaps(詳細映射)
  • I/Oiotoppidstat -d、/proc/PID/io
  • 網絡ss、lsof -i、netstat
  • 文件lsof、/proc/PID/fd

腳本集成

  • /proc 文件系統(tǒng):最底層的信息源,適合自動化
  • ps 命令:簡單快速,輸出格式統(tǒng)一
  • pidstat:適合定期采樣

性能分析

  • perf:功能強大的性能分析工具
  • bpftrace:動態(tài)追蹤,靈活強大
  • strace:系統(tǒng)調用追蹤

容器和服務監(jiān)控

  • Docker:docker stats、cgroup 文件系統(tǒng)
  • systemd:systemd-cgtopsystemctl status
  • Cgroup:/sys/fs/cgroup/ 文件系統(tǒng)

系統(tǒng)級監(jiān)控

  • vmstat:系統(tǒng)整體資源統(tǒng)計
  • sar:歷史性能數據
  • slabtop:內核緩存監(jiān)控

關鍵指標

  • CPU: %cpu、用戶態(tài)/內核態(tài)時間、CPU 親和性
  • 內存: RSS(物理內存)、VSZ(虛擬內存)、PSS(比例集大?。?、內存映射
  • I/O: read_bytes、write_bytes、I/O 速率
  • 網絡: 連接數、連接狀態(tài)、端口占用
  • 其他: 線程數、文件描述符數、上下文切換次數、資源限制

最佳實踐

  1. 定期監(jiān)控:建立監(jiān)控機制,定期采集關鍵指標
  2. 建立基線:記錄正常情況下的資源使用,便于對比
  3. 組合使用:根據問題類型組合使用多個工具
  4. 自動化:使用腳本自動化監(jiān)控和告警
  5. 歷史數據:啟用 sar 數據收集,便于問題回溯
  6. 容器環(huán)境:在容器環(huán)境中使用 cgroup 相關工具

問題排查流程

  1. 快速定位:使用 htoptop 快速查看資源占用
  2. 詳細分析:使用 pidstat、pmap 等工具深入分析
  3. 性能分析:使用 perf、strace 定位性能瓶頸
  4. 歷史對比:使用 sar 查看歷史數據,分析趨勢
  5. 綜合診斷:結合多個工具的結果,全面分析問題

定期監(jiān)控和記錄這些指標,有助于及時發(fā)現(xiàn)和解決性能問題。根據具體場景選擇合適的工具組合,可以更高效地完成資源分析和問題排查。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論

界首市| 通榆县| 玛沁县| 和田市| 仪征市| 石首市| 交城县| 瑞安市| 神木县| 平江县| 当涂县| 来安县| 普格县| 文化| 治多县| 咸丰县| 湘潭县| 吐鲁番市| 泰宁县| 沧源| 南召县| 南召县| 永胜县| 宜川县| 屯留县| 丁青县| 唐山市| 定远县| 大名县| 高台县| 西充县| 临澧县| 嘉荫县| 湖南省| 抚顺县| 叶城县| 博野县| 潮州市| 休宁县| 镇坪县| 淮滨县|