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

Linux進(jìn)程資源占用詳解

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

Linux進(jìn)程資源占用分析指南

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

快速開始

前提條件

已知進(jìn)程 ID (PID)

獲取 PID 的方法:

# 通過進(jìn)程名查找
pgrep process_name
ps aux | grep process_name

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

命令行工具

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

基本用法:

top -p PID

交互式操作:

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

輸出說明:

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

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

基本用法:

htop -p PID

功能特點(diǎn):

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

快捷鍵:

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

3.ps命令(快照查看)

基本資源查看:

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

詳細(xì)資源報(bào)告:

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

字段說明:

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

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

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

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

安裝:

# Ubuntu/Debian
sudo apt-get install sysstat

# CentOS/RHEL
sudo yum install sysstat

基本用法:

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

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

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

# 內(nèi)存頁錯(cuò)誤統(tǒng)計(jì)
pidstat -r -p PID

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

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

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

輸出指標(biāo):

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

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

安裝:

# Ubuntu/Debian
sudo apt-get install atop

# CentOS/RHEL
sudo yum install atop

基本用法:

atop -p PID

功能亮點(diǎn):

  • 顯示磁盤負(fù)載詳情
  • 網(wǎng)絡(luò)帶寬使用統(tǒng)計(jì)
  • 進(jìn)程級(jí) GPU 使用(需插件支持)
  • 歷史資源記錄(按 t 切換時(shí)間點(diǎn))
  • 支持記錄和回放

快捷鍵:

  • t - 切換時(shí)間點(diǎn)
  • m - 顯示內(nèi)存信息
  • d - 顯示磁盤信息
  • n - 顯示網(wǎng)絡(luò)信息
  • q - 退出

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

安裝:

# Ubuntu/Debian
sudo apt-get install nmon

# CentOS/RHEL
sudo yum install nmon

基本用法:

nmon -p PID

交互式界面:

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

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

安裝:

# Ubuntu/Debian
sudo apt-get install iotop

# CentOS/RHEL
sudo yum install iotop

基本用法:

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

# 顯示累計(jì) I/O
iotop -a -p PID

輸出說明:

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

8.lsof(列出打開文件)

基本用法:

# 查看進(jìn)程打開的所有文件
lsof -p PID

# 查看進(jìn)程打開的網(wǎng)絡(luò)連接
lsof -p PID -i

# 查看進(jìn)程打開的文件描述符數(shù)量
lsof -p PID | wc -l

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

# 查看進(jìn)程的端口占用
lsof -p PID -iTCP -sTCP:LISTEN

# 查看進(jìn)程的工作目錄
lsof -p PID | grep cwd

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

字段說明:

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

9.sar(系統(tǒng)活動(dòng)報(bào)告)

安裝:

# Ubuntu/Debian
sudo apt-get install sysstat

# CentOS/RHEL
sudo yum install sysstat

基本用法:

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

# 查看內(nèi)存使用
sar -r 1 5

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

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

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

# 生成綜合報(bào)告
sar -A > sar_report.txt

優(yōu)勢(shì):

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

10.vmstat(虛擬內(nèi)存統(tǒng)計(jì))

基本用法:

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

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

# 顯示詳細(xì)的內(nèi)存統(tǒng)計(jì)
vmstat -s

輸出說明:

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

11.pmap(內(nèi)存映射查看)

基本用法:

# 查看進(jìn)程的內(nèi)存映射
pmap -x PID

# 顯示詳細(xì)信息
pmap -XX PID

# 顯示設(shè)備格式
pmap -d PID

# 顯示擴(kuò)展格式
pmap -X PID

# 查看內(nèi)存映射摘要
pmap -q PID

輸出說明:

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

用途:

  • 分析內(nèi)存占用分布
  • 查找內(nèi)存泄漏
  • 查看共享庫占用

12.smem(內(nèi)存使用統(tǒng)計(jì))

安裝:

# Ubuntu/Debian
sudo apt-get install smem

# CentOS/RHEL
sudo yum install smem

基本用法:

# 查看進(jìn)程內(nèi)存使用(按 PSS 排序)
smem -P process_name

# 查看指定 PID 的內(nèi)存使用
smem -p PID

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

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

# 生成報(bào)告
smem -t -k -P process_name -c "pid user command pss rss"

優(yōu)勢(shì):

  • PSS (Proportional Set Size): 更準(zhǔn)確的內(nèi)存統(tǒng)計(jì),考慮了共享內(nèi)存
  • USS (Unique Set Size): 進(jìn)程獨(dú)占的內(nèi)存
  • RSS (Resident Set Size): 實(shí)際物理內(nèi)存

13.ss(現(xiàn)代網(wǎng)絡(luò)連接工具)

基本用法:

# 查看進(jìn)程的網(wǎng)絡(luò)連接
ss -tulpn | grep PID

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

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

# 顯示詳細(xì)信息
ss -tulnap | grep PID

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

# 統(tǒng)計(jì)連接數(shù)
ss -s

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

  • 更快速
  • 顯示更多信息
  • 更好的過濾選項(xiàng)

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

基本用法:

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

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

# 查看進(jìn)程運(yùn)行時(shí)間
time -p sleep 5

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

輸出說明:

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

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

基本用法:

# 查看進(jìn)程的 CPU 親和性
taskset -p PID

# 查看進(jìn)程的 NUMA 節(jié)點(diǎn)
numactl --show

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

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

用途:

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

16.prlimit(資源限制查看)

基本用法:

# 查看進(jìn)程的資源限制
prlimit --pid=PID

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

常用資源限制:

  • AS - 虛擬內(nèi)存大小
  • RSS - 物理內(nèi)存大小
  • NOFILE - 文件描述符數(shù)量
  • CPU - CPU 時(shí)間(秒)
  • NPROC - 進(jìn)程數(shù)限制

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

基本用法:

# 查看 systemd 管理的進(jìn)程組資源使用
systemd-cgtop

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

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

適用場(chǎng)景:

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

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

基本用法:

# 實(shí)時(shí)查看內(nèi)核 slab 緩存使用
slabtop

# 按使用量排序
slabtop -s c

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

用途:

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

系統(tǒng)文件分析

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

/proc/PID/ 目錄提供了進(jìn)程的詳細(xì)底層信息。

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

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

# 字段說明:
# VmPeak  - 虛擬內(nèi)存峰值(KB)
# VmSize  - 當(dāng)前虛擬內(nèi)存大?。↘B)
# VmRSS   - 實(shí)際物理內(nèi)存使用(KB)
# VmSwap  - 交換分區(qū)使用(KB)
# VmHWM   - 物理內(nèi)存峰值(KB)
# VmData  - 數(shù)據(jù)段大?。↘B)
# VmStk   - 棧大?。↘B)
# VmExe   - 可執(zhí)行文件大?。↘B)
打開文件描述符
# 查看打開的文件描述符數(shù)量
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)計(jì)
# 查看 I/O 統(tǒng)計(jì)信息
cat /proc/PID/io

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

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

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

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

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

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

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

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

# 查看內(nèi)存映射摘要
cat /proc/PID/smaps

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

# 查看子進(jìn)程
ps --ppid PID

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

Cgroup 資源監(jiān)控

Cgroup v1 文件系統(tǒng)

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

# 查找進(jìn)程的 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

# 查看內(nèi)存使用(如果使用 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)計(jì)(如果使用 blkio cgroup)
cat /sys/fs/cgroup/blkio/cgroup_name/blkio.io_service_bytes
cat /sys/fs/cgroup/blkio/cgroup_name/blkio.io_serviced

# 查看進(jìn)程數(shù)限制
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:

# 查找進(jìn)程的 cgroup 路徑
cat /proc/PID/cgroup

# 查看資源統(tǒng)計(jì)(統(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 服務(wù)資源監(jiān)控

# 查看服務(wù)的資源使用
systemd-cgtop

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

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

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

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

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

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

# 進(jìn)入容器查看
docker exec container_name cat /proc/self/cgroup

高級(jí)監(jiān)控工具

bpftrace(動(dòng)態(tài)追蹤)

安裝:

# Ubuntu 20.04+
sudo apt-get install bpftrace

# 或從源碼編譯

基本用法:

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

# 監(jiān)控系統(tǒng)調(diào)用
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)控內(nèi)存分配
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

基本用法:

# 實(shí)時(shí)查看熱點(diǎn)函數(shù)
perf top -p PID

# 記錄性能數(shù)據(jù)
perf record -p PID -g sleep 10

# 查看報(bào)告
perf report

# 統(tǒng)計(jì)系統(tǒng)調(diào)用
perf stat -p PID sleep 5

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

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

基本用法:

# 追蹤系統(tǒng)調(diào)用并統(tǒng)計(jì)
strace -cp PID

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

# 顯示時(shí)間戳
strace -t -p PID

# 統(tǒng)計(jì)系統(tǒng)調(diào)用耗時(shí)
strace -c -p PID

關(guān)鍵指標(biāo)說明

指標(biāo)對(duì)照表

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

內(nèi)存相關(guān)指標(biāo)詳解

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

CPU 相關(guān)指標(biāo)詳解

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

常見問題排查

1. CPU 使用率過高

診斷步驟:

# 查看 CPU 熱點(diǎn)函數(shù)
perf top -p PID

# 統(tǒng)計(jì)系統(tǒng)調(diào)用
strace -cp PID

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

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

可能原因:

  • 無限循環(huán)或死循環(huán)
  • 頻繁的系統(tǒng)調(diào)用
  • 計(jì)算密集型任務(wù)
  • 鎖競(jìng)爭(zhēng)導(dǎo)致的忙等待

2. 內(nèi)存使用過高

診斷步驟:

# 查看詳細(xì)內(nèi)存映射
pmap -x PID

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

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

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

可能原因:

  • 內(nèi)存泄漏
  • 緩存過大
  • 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)不合理
  • 內(nèi)存碎片

3. I/O 瓶頸

診斷步驟:

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

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

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

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

可能原因:

  • 頻繁的小文件讀寫
  • 未使用緩沖
  • 磁盤性能瓶頸
  • 網(wǎng)絡(luò) I/O 延遲

4. 線程/進(jìn)程過多

診斷步驟:

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

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

# 查看進(jìn)程樹
pstree -p PID

5. 文件描述符泄漏

診斷步驟:

# 監(jiān)控文件描述符數(shù)量
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

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

綜合監(jiān)控腳本

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

#!/bin/bash

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

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

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

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

echo "===== 進(jìn)程 $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 "進(jìn)程已結(jié)束"
  
  # 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 時(shí)鐘周期\n", utime
      printf "內(nèi)核態(tài)CPU: %d 時(shí)鐘周期\n", stime
      printf "子進(jìn)程用戶態(tài): %d 時(shí)鐘周期\n", cutime
      printf "子進(jìn)程內(nèi)核態(tài): %d 時(shí)鐘周期\n", cstime
      printf "總CPU時(shí)間: %d 時(shí)鐘周期\n", total
    }'
  fi
  
  # 內(nèi)存使用
  if [ -f /proc/$PID/status ]; then
    echo -e "\n【內(nèi)存使用】"
    grep -E 'VmPeak|VmSize|VmRSS|VmSwap|VmHWM|VmData|VmStk|VmExe' /proc/$PID/status
  fi
  
  # I/O 統(tǒng)計(jì)
  if [ -f /proc/$PID/io ]; then
    echo -e "\n【I/O 統(tǒng)計(jì)】"
    cat /proc/$PID/io
  fi
  
  # 打開文件描述符
  if [ -d /proc/$PID/fd ]; then
    echo -e "\n【打開文件描述符數(shù)量】"
    echo "$(ls -l /proc/$PID/fd 2>/dev/null | wc -l) 個(gè)"
  fi
  
  # 線程數(shù)
  if [ -d /proc/$PID/task ]; then
    echo -e "\n【線程數(shù)】"
    echo "$(ls /proc/$PID/task 2>/dev/null | wc -l) 個(gè)"
  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)控?cái)?shù)據(jù)腳本

#!/bin/bash

# 將監(jiān)控?cái)?shù)據(jù)保存到文件
# 用法: ./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)控進(jìn)程 $PID,數(shù)據(jù)保存到 $OUTPUT"
echo "監(jiān)控間隔: ${INTERVAL} 秒,按 Ctrl+C 停止"

while true; do
  TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
  
  # 檢查進(jìn)程是否存在
  if ! kill -0 $PID 2>/dev/null; then
    echo "[$TIMESTAMP] 進(jìn)程已結(jié)束" >> "$OUTPUT"
    break
  fi
  
  # 采集數(shù)據(jù)
  {
    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)控?cái)?shù)據(jù)已保存到 $OUTPUT"

工具選擇建議

根據(jù)不同場(chǎng)景選擇合適的工具:

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

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

常用方法分類

日常監(jiān)控

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

專項(xiàng)分析

  • 內(nèi)存pmap(內(nèi)存映射)、smem(準(zhǔn)確統(tǒng)計(jì))、/proc/PID/smaps(詳細(xì)映射)
  • I/Oiotop、pidstat -d、/proc/PID/io
  • 網(wǎng)絡(luò)sslsof -i、netstat
  • 文件lsof/proc/PID/fd

腳本集成

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

性能分析

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

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

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

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

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

關(guān)鍵指標(biāo)

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

最佳實(shí)踐

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

問題排查流程

  1. 快速定位:使用 htoptop 快速查看資源占用
  2. 詳細(xì)分析:使用 pidstatpmap 等工具深入分析
  3. 性能分析:使用 perf、strace 定位性能瓶頸
  4. 歷史對(duì)比:使用 sar 查看歷史數(shù)據(jù),分析趨勢(shì)
  5. 綜合診斷:結(jié)合多個(gè)工具的結(jié)果,全面分析問題

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

班戈县| 雷波县| 遂川县| 前郭尔| 芒康县| 健康| 宁明县| 黄龙县| 工布江达县| 淮南市| 新干县| 县级市| 博兴县| 如东县| 肇庆市| 伽师县| 杭州市| 醴陵市| 铜川市| 河北区| 绥滨县| 原阳县| 桂林市| 孟村| 济阳县| 城口县| 富平县| 锡林郭勒盟| 会同县| 湘乡市| 中阳县| 即墨市| 宁蒗| 陈巴尔虎旗| 武冈市| 昆明市| 青阳县| 阿拉善右旗| 盐池县| 澄城县| 渭源县|