在Linux系统管理和性能优化中,进程监控是核心技能之一。本文将深入探讨从基础的ps命令到高级的pidstat工具,全面解析进程监控的进阶技巧和实战应用。
## 基础进程监控命令深度解析
### ps命令的进阶用法
ps命令是进程监控的基础,但多数用户只了解其表面功能。
```bash
# 查看完整的进程树结构
ps -ef --forest
# 显示进程的线程信息
ps -eLf
# 按内存使用排序
ps aux --sort=-%mem | head -10
# 按CPU使用排序
ps aux --sort=-%cpu | head -10
# 显示特定用户的进程
ps -u www-data -o pid,ppid,cmd,%mem,%cpu --sort=-%cpu
# 自定义输出格式
ps -eo pid,ppid,user,pmem,pcpu,psr,comm --sort=-pcpu | head -15
```
### 实时进程监控脚本
创建自定义的实时监控脚本,超越top命令的基础功能。
```bash
#!/bin/bash
# advanced_process_monitor.sh
INTERVAL=2
MAX_LINES=20
echo "实时进程监控 - 刷新间隔: ${INTERVAL}秒"
echo "按 Ctrl+C 退出"
echo
while true; do
clear
# 显示系统概览
echo "=== 系统概览 ==="
uptime
echo "内存: <"video.maicaixia.cn">$(free -h | awk 'NR==2{print $3"/"$2}')"
echo "负载: $(cat /proc/loadavg)"
echo
# 显示CPU使用前10的进程
echo "=== CPU使用TOP10 ==="
ps -eo pid,ppid,user,%cpu,%mem,comm --sort=-%cpu | head -11
echo
# 显示内存使用前10的进程
echo "=== 内存使用TOP10 ==="
ps -eo pid,ppid,user,%mem,%cpu,comm --sort=-%mem | head -11
echo
# 显示I/O等待进程
echo "=== I/O等待进程 ==="
ps -eo pid,user,comm,state --sort=-pid | grep -E "(D|UNINTERRUPTIBLE)" | head -5
sleep $INTERVAL
done
```
## 高级进程监控工具
### pidstat全面解析
pidstat是sysstat工具包的一部分,提供详细的进程级统计信息。
```bash
# 安装sysstat
# Ubuntu/Debian: sudo apt-get install sysstat
# CentOS/RHEL: sudo yum install sysstat
# 基本用法:每2秒采样一次,共5次
pidstat 2 5
# 监控特定进程
pidstat -p 1234 2 5
# 详细的CPU统计
pidstat -u 1 5
# 内存使用统计
pidstat -r 1 5
# I/O统计
pidstat -d 1 5
# 上下文切换统计
pidstat -w 1 5
# 综合监控:CPU、内存、IO
pidstat -urd 1 5
# 按命令名监控所有同名进程
pidstat -C nginx 1 3
```
### pidstat高级监控脚本
```bash
#!/bin/bash
# comprehensive_pidstat_monitor.sh
MONITOR_PID=${1}
INTERVAL=2
COUNT=30
if [ -z "$MONITOR_PID" ]<"ml0odf9.maicaixia.cn">; then
echo "用法: $0 <PID>"
echo "示例: $0 1234"
exit 1
fi
echo "开始监控进程 $MONITOR_PID,间隔 ${INTERVAL}秒,共 ${COUNT} 次采样"
echo "时间戳 | CPU% | 内存% | 读KB/s | 写KB/s | 线程数 | 主要线程状态"
echo "----------------------------------------------------------------"
# 综合监控循环
pidstat -p $MONITOR_PID -urd -h $INTERVAL $COUNT | \
awk -v pid=$MONITOR_PID '
NR>3 {
if ($3 == pid) {
timestamp = $1 " " $2
cpu = $7
mem = $8
kbrd = $9
kbwr = $10
threads = "N/A"
state = "N/A"
# 获取线程信息
"ps -L -p " pid " -o state | grep -v STATE | head -5" | getline thread_states
close("ps -L -p " pid " -o state | grep -v STATE | head -5")
if (thread_states != "") {
state = thread_states
}
printf "%-15s | %5s | %5s | %7s | %7s | %7s | %s\n",
timestamp, cpu, mem, kbrd, kbwr, threads, state
}
}'
```
## 进程性能深度分析
### 线程级监控
现代应用多为多线程,需要线程级别的监控。
```bash
# 查看进程的线程信息
ps -T -p <PID>
# 使用pidstat监控线程
pidstat -t -p <PID> 1 5
# 使用top监控特定进程的线程
top -H -p <PID>
# 自定义线程监控脚本
#!/bin/bash
# thread_monitor.sh
PID=$1
INTERVAL=2
if [ -z "$PID" ]; then
echo "请提供进程PID"
exit 1
fi
echo "监控进程 $PID 的线程,刷新间隔: ${INTERVAL}秒"
echo "按 Ctrl+C 退出"
echo
while true; do
clear
echo "=== 进程 $PID 线程状态 ==="
# 显示线程详情
ps -T -p $PID -o pid,tid,pcpu,pmem,state,comm
echo
echo "=== 线程CPU使用排名 ==="
ps -T -p $PID -o tid,pcpu <"flmnsvsqexff.maicaixia.cn">--sort=-pcpu | head -10
echo
echo "=== 线程状态统计 ==="
ps -T -p $PID -o state --no-headers | sort | uniq -c
sleep $INTERVAL
done
```
### 内存使用深度分析
```bash
# 查看进程详细内存映射
pmap -x <PID>
# 查看进程内存使用详情
cat /proc/<PID>/status | grep -E "(VmSize|VmRSS|VmData|VmStk|VmExe)"
# 内存监控脚本
#!/bin/bash
# memory_analysis.sh
PID=$1
if [ -z "$PID" ]; then
echo "请提供进程PID"
exit 1
fi
echo "=== 进程 $PID 内存分析 ==="
echo
# 基础内存信息
echo "1. 基础内存信息:"
ps -p $PID -o pid,ppid,comm,%mem,rss,vsz --no-headers
echo
echo "2. 详细内存状态:"
grep -E "(VmSize|VmRSS|VmData|VmStk|VmExe|VmPTE)" /proc/$PID/status
echo
echo "3. 内存映射:"
pmap -x $PID | tail -1
echo
echo "4. 内存使用趋势 (采样5次,间隔2秒):"
for i in {1..5}; do
RSS=$(ps -p $PID -o rss --no-headers)
VSZ=$(ps -p $PID -o vsz --no-headers)
echo "采样 $i: RSS=<"kltyzx.maicaixia.cn">${RSS}KB, VSZ=${VSZ}KB"
sleep 2
done
```
## 系统资源关联分析
### CPU与进程关联监控
```bash
# 监控每个CPU核心的使用情况
mpstat -P ALL 1 5
# 结合进程监控
#!/bin/bash
# cpu_core_analysis.sh
echo "=== CPU核心与进程关联分析 ==="
echo
# 显示CPU核心数
echo "CPU核心数: $(nproc)"
echo
# 监控各核心负载
echo "各CPU核心使用率:"
mpstat -P ALL 1 1 | grep -E "(CPU|all|[0-9]+)" | awk '{print "CPU" $2 ": " $3 "% 用户, " $4 "% 系统, " $5 "% 空闲"}'
echo
echo "=== 进程CPU亲和性 ==="
# 显示占用CPU最多的进程及其亲和性
ps -eo pid,ppid,comm,psr,pcpu --sort=-pcpu | head -10 | while read line; do
PID=$(echo $line | awk '{print $1}')
if [ "$PID" != "PID" ] && [ -n "$PID" ] && [ "$PID" -eq "$PID" ] 2>/dev/null; then
AFFINITY=$(taskset -cp $PID 2>/dev/null | awk -F': ' '{print $2}')
echo "$line | 亲和性: $AFFINITY"
fi
done
```
### I/O性能分析
```bash
# 系统级I/O监控
iostat -x 1 3
# 进程级I/O监控
pidstat -d 1 5
# 深入I/O监控脚本
#!/bin/bash
# io_analysis.sh
INTERVAL=2
COUNT=10
echo "=== 系统I/O监控 ==="
echo "采样间隔: ${INTERVAL}秒, 采样次数: ${COUNT}"
echo
# 系统级I/O统计
echo "1. 系统I/O统计:"
iostat -x $INTERVAL $COUNT | tail -$((COUNT+1))
echo
echo "2. 进程I/O排名:"
pidstat -dl 1 1 |<"baby.maicaixia.cn"> sort -k6 -nr | head -10
echo
echo "3. 块设备详细统计:"
cat /proc/diskstats | head -10
```
## 实战案例:性能问题诊断
### 高CPU使用诊断
```bash
#!/bin/bash
# high_cpu_diagnosis.sh
echo "=== 高CPU使用诊断 ==="
echo
# 找出CPU使用最高的进程
echo "1. CPU使用TOP5进程:"
ps -eo pid,ppid,user,pcpu,pmem,comm --sort=-pcpu | head -6
echo
echo "2. 这些进程的详细状态:"
ps -eo pid,ppid,user,pcpu,pmem,comm --sort=-pcpu | head -6 | tail -5 | while read line; do
PID=$(echo $line | awk '{print $1}')
if [ -n "$PID" ] && [ "$PID" -eq "$PID" ] 2>/dev/null; then
echo "进程 $PID 详情:"
# 显示进程状态
ps -p $PID -o state,psr --no-headers | awk '{print " 状态: "$1", 运行CPU: "$2}'
# 显示线程数
THREADS=$(ps -L -p $PID | wc -l)
echo " 线程数: $((THREADS-1))"
# 显示系统调用
echo " 最近系统调用:"
strace -c -p $PID 2>&1 | head -5 | tail -3
echo
fi
done
echo "3. 系统负载分析:"
echo " 运行队列长度: $(vmstat 1 2 | tail -1 | awk '{print $1}')"
echo " 上下文切换率: $(vmstat 1 2 | tail -1 | awk '{print $12}')/秒"
```
### 内存泄漏诊断
```bash
#!/bin/bash
# memory_leak_diagnosis.sh
echo "=== 内存泄漏诊断工具 ==="
echo
# 监控内存使用增长最快的进程
echo "1. 内存增长监控 (采样3次,间隔5秒):"
for i in {1..3}; do
echo "采样 $i:"
ps -eo pid,ppid,comm,rss <"inch.maicaixia.cn">--sort=-rss | head -10
echo "---"
sleep 5
done
echo
echo "2. 内存使用异常进程:"
ps -eo pid,ppid,comm,rss,vsz --sort=-rss | head -10 | while read line; do
PID=$(echo $line | awk '{print $1}')
RSS=$(echo $line | awk '{print $4}')
VSZ=$(echo $line | awk '{print $5}')
if [ "$PID" != "PID" ] && [ -n "$PID" ] && [ "$PID" -eq "$PID" ] 2>/dev/null; then
# 计算RSS/VSZ比率
if [ $VSZ -ne 0 ]; then
RATIO=$(( (RSS * 100) / VSZ ))
if [ $RATIO -gt 80 ]; then
echo "警告: 进程 $PID RSS/VSZ 比率过高: $RATIO%"
fi
fi
fi
done
echo
echo "3. 系统内存状态:"
free -h
echo
echo "4. 内存详细统计:"
cat /proc/meminfo | grep -E "(MemTotal|MemFree|MemAvailable|Buffers|Cached)"
```
## 自动化监控系统
### 进程监控守护脚本
```bash
#!/bin/bash
# process_monitor_daemon.sh
CONFIG_FILE="process_monitor.conf"
LOG_FILE="process_monitor.log"
ALERT_THRESHOLD_CPU=80
ALERT_THRESHOLD_MEM=70
# 读取配置
load_config() {
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_<"wall.maicaixia.cn">FILE"
fi
}
# 监控循环
monitor_loop() {
while true; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# 监控关键进程
ps -eo pid,ppid,user,%cpu,%mem,comm --sort=-%cpu | head -20 | while read line; do
PID=$(echo $line | awk '{print $1}')
CPU=$(echo $line | awk '{print $4}')
MEM=$(echo $line | awk '{print $5}')
COMM=$(echo $line | awk '{print $6}')
# 跳过标题行
if [ "$PID" = "PID" ] || [ -z "$PID" ]; then
continue
fi
# 检查阈值
if (( $(echo "$CPU > $ALERT_THRESHOLD_CPU" | bc -l) )); then
log_alert "HIGH_CPU" "$PID:$COMM" "$CPU%"
fi
if (( $(echo "$MEM > $ALERT_THRESHOLD_MEM" | bc -l) )); then
log_alert "HIGH_MEM" "$PID:$COMM" "$MEM%"
fi
done
sleep 30
done
}
# 日志记录
log_alert() {
local alert_type=$1
local target=$2
local value=$3
local message="[$TIMESTAMP] $alert_type - $target - $value"
echo "$message" >> "$LOG_FILE"
# 这里可以添加邮件、短信等告警方式
echo "ALERT: $message"
}
# 主函数
main() {
load_config
echo "启动进程监控守护进程..."
echo "CPU告警阈值: ${ALERT_THRESHOLD_CPU}%"
echo "内存告警阈值: ${ALERT_THRESHOLD_MEM}%"
echo "日志文件: $LOG_FILE"
monitor_loop
}
# 启动
main "$@"
```
### 性能报告生成
```bash
#!/bin/bash
# performance_report.sh
REPORT_FILE=<"xyz.maicaixia.cn">"performance_report_$(date +%Y%m%d_%H%M%S).txt"
generate_report() {
{
echo "=== 系统性能报告 ==="
echo "生成时间: $(date)"
echo
echo "=== 系统概览 ==="
uptime
echo "运行时间: $(uptime -p)"
echo
echo "=== 内存使用 ==="
free -h
echo
echo "=== CPU使用TOP10 ==="
ps -eo pid,ppid,user,%cpu,%mem,comm --sort=-%cpu | head -11
echo
echo "=== 内存使用TOP10 ==="
ps -eo pid,ppid,user,%mem,%cpu,comm --sort=-%mem | head -11
echo
echo "=== I/O统计 ==="
pidstat -dl 1 1 | head -20
echo
echo "=== 系统负载详情 ==="
mpstat -P ALL 1 1
echo
echo "=== 网络连接统计 ==="
netstat -s | head -20
} > "$REPORT_FILE"
echo "报告已生成: $REPORT_FILE"
}
# 生成报告
generate_report
```
## 最佳实践总结
### 监控策略建议
1. **分层监控**:从系统级到进程级再到线程级
2. **多维度采集**:CPU、内存、I/O、网络等全面监控
3. **趋势分析**:不仅关注瞬时值,更要分析变化趋势
4. **自动化告警**:设置合理的阈值和告警机制
### 常用命令组合
```bash
# 快速系统检查
quick_check() {
echo "CPU负载: $(uptime | awk -F'load average:' '{print $2}')"
echo "内存使用: $(free -h | awk 'NR==2{print $3"/"$2}')"
echo "磁盘使用: $(df -h / | awk 'NR==2{print $3"/"$2" ("$5")"}')"
echo "高CPU进程:"
ps -eo pid,comm,%cpu --sort=-%cpu | head -5
}
# 进程详情查询
process_detail() {
local pid=$1
echo "进程详情 PID: $pid"
echo "命令行: $(ps -p $pid -o comm --no-headers)"
echo "状态: $(ps -p $pid -o state --no-headers)"
echo "CPU: $(ps -p $pid -o %cpu --no-headers)%"
echo "内存: $(ps -p $pid -o %mem --no-headers)%"
echo "线程数: $(ps -L -p $pid | wc -l)"
}
```
通过掌握这些进阶的进程监控技巧,系统管理员可以更快速、更准确地诊断性能问题,优化系统资源使用,确保服务的稳定性和性能。从基础的ps命令到高级的pidstat工具,构建完整的进程监控体系是Linux系统管理的核心能力。