linux 查看性能瓶颈相关命令
2025/12/21大约 9 分钟
linux 查看性能瓶颈相关命令
核心概念
Linux 系统性能瓶颈通常包括 CPU、内存、磁盘 I/O、网络 四个关键方面。诊断性能问题需要使用不同的工具来监控和分析各项指标,找出系统的瓶颈所在。
性能诊断的三个层次:
- 概览型:快速了解整体系统状态(top、htop、dstat)
- 深度型:详细分析具体指标(vmstat、iostat、netstat)
- 专项型:针对特定问题的诊断(perf、strace、tcpdump)
CPU 性能分析
1. top 命令(实时 CPU/内存监控):
top
# 关键指标:
# %Cpu(s): us(用户) sy(系统) ni(优先级) id(空闲) wa(IO等待)
# 高 wa 值表示 CPU 在等待 IO,可能是磁盘瓶颈
# 高 us 值表示应用消耗 CPU,可能是计算密集型任务
# 按 CPU 使用率排序
top -o %CPU
# 监控特定进程
top -p PID2. vmstat(虚拟内存统计):
vmstat 2 5 # 每 2 秒采样 5 次
# 关键列:
# r: 运行队列长度(待运行的进程数)
# b: 阻塞队列长度(等待 IO 的进程数)
# us, sy, id, wa: CPU 时间分配
# 高 r 值表示 CPU 竞争激烈,高 b 值表示磁盘 IO 瓶颈
# 例:vmstat 1
# procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
# r b swpd free buff cache si so bi bo in cs us sy id wa
# 2 0 0 8000000 100000 2000000 0 0 100 50 200 150 30 10 50 103. iostat(磁盘 I/O 分析):
iostat -x 2 5 # 详细模式,每 2 秒采样 5 次
# 关键指标:
# r/s, w/s: 每秒读写 IO 次数
# rkB/s, wkB/s: 每秒读写吞吐量
# %util: 磁盘使用率(> 80% 表示接近饱和)
# await: 平均 IO 等待时间(高值表示磁盘响应慢)
iostat -d 2 5 # 只显示磁盘统计
iostat -p sda 2 5 # 监控特定磁盘4. sar(系统活动记录):
# CPU 统计(最近 24 小时)
sar -u 1 5
# 内存统计
sar -r 1 5
# 磁盘 IO 统计
sar -d 1 5
# 网络统计
sar -n DEV 1 5 # 网络接口
sar -n TCP 1 5 # TCP 统计内存性能分析
1. free 命令(内存快照):
free -h # 以人类易读格式显示
# 输出示例:
# total used free shared buff/cache available
# Mem: 16Gi 8Gi 2Gi 100Mi 5Gi 7Gi
# Swap: 8Gi 1Gi 7Gi
# 关键概念:
# available = free + buff/cache(实际可用内存)
# 内存压力 = (used - buff/cache) / total > 90% 表示压力高2. ps 和 pmap(进程内存):
# 按内存使用排序
ps aux --sort=-%mem | head -10
# 查看进程详细内存
pmap -x PID
# 统计所有进程内存
ps aux | awk '{sum+=$6} END {print sum/1024 "MB"}'3. 内存泄漏诊断:
# 监控特定进程内存增长
watch -n 1 'ps aux | grep process_name'
# 使用 valgrind(需要编译时支持)
valgrind --leak-check=full ./program
# 用 smaps 查看详细内存
cat /proc/PID/smaps磁盘 I/O 分析
1. iotop(实时磁盘 IO 监控):
iotop -o # 只显示有 IO 操作的进程
# 关键指标:
# READ: 读取数据速率
# WRITE: 写入数据速率
# IO%: IO 操作占 CPU 时间的百分比2. lsof(打开文件统计):
# 找出最多打开文件的进程
lsof | awk '{print $1}' | sort | uniq -c | sort -rn | head
# 查看特定进程打开的文件
lsof -p PID
# 监控文件删除后仍占用的空间
lsof | grep deleted3. du 和 df(磁盘空间):
# 磁盘使用情况
df -h
# 查找大文件
du -sh /* | sort -rh | head -10
# 找出大文件(> 100MB)
find / -type f -size +100M -exec ls -lh {} \;4. fio(磁盘性能基准测试):
# 顺序读测试
fio --name=seqread --ioengine=libaio --rw=read --bs=4k --size=1G
# 随机读写混合测试
fio --name=rw --ioengine=libaio --rw=randrw --bs=4k --size=1G
# 关键指标:IOPS, BW (带宽), lat (延迟)网络性能分析
1. netstat 和 ss(网络连接统计):
# 显示网络连接统计
netstat -an | awk '{print $6}' | sort | uniq -c
# 或(ss 更快)
ss -an | awk '{print $2}' | sort | uniq -c
# 统计不同状态的连接
netstat -an | grep -c ESTABLISHED
netstat -an | grep -c TIME_WAIT
# 监控网络连接(每 2 秒刷新)
watch -n 2 'netstat -an | awk "{print $6}" | sort | uniq -c'2. ifstat 和 iftop(网络吞吐量):
# 实时网络吞吐量
ifstat -i eth0 1 # 每 1 秒采样
# 找出最占用带宽的连接(需要 root)
iftop -i eth0 -n
# 关键指标:RX(接收)和 TX(发送)速率3. tcpdump(网络数据包抓取):
# 捕获 HTTP 流量
tcpdump -i eth0 'tcp port 80'
# 保存为文件供后续分析
tcpdump -i eth0 -w traffic.pcap
# 统计源 IP 连接数
tcpdump -i eth0 -nn 'tcp' | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn综合诊断思路
CPU 瓶颈诊断:
# 1. 查看整体 CPU 使用率
top -n 1 | head -3
# 2. 查看运行队列
vmstat 1 5 | grep -A 1 "procs"
# 3. 找出高 CPU 进程
ps aux --sort=-%cpu | head -5
# 4. 分析进程热点(需要 perf)
perf record -p PID -- sleep 10
perf report磁盘 IO 瓶颈诊断:
# 1. 查看磁盘使用率
iostat -x 2 5 | grep %util
# 2. 找出高 IO 进程
iotop -o -n 1
# 3. 查看等待 IO 的进程
ps aux | grep D+ # D 表示磁盘睡眠
# 4. 分析 IO 模式
iostat -x 2 5 # 查看 r/s, w/s, await内存压力诊断:
# 1. 检查可用内存
free -h
# 2. 查看内存占用进程
ps aux --sort=-%mem | head -10
# 3. 检查 swap 使用
free -h | grep Swap
# 4. 检查内存泄漏
watch -n 2 'ps aux | grep process | head -1'网络瓶颈诊断:
# 1. 检查网络吞吐量
ifstat -i eth0 1 5
# 2. 查看连接统计
ss -s
# 3. 找出高流量连接
iftop -i eth0 -n
# 4. 分析丢包和延迟
ping -c 4 target_host
traceroute target_host快速参考命令速查表
| 场景 | 命令 | 关键指标 |
|---|---|---|
| 整体状态 | top, htop, dstat | CPU%, MEM%, LOAD |
| CPU 详情 | vmstat 2 5, sar -u | r, wa, us, sy |
| 磁盘 IO | iostat -x 2 5, iotop | r/s, w/s, await, %util |
| 内存详情 | free -h, ps aux | available, used, swap |
| 网络状态 | ss -s, ifstat, iftop | ESTABLISHED, RX, TX |
| 进程追踪 | strace, ltrace | 系统调用,函数调用 |
| 性能基准 | fio, sysbench | IOPS, BW, latency |
实战分析案例
案例 1:CPU 高占用:
# 第 1 步:查看总体 CPU
top -n 1
# 第 2 步:找出消耗 CPU 的进程
ps aux --sort=-%cpu | head -5
# 第 3 步:分析进程热点
perf record -p PID -- sleep 10
perf report
# 第 4 步:优化代码或扩容
# 可能的原因:算法低效、无限循环、高频系统调用案例 2:内存持续增长:
# 第 1 步:确认内存增长
watch -n 5 'free -h'
# 第 2 步:找出消耗内存的进程
ps aux --sort=-%mem | head -5
# 第 3 步:检查内存泄漏
valgrind --leak-check=full ./program
# 第 4 步:确定增长速率
# 每小时增长多少,推算何时内存溢出案例 3:磁盘 IO 高:
# 第 1 步:查看磁盘忙碌度
iostat -x 2 5 | tail
# 第 2 步:找出高 IO 进程
iotop -o -n 1
# 第 3 步:分析 IO 模式
# 是顺序读写还是随机?是频繁小 IO 还是大 IO?
# 第 4 步:优化
# 增加缓存、批量操作、使用更快的存储设备相关高频面试题
Q1: vmstat 输出中的 r 和 b 字段各表示什么?如何判断系统性能状态?
答案:
# r (runnable processes): 运行队列中的进程数
# - 高 r 值表示 CPU 竞争激烈,进程等待 CPU 时间较长
# - 经验值:r > CPU核心数 2 倍时,CPU 成为瓶颈
# b (blocked processes): 因等待 IO 而被阻塞的进程数
# - 高 b 值表示磁盘 IO 成为瓶颈,进程在等待磁盘读写
# - 高 b 值通常伴随高 wa(IO 等待时间)
# 诊断示例:
vmstat 2 10
# 若 r 持续 > 8(4核CPU),说明 CPU 不足
# 若 b 持续 > 0,说明磁盘 IO 成为瓶颈
# 若 wa > 30%,说明大量时间在等待 IOQ2: iostat 中 await 和 svctm 的区别是什么?
答案:
# await: 平均 IO 等待时间(包括排队时间 + 服务时间)
# 较高的 await 表示硬盘繁忙或响应慢
# svctm: 硬盘平均服务时间(纯粹的磁盘处理时间)
# svctm 高表示硬盘性能下降
# 区别:
# - await = 队列等待 + svctm
# - await 高但 svctm 低:表示磁盘繁忙,队列排队多
# - 两者都高:表示硬盘本身有问题,需要更换或维修
# 示例分析:
iostat -x 2 5
# await=50ms, svctm=5ms 时,队列等待=45ms,需要提高吞吐量
# await=50ms, svctm=45ms 时,硬盘响应慢,需要更换硬盘Q3: 如何快速判断服务器当前的性能瓶颈?
答案:
# 三个命令组合快速诊断:
# 1. 查看 CPU 状态
top -n 1 | head -4
# wa% 高 → 磁盘 IO 瓶颈,us% 高 → CPU 瓶颈
# 2. 查看内存状态
free -h
# available < total 的 10% → 内存压力大
# 3. 查看磁盘状态
iostat -x 1 3 | tail -1
# %util > 80% 和 await > 100ms → 磁盘 IO 瓶颈
# 快速判断:
# - %util > 80% && wa% > 30% → 磁盘 IO 瓶颈
# - us% > 80% && wa% < 5% → CPU 瓶颈
# - available < 10% → 内存瓶颈
# - RX/TX 接近 NIC 限制 → 网络瓶颈Q4: 如何监控特定进程的性能指标?
答案:
# 1. 实时监控 CPU/内存
top -p PID # 只显示特定进程
watch -n 1 'ps aux | grep PID | head -1'
# 2. 监控进程打开的文件数
watch -n 1 'lsof -p PID | wc -l'
# 3. 监控进程网络连接
watch -n 2 'netstat -np | grep PID | wc -l'
# 4. 监控进程 IO 操作
iotop -p PID
# 5. 追踪进程的系统调用
strace -p PID -o trace.log
# 分析高频系统调用
awk '{print $1}' trace.log | sort | uniq -c | sort -rn | head
# 6. 查看进程详细内存
pmap -x PIDQ5: 网络连接 TIME_WAIT 过多会造成什么问题?如何处理?
答案:
# TIME_WAIT 是 TCP 关闭时的正常状态,用于确保延迟报文处理完
# 问题:
# - 占用文件描述符(socket 资源)
# - 占用内存
# - 达到端口限制时,无法建立新连接
# 诊断:
netstat -an | grep TIME_WAIT | wc -l
# 解决方案:
# 1. 应用层优化(最根本)
# - 使用 HTTP Keep-Alive(复用连接)
# - 增加连接池大小
# - 使用长连接而非短连接
# 2. 系统层优化(调整参数)
# 减少 TIME_WAIT 等待时间
sysctl -w net.ipv4.tcp_fin_timeout=30
# 允许 TIME_WAIT socket 重用
sysctl -w net.ipv4.tcp_tw_reuse=1
# 快速回收 TIME_WAIT(需谨慎)
sysctl -w net.ipv4.tcp_tw_recycle=1 # 已弃用
# 3. 增加端口范围
sysctl -w net.ipv4.ip_local_port_range="1024 65535"Q6: CPU 使用率和 load average 有什么区别?
答案:
# CPU 使用率:CPU 正在运行的时间占总时间的百分比
# - top 命令显示的 Cpu(s)
# - 0-100% 范围,显示当前时刻的使用情况
# Load Average:过去 1/5/15 分钟内平均运行队列长度
# - uptime 命令显示
# - 通常没有百分比上限,受 CPU 核心数影响
#
# 示例:
uptime
# load average: 2.5, 2.0, 1.8
# 在 4 核 CPU 上:
# - load 2.5 表示有 2.5 个进程在等待 CPU
# - 如果 CPU 使用率只有 50%,说明有进程被阻塞(IO 等待)
# 判断标准:
# - load = CPU 核心数时,系统处于最优利用
# - load > CPU 核心数 × 2 时,性能已严重下降
# - 如果 load 高但 CPU 使用率低,说明 IO 等待严重性能诊断决策树
性能问题
├─ 系统响应慢
│ ├─ top: Cpu(s) us% > 80%?
│ │ └─ YES → CPU 瓶颈,检查 ps aux
│ ├─ top: Cpu(s) wa% > 30%?
│ │ └─ YES → 磁盘 IO 瓶颈,运行 iostat
│ └─ top: available < 10%?
│ └─ YES → 内存压力,检查 ps aux --sort=-%mem
│
├─ 应用内存持续增长
│ ├─ ps aux | grep app
│ └─ watch -n 5 'ps aux | grep app'
│ → 确认增长速率和内存泄漏
│
├─ 网络延迟高
│ ├─ ping 目标主机
│ ├─ traceroute 分析路径
│ └─ tcpdump 抓包分析
│
└─ 磁盘满
├─ df -h 查看挂载点
└─ du -sh /* 查找大目录