linux-performance-analyzer
# Linux 性能分析与调优全能手册 (linux-perf-master)
> 本 skill 整合了 linux-perf-advisor、linux-perf-analysis、linux-perf-tune、linux-performance-analyzer 四个专项 skill 的精华内容,提供完整的性能诊断→根因分析→优化实施→验证回滚闭环能力。
---
## 📋 分析工作流
```
第一步:收集现场数据(运行快照脚本或手动采集)
↓
第二步:识别瓶颈类型(CPU / 内存 / I/O / 网络 / 编译)
↓
第三步:查阅对应参考文档深入分析
↓
第四步:输出标准化分析报告(含问题/原因/方案/风险/验证/回滚)
↓
第五步:实施优化并验证效果
```
---
## 第一步:快速数据采集
### 方式一:使用采集脚本(推荐)
```bash
# 系统快照(全面)
bash scripts/collect_snapshot.sh
# 持续监控(后台运行,每5秒采样)
bash scripts/perf_monitor.sh &
```
### 方式二:手动快速诊断命令
```bash
# ① 负载概览
uptime && cat /proc/loadavg
# ② 内存状态
free -h && cat /proc/meminfo | grep -E "MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree|Dirty|AnonPages|Slab|HugePages"
# ③ CPU + 进程
top -bn1 | head -20
mpstat -P ALL 1 3
# ④ I/O
iostat -xz 1 3
iotop -o -b -n 3 | head -20
# ⑤ 网络
ss -s
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
# ⑥ 内核参数现状
sysctl -a 2>/dev/null | grep -E "^vm\.|^net\.|^kernel\.sched" | head -60
# ⑦ 上下文切换
vmstat 1 5
# ⑧ OOM 历史
dmesg | grep -iE "oom|killed process" | tail -20
# ⑨ 中断分布
cat /proc/interrupts | sort -k2 -rn | head -20
# ⑩ 磁盘空间
df -h && lsblk
```
---
## 第二步:瓶颈快速识别表
| 现象 | 可能瓶颈 | 参考文档 |
|------|---------|---------|
| load average 持续 > CPU核数×2 | CPU 饱和 或 I/O 等待 | references/cpu.md |
| vmstat cs(上下文切换)> 10万/秒 | CPU 调度过频 | references/cpu.md |
| %iowait > 20% | 磁盘 I/O 瓶颈 | references/disk_io.md |
| MemAvailable < 总内存 10% | 内存压力 | references/memory.md |
| Swap 使用率 > 20% 且持续增长 | 内存严重不足 | references/memory.md |
| OOM Killer 日志出现 | 内存泄漏 或 配置不当 | references/memory.md |
| Dirty 持续 > 物理内存 5% | 写回积压 I/O 跟不上 | references/disk_io.md |
| 大量 TIME_WAIT / CLOSE_WAIT | 网络连接泄漏/未优化 | references/network.md |
| 网络丢包 / 重传率高 | TCP 参数/带宽/拥塞 | references/network.md |
| perf/gprof 热点在用户态代码 | 编译未优化 | references/compile_optimization.md |
| CPU throttling(容器) | cgroup CPU 限制过低 | references/cpu.md |
---
## 第三步:分析报告输出格式规范
每个问题按以下六要素输出,格式统一:
```markdown
### 🔴/🟡/🟢 问题名称(优先级 P0/P1/P2)
**【问题】**
观察到的指标数据和异常现象
**【原因】**
根因推断和分析
**【方案】**
```bash
# 具体优化命令
```
**【风险】**
改动的副作用和注意事项
**【验证】**
```bash
# 验证效果的命令
```
**【回滚】**
```bash
# 回滚命令
```
```
### 报告汇总表格模板
```markdown
| 优先级 | 问题 | 影响范围 | 操作难度 | 建议操作 |
|--------|------|----------|----------|----------|
| 🔴 P0 | ... | ... | 低/中/高 | ... |
```
---
## 第四步:常见场景快速处理
### 🔴 内存问题
**诊断命令:**
```bash
cat /proc/meminfo
dmesg | grep -i "oom\|killed process" | tail -20
ps aux --sort=-%mem | head -15
slabtop -o | head -20
numastat -m 2>/dev/null # NUMA 信息(多路服务器)
```
**核心调优(详见 references/memory.md):**
```bash
# Swap 倾向(服务器推荐 10,数据库推荐 1)
sysctl -w vm.swappiness=10
# 增大内核保留内存(防止 OOM 误杀关键进程)
sysctl -w vm.min_free_kbytes=262144 # 256MB
# 脏页回写(写密集场景)
sysctl -w vm.dirty_ratio=10
sysctl -w vm.dirty_background_ratio=5
# 透明大页(数据库/延迟敏感服务关闭)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 保护关键进程免遭 OOM Kill
echo -1000 > /proc/<PID>/oom_score_adj
```
---
### 🔴 CPU 问题
**诊断命令:**
```bash
mpstat -P ALL 1 5
pidstat -u 1 5
vmstat 1 5 # 重点看 r(运行队列)和 cs(上下文切换)
cat /proc/interrupts | sort -k2 -rn | head -20
perf stat -e cycles,instructions,cache-misses -a sleep 5
```
**核心调优(详见 references/cpu.md):**
```bash
# 减少上下文切换(调度粒度)
sysctl -w kernel.sched_min_granularity_ns=10000000
sysctl -w kernel.sched_wakeup_granularity_ns=15000000
sysctl -w kernel.sched_migration_cost_ns=5000000
# 关闭 NUMA 均衡(延迟敏感场景)
sysctl -w kernel.numa_balancing=0
# CPU 性能模式
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 进程 CPU 亲和性绑核
taskset -pc 0-3 <PID>
# 调整进程优先级
renice -5 -p <PID> # 提高优先级
renice +10 -p <PID> # 降低优先级
```
---
### 🔴 磁盘 I/O 问题
**诊断命令:**
```bash
iostat -xz 1 5
iotop -o -n 3 -b | head -30
cat /sys/block/sda/queue/nr_requests
cat /sys/block/sda/queue/scheduler
mount | grep -v "tmpfs\|proc\|sys\|dev"
```
**核心调优(详见 references/disk_io.md):**
```bash
# I/O 调度器(SSD: mq-deadline 或 none;HDD: bfq)
echo mq-deadline > /sys/block/sda/queue/scheduler
# 读预读(顺序读为主时增大)
blockdev --setra 4096 /dev/sda # 2MB 预读
# 增大内核请求队列
echo 256 > /sys/block/sda/queue/nr_requests
# 脏页控制(防止写爆)
sysctl -w vm.dirty_bytes=268435456 # 256MB
sysctl -w vm.dirty_background_bytes=67108864 # 64MB
```
---
### 🔴 网络问题
**诊断命令:**
```bash
ss -s
ss -ant | awk '{print $1}' | sort | uniq -c
netstat -s | grep -E "fail|error|drop|overflow|reject" | grep -v " 0 "
ip -s link
ping -c 100 <target> | tail -3
```
**核心调优(详见 references/network.md):**
```bash
# TIME_WAIT 回收(高并发短连接)
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_fin_timeout=30
# 端口范围(主动发起连接的服务)
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
# 连接队列(高并发服务)
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=16384
sysctl -w net.core.netdev_max_backlog=16384
# TCP 缓冲区(高带宽场景)
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
# 文件描述符
sysctl -w fs.file-max=2097152
ulimit -n 65535
```
---
### 🟡 编译优化(详见 references/compile_optimization.md)
> **触发条件**:perf/gprof 热点集中在用户态自编译代码,且当前编译选项为 -O0/-O1
```bash
# 快速升级:从 -O1 升到 -O2(大多数场景无需其他改动)
gcc -O2 -march=native -mtune=native -fno-omit-frame-pointer -o app src/*.c
# 高性能计算场景:-O3 + LTO
gcc -O3 -march=native -flto=thin -fno-omit-frame-pointer -o app src/*.c
# 最优:PGO + LTO 组合(提升 10-20%)
# 见 references/compile_optimization.md 第4-5节
```
---
## 参数修改规范
### 临时生效(立即,重启失效)
```bash
sysctl -w 参数名=值
echo 值 > /proc/sys/...
```
### 持久化(重启后仍生效)
```bash
# 推荐:独立配置文件,易于管理和回滚
cat > /etc/sysctl.d/99-perf-analyzer.conf << 'EOF'
vm.swappiness=10
vm.dirty_ratio=10
# ... 其他参数
EOF
sysctl --system
```
### 回滚
```bash
# 临时回滚(立即生效)
sysctl -w 参数名=原始值
# 持久化回滚
rm /etc/sysctl.d/99-perf-analyzer.conf
sysctl --system
```
---
## 性能基线与告警阈值
### 告警阈值参考
| 指标 | 正常 | 警告 | 严重 |
|------|------|------|------|
| CPU 使用率 | < 60% | > 70% | > 90% |
| 内存可用 | > 30% | < 20% | < 10% |
| Swap 使用率 | 0% | > 10% | > 30% |
| 磁盘使用率 | < 70% | > 80% | > 95% |
| load average | < 核数 | > 核数×1.5 | > 核数×2 |
| I/O await | < 10ms | > 20ms | > 50ms |
| 磁盘 %util | < 60% | > 80% | > 95% |
| 上下文切换/秒 | < 5万 | > 10万 | > 50万 |
| TCP 重传率 | < 0.1% | > 1% | > 5% |
### 建立性能基线
```bash
# 在系统正常时保存基线
bash scripts/collect_snapshot.sh > /var/log/perf-baseline-$(date +%Y%m%d).txt
# 定期对比(加入 crontab)
# 每月更新基线
0 4 1 * * bash /path/to/scripts/collect_snapshot.sh > /var/log/perf-baseline.log
# 每日清理日志
0 2 * * * journalctl --vacuum-time=7d
```
---
## 参考文档索引
| 文档 | 内容 |
|------|------|
| [references/cpu.md](references/cpu.md) | CPU 调优(调度器/亲和性/NUMA/中断绑核/perf profiling) |
| [references/memory.md](references/memory.md) | 内存调优(swappiness/OOM/THP/HugePage/NUMA) |
| [references/disk_io.md](references/disk_io.md) | 磁盘 I/O 调优(调度器/readahead/fio/文件系统) |
| [references/network.md](references/network.md) | 网络调优(TCP 栈/连接队列/BBR/conntrack) |
| [references/kernel_params.md](references/kernel_params.md) | 内核参数速查全表(含默认值/建议值/适用场景) |
| [references/compile_optimization.md](references/compile_optimization.md) | 编译优化(GCC/Clang/PGO/LTO/SIMD) |
| [references/case_studies.md](references/case_studies.md) | 实战案例(MySQL/Nginx/日志服务器/Java/K8s) |
---
## 故障排查清单(10步法)
当性能问题发生时,按顺序检查:
1. [ ] `uptime` 检查负载均值
2. [ ] `free -h` 检查内存可用量
3. [ ] `df -h` 检查磁盘空间
4. [ ] `top -bn1` 检查 CPU 使用率和高耗进程
5. [ ] `vmstat 1 3` 检查上下文切换和 I/O 等待
6. [ ] `iostat -xz 1 3` 检查磁盘 I/O 详情
7. [ ] `ss -s` 检查网络连接状态
8. [ ] `dmesg | tail -50` 检查内核日志(OOM/硬件错误)
9. [ ] `dmesg | grep -i "oom\|killed"` 检查 OOM 事件
10. [ ] 对比基线数据,确认问题时间点
---
## 注意事项
> ⚠️ **生产环境修改前必读**:
>
> 1. 记录原始值:`sysctl 参数名` 保存当前值
> 2. 先临时生效观察效果,确认无副作用再持久化
> 3. 生产环境修改前,务必先在测试环境验证
> 4. `vm.overcommit_memory=2`(严格模式)与多数应用不兼容,慎用
> 5. 透明大页关闭需持久化到启动脚本,重启会还原
> 6. `net.ipv4.tcp_tw_recycle` 在内核 4.12+ 已移除,使用前确认版本
> 7. 容器环境中部分参数(cgroup 限制)需宿主机/平台侧配合修改
标签
skill
ai