性能分析与调优
课程概述
本教程深入讲解操作系统性能分析与调优技术,从perf工具到火焰图,从eBPF到系统调优,帮助你全面掌握性能问题定位和优化方法。
学习目标:
- 掌握Linux性能分析工具(perf、eBPF、ftrace)
- 理解火焰图的生成与分析
- 学习CPU、内存、I/O性能调优
- 掌握系统瓶颈定位方法
- 理解性能监控指标
- 学习内核参数调优
1. 性能分析基础
1.1 性能指标
┌─────────────────────────────────────────────────────────────┐
│ 性能分析的黄金指标 │
└─────────────────────────────────────────────────────────────┘
USE方法 (Utilization, Saturation, Errors):
┌─────────────────────────────────────────────────────────────┐
│ 资源类型 │ 利用率 │ 饱和度 │ 错误 │
├─────────────┼─────────────────┼─────────────────┼──────────┤
│ CPU │ %user+%system │ 运行队列长度 │ 指令错误 │
│ │ (vmstat, mpstat)│ (vmstat r列) │ │
├─────────────┼─────────────────┼─────────────────┼──────────┤
│ Memory │ 已用内存比例 │ swap使用率 │ OOM kill │
│ │ (free) │ (vmstat si/so) │ (dmesg) │
├─────────────┼─────────────────┼─────────────────┼──────────┤
│ Disk │ %util │ 平均队列长度 │ I/O错误 │
│ │ (iostat) │ (iostat avgqu-sz│ (dmesg) │
├─────────────┼─────────────────┼─────────────────┼──────────┤
│ Network │ 带宽使用率 │ socket缓冲溢出 │ 丢包 │
│ │ (sar -n DEV) │ (netstat -s) │ (ifconfig│
└─────────────┴─────────────────┴─────────────────┴──────────┘
RED方法 (Rate, Errors, Duration) - 面向服务:
┌─────────────────────────────────────────────────────────────┐
│ • Rate (速率): 每秒请求数 (QPS/RPS) │
│ • Errors (错误率): 失败请求比例 │
│ • Duration (延迟): 请求响应时间 (P50/P95/P99) │
└─────────────────────────────────────────────────────────────┘
性能分析流程:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 1. 问题识别 │
│ ┌──────────────────────────────────────────────┐ │
│ │ • 用户反馈慢 │ │
│ │ • 监控告警 │ │
│ │ • 容量规划 │ │
│ └────────────────┬─────────────────────────────┘ │
│ │ │
│ ▼ │
│ 2. 快速检查 (60秒) │
│ ┌──────────────────────────────────────────────┐ │
│ │ uptime - 负载均衡 │ │
│ │ dmesg -T - 内核错误 │ │
│ │ vmstat 1 - CPU/内存/swap │ │
│ │ mpstat -P ALL 1 - CPU各核心 │ │
│ │ pidstat 1 - 进程资源使用 │ │
│ │ iostat -xz 1 - 磁盘I/O │ │
│ │ free -m - 内存使用 │ │
│ │ sar -n DEV 1 - 网络I/O │ │
│ │ sar -n TCP,ETCP 1 - TCP统计 │ │
│ │ top - 进程概览 │ │
│ └────────────────┬─────────────────────────────┘ │
│ │ │
│ ▼ │
│ 3. 深入分析 │
│ ┌──────────────────────────────────────────────┐ │
│ │ • CPU: perf, eBPF │ │
│ │ • 内存: valgrind, heaptrack │ │
│ │ • I/O: iotop, blktrace │ │
│ │ • 网络: tcpdump, wireshark │ │
│ │ • 系统调用: strace │ │
│ └────────────────┬─────────────────────────────┘ │
│ │ │
│ ▼ │
│ 4. 优化与验证 │
│ ┌──────────────────────────────────────────────┐ │
│ │ • 应用层优化 │ │
│ │ • 内核参数调优 │ │
│ │ • 硬件升级 │ │
│ │ • 架构调整 │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘1.2 系统性能观测工具全景
┌─────────────────────────────────────────────────────────────┐
│ Linux性能观测工具 │
└─────────────────────────────────────────────────────────────┘
Application
│
┌─────────┼─────────┐
│ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│ strace│ │ ltrace│ │ gdb │
└───────┘ └───────┘ └───────┘
│
System Call
│
═══════════════════════╪═══════════════════════
│ Kernel
┌───────────────────┼───────────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ Scheduler│ │ Memory │ │ I/O │
│ │ │ Manager │ │ Manager │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ mpstat │ │ free │ │ iostat │
│ pidstat │ │ vmstat │ │ iotop │
│ top │ │ slabtop │ │ blktrace│
│ perf │ │ /proc │ │ biosnoop│
└─────────┘ └─────────┘ └─────────┘
│ │ │
└───────────────────┼───────────────────┘
│
┌────▼────┐
│ Hardware│
│ │
│ CPU │
│ Memory │
│ Disk │
│ Network │
└─────────┘
工具分类:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 基础工具 (Basic): │
│ • uptime, dmesg, top, htop, ps, vmstat, iostat, free │
│ │
│ 中级工具 (Intermediate): │
│ • perf, strace, tcpdump, iotop, sysstat (sar), nicstat │
│ │
│ 高级工具 (Advanced): │
│ • eBPF (bcc tools), ftrace, SystemTap │
│ │
│ 可视化 (Visualization): │
│ • FlameGraph, Grafana, Prometheus │
└─────────────────────────────────────────────────────────────┘2. CPU性能分析
2.1 Perf工具
bash
#!/bin/bash
# Perf性能分析完整示例
echo "=== CPU性能快速检查 ==="
# 1. 查看系统负载
uptime
# 输出: load average: 2.51, 3.13, 2.72
# 解读: 1分钟/5分钟/15分钟平均负载
# 如果 > CPU核心数,说明有任务在等待
# 2. CPU利用率
mpstat -P ALL 1 3
# %usr: 用户空间CPU时间
# %sys: 内核空间CPU时间
# %iowait: 等待I/O的时间(高则I/O瓶颈)
# %idle: 空闲时间
echo ""
echo "=== Perf Top实时分析 ==="
# 实时查看CPU热点
perf top -g
# -g: 显示调用栈
echo ""
echo "=== Perf Record采样 ==="
# 采样30秒
perf record -F 99 -a -g -- sleep 30
# -F 99: 采样频率99Hz (避免与定时器冲突)
# -a: 所有CPU
# -g: 调用栈
# 查看报告
perf report --stdio
# 或交互式查看
# perf report
echo ""
echo "=== Perf Stat统计 ==="
# 统计性能计数器
perf stat ./your_program
# 输出示例:
# Performance counter stats for './your_program':
# 1234.56 msec task-clock # 0.998 CPUs utilized
# 12 context-switches # 9.717 /sec
# 0 cpu-migrations # 0.000 /sec
# 456 page-faults # 369.414 /sec
# 4,567,890,123 cycles # 3.699 GHz
# 2,345,678,901 instructions # 0.51 insn per cycle
# 456,789,012 branches # 370.000 M/sec
# 1,234,567 branch-misses # 0.27% of all branches
echo ""
echo "=== Perf火焰图 ==="
# 生成火焰图
perf script | ./FlameGraph/stackcollapse-perf.pl | \
./FlameGraph/flamegraph.pl > flamegraph.svg┌─────────────────────────────────────────────────────────────┐
│ Perf事件类型 │
└─────────────────────────────────────────────────────────────┘
硬件事件 (Hardware Events):
┌────────────────────────────────────────────────────┐
│ • cpu-cycles / cycles - CPU周期 │
│ • instructions - 执行的指令数 │
│ • cache-references - 缓存引用 │
│ • cache-misses - 缓存未命中 │
│ • branch-instructions - 分支指令 │
│ • branch-misses - 分支预测失败 │
│ • bus-cycles - 总线周期 │
└────────────────────────────────────────────────────┘
软件事件 (Software Events):
┌────────────────────────────────────────────────────┐
│ • cpu-clock - CPU时钟 │
│ • task-clock - 任务时钟 │
│ • page-faults / faults - 页错误 │
│ • context-switches / cs - 上下文切换 │
│ • cpu-migrations - CPU迁移 │
│ • minor-faults - 次要页错误 │
│ • major-faults - 主要页错误 │
└────────────────────────────────────────────────────┘
跟踪点 (Tracepoints):
┌────────────────────────────────────────────────────┐
│ • sched:sched_switch - 进程调度 │
│ • syscalls:sys_enter_* - 系统调用进入 │
│ • syscalls:sys_exit_* - 系统调用退出 │
│ • block:block_rq_* - 块I/O请求 │
│ • net:net_dev_* - 网络设备 │
└────────────────────────────────────────────────────┘
使用示例:
# 监控缓存未命中
perf stat -e cache-misses,cache-references ./program
# 监控系统调用
perf record -e 'syscalls:sys_enter_*' -a
# 监控调度事件
perf record -e sched:sched_switch -a2.2 火焰图分析
┌─────────────────────────────────────────────────────────────┐
│ 火焰图 (Flame Graph) │
└─────────────────────────────────────────────────────────────┘
火焰图结构:
┌─────────────────────────────────────────────────────────────┐
│ │
│ func_a (1%) │
│ ┌─┐ │
│ └─┘ │
│ │
│ func_b (15%) │
│ ┌───────────────┐ │
│ │ subfunc_b1 (8%) subfunc_b2 (7%) │
│ │ ┌──────────┐ ┌────────┐ │
│ └─┴──────────┴─────┴────────┘ │
│ │
│ func_c (84%) ◀─ 热点函数! │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ subfunc_c1 (60%) subfunc_c2 (24%) │ │
│ │ ┌─────────────────────┐ ┌──────────────┐ │ │
│ │ │ deeper_c1 (40%) │ │ deeper_c2 │ │ │
│ │ │ ┌────────────────┐ │ │ (24%) │ │ │
│ │ │ │ hot_loop (40%) │ │ │ ┌──────────┐ │ │ │
│ │ │ └────────────────┘ │ │ └──────────┘ │ │ │
│ └─┴─────────────────────┴──┴──────────────┴────────────┘ │
│ │
│ X轴: 函数占用CPU比例 (宽度) │
│ Y轴: 调用栈深度 (高度) │
│ 颜色: 随机 (相同函数相同颜色) │
└─────────────────────────────────────────────────────────────┘
火焰图类型:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 1. On-CPU火焰图 │
│ • 显示CPU执行时间 │
│ • 找热点函数 │
│ • perf record -F 99 -a -g │
│ │
│ 2. Off-CPU火焰图 │
│ • 显示阻塞时间 │
│ • 找I/O等待、锁等待 │
│ • offcputime (eBPF工具) │
│ │
│ 3. Memory火焰图 │
│ • 显示内存分配 │
│ • 找内存泄漏 │
│ │
│ 4. Differential火焰图 │
│ • 对比两次采样 │
│ • 找性能回归 │
└─────────────────────────────────────────────────────────────┘
分析技巧:
┌─────────────────────────────────────────────────────────────┐
│ 1. 宽平台: CPU密集型,可能需要优化 │
│ 2. 高塔: 深调用栈,可能过度抽象 │
│ 3. 锯齿: 多个小函数,考虑内联 │
│ 4. 单一热点: 优化此函数 │
│ 5. 分散热点: 系统性问题 │
└─────────────────────────────────────────────────────────────┘bash
#!/bin/bash
# 火焰图生成脚本
DURATION=30 # 采样时长(秒)
# 1. 安装FlameGraph工具
if [ ! -d "FlameGraph" ]; then
echo "Cloning FlameGraph..."
git clone https://github.com/brendangregg/FlameGraph
fi
echo "=== 生成On-CPU火焰图 ==="
# 采样
perf record -F 99 -a -g -- sleep $DURATION
# 生成火焰图
perf script | ./FlameGraph/stackcollapse-perf.pl | \
./FlameGraph/flamegraph.pl --title="On-CPU Flame Graph" \
> oncpu-flamegraph.svg
echo "On-CPU火焰图已生成: oncpu-flamegraph.svg"
# 针对特定进程
# perf record -F 99 -p $PID -g -- sleep $DURATION
echo ""
echo "=== 生成Off-CPU火焰图 (需要eBPF) ==="
# 使用offcputime工具
if command -v offcputime-bpfcc &> /dev/null; then
offcputime-bpfcc -df -p $PID $DURATION > offcpu.stacks
./FlameGraph/flamegraph.pl --title="Off-CPU Flame Graph" \
--colors=io offcpu.stacks > offcpu-flamegraph.svg
echo "Off-CPU火焰图已生成: offcpu-flamegraph.svg"
else
echo "offcputime工具未安装,跳过"
fi
echo ""
echo "=== 差异火焰图 ==="
# 对比两个perf.data
# perf script -i perf.data.old | ./FlameGraph/stackcollapse-perf.pl > old.folded
# perf script -i perf.data.new | ./FlameGraph/stackcollapse-perf.pl > new.folded
# ./FlameGraph/difffolded.pl old.folded new.folded | \
# ./FlameGraph/flamegraph.pl > diff-flamegraph.svg3. eBPF性能分析
3.1 eBPF工具集(BCC)
┌─────────────────────────────────────────────────────────────┐
│ eBPF (Extended Berkeley Packet Filter) │
└─────────────────────────────────────────────────────────────┘
eBPF架构:
┌─────────────────────────────────────────────────────────────┐
│ 用户空间 │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ BCC/bpftrace工具 │ │
│ │ execsnoop, opensnoop, biolatency, tcplife... │ │
│ └──────────────────┬────────────────────────────────────┘ │
│ │ 编译eBPF程序 │
│ ▼ │
│ ════════════════════════════════════════════════════════ │
│ 内核空间 │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ eBPF虚拟机 │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ Verifier (验证器) │ │ │
│ │ │ • 检查内存访问 │ │ │
│ │ │ • 确保程序会终止 │ │ │
│ │ │ • 无死循环 │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ JIT Compiler (即时编译) │ │ │
│ │ │ eBPF字节码 → 本地机器码 │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └───────────────────┬──────────────────────────────────┘ │
│ │ 挂载到Hook点 │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Hook点 │ │
│ │ • Tracepoints (sched:sched_switch) │ │
│ │ • Kprobes (内核函数入口) │ │
│ │ • Uprobes (用户函数入口) │ │
│ │ • XDP (网络数据包) │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
常用BCC工具:
┌─────────────────────────────────────────────────────────────┐
│ │
│ CPU分析: │
│ • execsnoop - 跟踪新进程执行 │
│ • profile - CPU分析(类似perf) │
│ • offcputime - 测量阻塞时间 │
│ • cpudist - CPU运行时间分布 │
│ │
│ 内存分析: │
│ • memleak - 内存泄漏检测 │
│ • cachestat - 页缓存统计 │
│ • oomkill - 跟踪OOM killer │
│ │
│ I/O分析: │
│ • biolatency - 块I/O延迟分布 │
│ • biosnoop - 跟踪块I/O │
│ • ext4slower - 跟踪慢ext4操作 │
│ • opensnoop - 跟踪open()系统调用 │
│ │
│ 网络分析: │
│ • tcpconnect - 跟踪TCP连接 │
│ • tcpaccept - 跟踪TCP接受 │
│ • tcpretrans - 跟踪TCP重传 │
│ • tcplife - TCP连接生命周期 │
│ │
│ 文件系统: │
│ • fileslower - 跟踪慢文件操作 │
│ • filelife - 文件生命周期 │
│ • vfsstat - VFS统计 │
└─────────────────────────────────────────────────────────────┘bash
#!/bin/bash
# eBPF工具使用示例
echo "=== 安装BCC工具 ==="
# Ubuntu/Debian
# apt-get install bpfcc-tools linux-headers-$(uname -r)
# CentOS/RHEL
# yum install bcc-tools
echo ""
echo "=== 1. 跟踪进程执行 ==="
# 查看所有新进程
execsnoop-bpfcc
# 输出: 时间戳, PID, PPID, 返回值, 命令
echo ""
echo "=== 2. 块I/O延迟分析 ==="
# 查看块I/O延迟直方图
biolatency-bpfcc 10 1
# 输出:
# usecs : count distribution
# 0 -> 1 : 0 | |
# 2 -> 3 : 0 | |
# 4 -> 7 : 0 | |
# 8 -> 15 : 0 | |
# 16 -> 31 : 0 | |
# 32 -> 63 : 10 |** |
# 64 -> 127 : 200 |******** |
# 128 -> 255 : 500 |********************|
# 256 -> 511 : 150 |****** |
echo ""
echo "=== 3. 跟踪慢文件I/O ==="
# 跟踪超过10ms的文件操作
fileslower-bpfcc 10
# 输出: 时间, 进程, 操作类型, 文件名, 延迟(ms)
echo ""
echo "=== 4. TCP连接跟踪 ==="
# 跟踪新的TCP连接
tcpconnect-bpfcc
# 输出: PID, 进程名, 目标IP, 目标端口
# 跟踪TCP连接生命周期
tcplife-bpfcc
# 输出: PID, 进程, 本地IP:端口, 远程IP:端口, 发送/接收字节, 连接时长(ms)
echo ""
echo "=== 5. 内存泄漏检测 ==="
# 跟踪内存分配(5秒)
memleak-bpfcc -p $PID 5
# 输出: 分配但未释放的内存,带调用栈
echo ""
echo "=== 6. CPU分析 ==="
# CPU火焰图采样(类似perf)
profile-bpfcc -adf -p $PID 30 > profile.stacks
# -a: 所有CPU
# -d: 包含时间戳
# -f: 输出折叠的调用栈
echo ""
echo "=== 7. Off-CPU分析 ==="
# 跟踪阻塞时间
offcputime-bpfcc -df -p $PID 30 > offcpu.stacks
# 找出程序在等什么
echo ""
echo "=== 8. 系统调用统计 ==="
# 统计系统调用次数和延迟
syscount-bpfcc -p $PID
# 输出: 系统调用名, 次数
echo ""
echo "=== 9. 页缓存统计 ==="
# 实时页缓存命中率
cachestat-bpfcc 1
# 输出: HITS, MISSES, DIRTIES, 命中率3.2 bpftrace脚本
bash
#!/usr/bin/env bpftrace
# bpftrace示例脚本
# 1. 跟踪open系统调用
tracepoint:syscalls:sys_enter_open
{
printf("%-6d %-16s %s\n", pid, comm, str(args->filename));
}
# 2. 统计读取的字节数
tracepoint:syscalls:sys_exit_read
/args->ret > 0/
{
@bytes[comm] = sum(args->ret);
}
END
{
printf("\nRead bytes by process:\n");
print(@bytes);
}
# 3. 测量函数延迟
kprobe:do_sys_open
{
@start[tid] = nsecs;
}
kretprobe:do_sys_open
/@start[tid]/
{
$duration = nsecs - @start[tid];
@latency_us = hist($duration / 1000);
delete(@start[tid]);
}
END
{
printf("\nopen() latency distribution (microseconds):\n");
print(@latency_us);
}
# 4. 跟踪TCP连接
kprobe:tcp_v4_connect
{
printf("TCP connect by PID %d (%s)\n", pid, comm);
}
# 5. 跟踪内存分配
tracepoint:kmem:kmalloc
{
@alloc_bytes[comm] = sum(args->bytes_alloc);
}
interval:s:1
{
printf("\nMemory allocation by process (last 1s):\n");
print(@alloc_bytes);
clear(@alloc_bytes);
}bash
#!/bin/bash
# bpftrace一行命令示例
# 统计系统调用
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
# VFS读取字节数
bpftrace -e 'kretprobe:vfs_read /retval > 0/ { @bytes = hist(retval); }'
# TCP连接延迟
bpftrace -e 'kprobe:tcp_v4_connect { @start[tid] = nsecs; }
kretprobe:tcp_v4_connect /@start[tid]/ {
@connect_latency_ms = hist((nsecs - @start[tid]) / 1000000);
delete(@start[tid]);
}'
# 进程CPU时间
bpftrace -e 'profile:hz:99 { @[comm] = count(); }'
# 页错误统计
bpftrace -e 'software:page-faults:1 { @[comm, pid] = count(); }'4. 内存性能分析
bash
#!/bin/bash
# 内存性能分析脚本
echo "=== 内存使用概览 ==="
free -h
# total used free shared buff/cache available
# Mem: 15Gi 8.0Gi 2.0Gi 500Mi 5.0Gi 6.5Gi
# Swap: 8.0Gi 1.0Gi 7.0Gi
# available: 可用内存(包含可回收的缓存)
# 如果available很低,可能有内存压力
echo ""
echo "=== 内存详细信息 ==="
cat /proc/meminfo | head -30
echo ""
echo "=== 页面换出/换入 ==="
vmstat 1 5
# si: swap in (从swap读入内存)
# so: swap out (从内存写入swap)
# 如果si/so频繁,说明内存不足
echo ""
echo "=== 进程内存使用 ==="
ps aux --sort=-%mem | head -10
echo ""
echo "=== Slab缓存 ==="
slabtop -o
# 内核slab分配器统计
echo ""
echo "=== 内存泄漏检测 ==="
# 使用valgrind
# valgrind --leak-check=full --show-leak-kinds=all ./program
# 使用memleak (eBPF)
# memleak-bpfcc -p $PID 30
echo ""
echo "=== OOM Killer日志 ==="
dmesg -T | grep -i "out of memory"
echo ""
echo "=== 大页内存 ==="
cat /proc/meminfo | grep -i huge
echo ""
echo "=== 内存性能计数器 ==="
perf stat -e 'cache-misses,cache-references,page-faults' ./program5. I/O性能分析
bash
#!/bin/bash
# I/O性能分析脚本
echo "=== 磁盘I/O统计 ==="
iostat -xz 1 5
# %util: 设备利用率 (接近100%表示饱和)
# await: 平均等待时间(ms)
# avgqu-sz: 平均队列长度
# r/s, w/s: 每秒读写次数
echo ""
echo "=== 进程I/O统计 ==="
iotop -b -n 1 -o
# -o: 只显示有I/O的进程
echo ""
echo "=== 块I/O跟踪 ==="
# 使用blktrace
# blktrace -d /dev/sda -o - | blkparse -i -
# 使用eBPF biosnoop
biosnoop-bpfcc
# 实时显示块I/O请求
echo ""
echo "=== I/O延迟分布 ==="
biolatency-bpfcc -D 10 1
# -D: 按磁盘分组
echo ""
echo "=== 文件系统I/O ==="
# 慢操作跟踪
fileslower-bpfcc 10 # 超过10ms的操作
# VFS统计
vfsstat-bpfcc 1
echo ""
echo "=== I/O调度器 ==="
for disk in /sys/block/sd*/queue/scheduler; do
echo "$disk: $(cat $disk)"
done
echo ""
echo "=== 磁盘队列深度 ==="
for disk in /sys/block/sd*/queue/nr_requests; do
echo "$disk: $(cat $disk)"
done6. 系统调优
6.1 内核参数调优
bash
#!/bin/bash
# 系统性能调优脚本
echo "=== 网络调优 ==="
# TCP连接优化
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.ipv4.tcp_max_tw_buckets=5000
# 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 87380 16777216'
# 连接数
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.ip_local_port_range='10000 65535'
echo ""
echo "=== 内存调优 ==="
# Swappiness (0-100)
sysctl -w vm.swappiness=10 # 减少swap使用
# 脏页回写
sysctl -w vm.dirty_ratio=10
sysctl -w vm.dirty_background_ratio=5
sysctl -w vm.dirty_writeback_centisecs=100
sysctl -w vm.dirty_expire_centisecs=200
# Overcommit
sysctl -w vm.overcommit_memory=1
sysctl -w vm.overcommit_ratio=50
# 大页内存
echo 1024 > /proc/sys/vm/nr_hugepages
echo ""
echo "=== CPU调优 ==="
# CPU Governor
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
echo performance > $cpu # 性能模式
done
echo ""
echo "=== I/O调优 ==="
# I/O调度器
for disk in /sys/block/sd*/queue/scheduler; do
echo mq-deadline > $disk # HDD用deadline, SSD用none
done
# 预读大小
for disk in /sys/block/sd*/queue/read_ahead_kb; do
echo 512 > $disk
done
# 队列深度
for disk in /sys/block/sd*/queue/nr_requests; do
echo 256 > $disk
done
echo ""
echo "=== 文件系统调优 ==="
# 挂载选项示例
# mount -o noatime,nodiratime,data=writeback /dev/sda1 /mnt
echo ""
echo "=== 保存设置 ==="
# 将设置写入/etc/sysctl.conf
# sysctl -p # 加载配置6.2 应用层优化
python
#!/usr/bin/env python3
"""
应用层性能优化示例
"""
import time
import cProfile
import pstats
from functools import lru_cache
from concurrent.futures import ThreadPoolExecutor
# 1. 使用缓存
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
# 2. 使用生成器(节省内存)
def read_large_file_bad(filename):
"""不好的做法: 一次读取整个文件"""
with open(filename) as f:
return f.readlines() # 占用大量内存
def read_large_file_good(filename):
"""好的做法: 使用生成器"""
with open(filename) as f:
for line in f:
yield line # 逐行处理
# 3. 并发处理
def process_item(item):
# 模拟耗时操作
time.sleep(0.1)
return item * 2
def parallel_processing(items):
"""并行处理"""
with ThreadPoolExecutor(max_workers=10) as executor:
results = list(executor.map(process_item, items))
return results
# 4. 性能分析
def profile_function():
"""使用cProfile分析函数"""
profiler = cProfile.Profile()
profiler.enable()
# 要分析的代码
result = fibonacci(30)
profiler.disable()
# 打印结果
stats = pstats.Stats(profiler)
stats.sort_stats('cumulative')
stats.print_stats(10)
if __name__ == '__main__':
# 运行性能分析
profile_function()
# 命令行分析:
# python -m cProfile -s cumulative script.py7. 性能监控与报警
bash
#!/bin/bash
# 性能监控脚本
THRESHOLD_CPU=80
THRESHOLD_MEM=90
THRESHOLD_DISK=85
monitor() {
while true; do
# CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if (( $(echo "$cpu_usage > $THRESHOLD_CPU" | bc -l) )); then
echo "[ALERT] High CPU usage: $cpu_usage%"
# 发送告警
fi
# 内存使用率
mem_usage=$(free | grep Mem | awk '{print ($3/$2) * 100.0}')
if (( $(echo "$mem_usage > $THRESHOLD_MEM" | bc -l) )); then
echo "[ALERT] High memory usage: $mem_usage%"
fi
# 磁盘使用率
df -h | awk '$5 > "'$THRESHOLD_DISK'%" {print "[ALERT] High disk usage on "$6": "$5}'
sleep 60
done
}
# Prometheus导出器示例
cat > /tmp/metrics.prom << 'EOF'
# HELP node_cpu_usage CPU usage percentage
# TYPE node_cpu_usage gauge
node_cpu_usage{cpu="all"} 45.2
# HELP node_memory_usage Memory usage percentage
# TYPE node_memory_usage gauge
node_memory_usage 62.5
# HELP node_disk_io_time Disk I/O time in ms
# TYPE node_disk_io_time counter
node_disk_io_time{device="sda"} 12345
EOF
echo "监控指标已导出到 /tmp/metrics.prom"8. 总结
本教程深入讲解了操作系统性能分析与调优:
核心知识点:
- 性能指标: USE方法、RED方法
- 工具链: perf、eBPF、ftrace
- 火焰图: On-CPU、Off-CPU分析
- eBPF: 零开销跟踪、动态插桩
- 系统调优: 内核参数、应用优化
实战技能:
- 使用perf定位CPU热点
- 生成和分析火焰图
- 使用eBPF工具进行深度分析
- 进行内存、I/O性能调优
- 配置性能监控
最佳实践:
- 先测量再优化
- 关注瓶颈而非平均值
- 使用P99/P999而非平均延迟
- 火焰图可视化分析
- 持续监控性能指标
- 逐步调优并验证
性能优化是一个持续迭代的过程!
💬 讨论
使用 GitHub 账号登录后即可参与讨论