Appearance
性能分析工具速查
按排查维度分类。每个工具一份独立文档,含常用命令、字段解读和结合 cpu_demo 的实操。
📌 这是工具索引。想看全仓库的知识地图、五层结构与推荐阅读路径,见根目录 ../overview.md。
按场景选工具
| 你想排查… | 先用 | 再深入 |
|---|---|---|
| 整机哪项资源是瓶颈 | vmstat | 按维度展开下面各项 |
| 进程 CPU 用户态/内核态 | top → pidstat | perf 定位函数 |
| CPU 负载是否压在单核 | mpstat | |
| 内核态(stime)高、狂调 syscall | pidstat | strace 抓系统调用 |
| 代码级热点(哪行烧 CPU) | perf | 火焰图 |
| IPC 低、stall 多、流水线效率差 | perf stat -e stalled-cycles-* | perf stat -e uops_* 分析微操作 |
| cache miss 高、分支预测失败 | perf stat -e cache-misses,branch-misses | perf c2c 定位伪共享 |
| 多线程+IO 混合程序初步分析 | perf多线程IO分析 三步法 | pidstat -t 拆线程 → 按模式深入 |
| 上下文切换频繁,调度不健康 | scheduling-observation | pidstat -w + perf sched |
| 调度策略是否正确/有实时任务在捣乱 | chrt | ps -eo class,rtprio |
| iowait 高,磁盘瓶颈 | iostat | iotop / pidstat -d 找进程 |
IO 延迟高但 %util 不高(SSD/NVMe) | iostat await aqu-sz | 不看 %util,看延迟和队列 |
| 磁盘空间满 / Inode 用完 | df -h / df -i | lsof +L1 找 deleted 文件占用 |
| 内存是否不足/泄漏 | free | vmstat 看 si/so |
| OOM Killer 杀了进程 | dmesg | grep -i killed | cat /proc/<PID>/oom_score 看谁评分高 |
| Swap 在持续增长 | free -h + vmstat 1 si/so | pidstat -r 看谁在 majflt |
| 脏页堆积、写性能下降 | cat /proc/meminfo | grep Dirty | iotop 找写入进程 + vm.dirty_ratio 调优 |
| Slab 内存高 / 内核内存泄漏 | cat /proc/meminfo | grep SUnreclaim | slabtop / cat /proc/slabinfo |
| THP 大页导致延迟尖峰 | cat /proc/meminfo | grep AnonHuge | echo never > /sys/kernel/mm/transparent_hugepage/enabled |
| VIRT≫RES/大块内存/共享内存/映射文件 | mmap | /proc/$PID/maps 看 VMA、strace 抓 mmap |
| CPU 没满/内存够、程序却慢(多路机) | numa | numastat 看远程访问 → numactl 绑定 |
| 多线程反而比单线程慢、cache-miss 高 | mesi(伪共享) | perf c2c 定位 cache line |
| 网络连接/端口/软中断 | ss | mpstat 看 %soft |
| TIME-WAIT 过多 / CLOSE-WAIT 堆积 | ss -tan state time-wait | wc / ss -tan state close-wait | 调 tcp_tw_reuse 或修复应用 close 逻辑 |
| TCP 重传率高 / 丢包 | sar -n ETCP 1 / ss -ti | tcpretrans 工具 / 抓包 tcpdump |
| 网卡丢包/错误 | sar -n EDEV 1 rxdrop/txdrop | ethtool -g 调 ring buffer / 网卡多队列 |
| 监听队列溢出(SYN Cookie) | nstat -az | grep Listen / SyncookiesSent | 调大 somaxconn 和 tcp_max_syn_backlog |
| 打开的文件/fd 泄漏/端口占用 | lsof | |
| 进程 fd 接近 ulimit | cat /proc/<PID>/limits + ls /proc/<PID>/fd | wc -l | 调大 nofile 或修复 fd 泄漏 |
| Cgroup 限制导致性能降级 | cat /sys/fs/cgroup/memory/memory.limit_in_bytes | 检查 cgroup throttle 计数器 |
| 偶发/已过去的问题,事后复盘 | sar | |
| 进程崩溃了(段错误/abort/死锁) | core-dump | GDB 加载 core 还原现场 |
关键系统指标速查——看什么、怎么看、判什么
排查性能问题,围绕 CPU、内存、磁盘 IO、网络、调度、NUMA、进程资源七个维度找瓶颈。下表把每个维度的关键指标(含英文缩写/全称)、用什么工具看、正常/异常判据汇总在一起。
CPU(处理器)
| 指标 | 缩写/英文 | 工具 | 正常 | 异常信号 |
|---|---|---|---|---|
| 系统负载(1/5/15 分钟均值) | LA / Load Average | top, uptime | LA ≈ CPU 核数 | LA 持续 >> 核数 → 任务严重排队 |
| 运行队列长度 | Run Queue (r) | vmstat 1 | r ≤ CPU 核数 | r 持续 > 核数 → CPU 过载 |
| 阻塞队列长度 | Blocked Queue (b) | vmstat 1 | b ≈ 0 | b 持续 > 0 → 有任务卡在 IO |
| CPU 用户态占比 | %usr / %User | mpstat -P ALL 1 | 视业务而定 | 单核 %usr 满其余空闲 → 单线程瓶颈 |
| CPU 内核态占比 | %sys / %System | mpstat -P ALL 1 | 视业务而定 | 异常高 → 频繁系统调用;配合 strace 深度排查 |
| CPU IO 等待占比 | %iowait / %wa | mpstat -P ALL 1, top | < 5% | > 20% → IO 瓶颈;但高 iowait + 低 CPU 并非真忙 |
| CPU 空闲占比 | %idle / %id | mpstat -P ALL 1, top | > 10% | 长期接近 0 → CPU 打满 |
| 软中断占比 | %soft / %SoftIRQ | mpstat -P ALL 1 | 各核均匀 | 集中在单核(尤其 CPU0)→ 网卡没开多队列 / RPS 配置不当 |
| 硬中断占比 | %irq / %HardIRQ | mpstat -P ALL 1 | < 1% | 异常高 → 中断风暴,看 mpstat -I CPU |
| 被宿主偷走的 CPU | %steal / %st | mpstat -P ALL 1 | ≈ 0 | > 5% → 云主机宿主超卖 |
| 上下文切换速率 | CS / Context Switches | vmstat 1, pidstat -w 1 | 视负载 | 每核每毫秒 > 1 次 → 线程过多/锁竞争(深入用 perf lock) |
| 中断速率 | in / Interrupts | vmstat 1 | 视业务 | 异常飙升 → 网卡/磁盘中断风暴 |
| IPC(每周期指令数) | IPC / Instructions Per Cycle | perf stat -e instructions,cycles | > 1.0(现代 CPU) | < 0.5 → 流水线停滞严重,用 perf stat -e stalled-cycles-* 分析 |
| 缓存命中率 | Cache Miss Ratio | perf stat -e cache-misses,cache-references | Miss < 3% | > 10% → cache 利用率差,关注数据布局/伪共享 |
| 分支预测失败率 | Branch Miss Ratio | perf stat -e branch-misses,branches | < 1% | > 5% → 分支密集型代码或预测表被频繁冲刷 |
| stall 周期(前端/后端) | Frontend/Backend Stalls | perf stat -e stalled-cycles-frontend,stalled-cycles-backend | — | Frontend 高 → 指令获取瓶颈;Backend 高 → 内存/执行单元瓶颈 |
| CPU 频率/调度器 | Scaling Governor / Frequency | cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor | performance | powersave → CPU 可能降频,影响延迟敏感型应用 |
| 进程数/线程数 | Process/Thread Count | ps aux | wc -l, cat /proc/loadavg 的 nr_running | 视业务 | 线程数远超 CPU 核数 × 合理倍率 → 上下文切换开销增大 |
Memory(内存)
| 指标 | 缩写/英文 | 工具 | 正常 | 异常信号 |
|---|---|---|---|---|
| 真正可用内存 | Available / MemAvailable | free -h | 充足 | < 5% total → 内存吃紧,随时可能 OOM |
| 空闲内存 | Free / MemFree | free -h | — | 低 = 正常(被缓存利用),关键看 Available |
| 缓冲区/页缓存 | Buff/Cache / buffers + cached | free -h, cat /proc/meminfo | — | 过大 + Available 低 = 可回收但被锁定 |
| Swap 使用量 | Swap Used / SwapUsed | free -h | ≈ 0 | 持续增长 → 内存压力在累积 |
| Swap 换入速率 | si / Swap In | vmstat 1 | 0 | 持续 > 0 → 严重内存不足,性能急剧下降 |
| Swap 换出速率 | so / Swap Out | vmstat 1 | 0 | 持续 > 0 → 内核在大量回收匿名页 |
| 主缺页(触发磁盘 IO) | Major Page Fault / majflt | pidstat -r 1 | ≈ 0 | 持续非 0 → 频繁从磁盘换入/mmap IO,极大影响延迟 |
| 次缺页(仅内核映射) | Minor Page Fault / minflt | pidstat -r 1, time -v | — | 极高 → 频繁分配新页或 COW,一般开销远小于 majflt |
| 脏页量 | Dirty Pages / Dirty | cat /proc/meminfo | grep Dirty | < 几百 MB | 持续几 GB → 回写卡住或应用在大量写入 |
| Slab 可回收/不可回收 | SReclaimable / SUnreclaim | cat /proc/meminfo | — | SUnreclaim 持续增长 → 内核内存泄漏(驱动/socket/文件系统) |
| 透明大页 | THP / AnonHugePages | cat /proc/meminfo | grep AnonHuge | 视应用 | 零散的 AnonHugePages → THP 生效中;某些数据库(Redis/MySQL)建议关闭 |
| 大页 | HugePages | cat /proc/meminfo | grep HugePages | — | 预留了但未使用 → 浪费内存;不够用 → 应用启动失败 |
| OOM 分数 | OOM Score / oom_score | cat /proc/<PID>/oom_score | — | 接近 1000 → 下一个被 OOM Killer 杀掉的候选 |
| OOM 被杀记录 | OOM Kill | dmesg | grep -i "killed process" | 无 | 有记录 → 曾经内存不足触发了 OOM |
| 内存超卖率 | Overcommit Ratio | cat /proc/meminfo | grep Commit | Committed_AS < CommitLimit | 接近或超过 CommitLimit → 后续内存分配可能失败 |
| VIRT vs RES | VIRT (Virtual) / RES (Resident) | top RES/SHR 列 | VIRT >> RES 正常 | RES 持续增长 → 进程内存在泄漏;RES 接近 VIRT → 大量页未换出 |
| PSS(按比例分摊内存) | PSS / Proportional Set Size | cat /proc/<PID>/smaps_rollup | grep Pss | — | 用于评估多进程共享库的真实内存开销 |
| 内存带宽 | Memory B/W | perf stat -e uncore_imc*/ | — | 打满 → 计算密集型应用瓶颈在内存带宽 |
Disk IO(磁盘 IO)
| 指标 | 缩写/英文 | 工具 | 正常 | 异常信号 |
|---|---|---|---|---|
| 读/写 IOPS | r/s w/s / Read/Write IOPS | iostat -x 1 | 视盘类型 | 机械盘 > 200 → 可能到瓶颈;SSD 可达数万 |
| 读/写吞吐量 | rkB/s wkB/s / Read/Write Throughput | iostat -x 1 | 视盘类型 | 接近磁盘带宽上限 |
| IO 延迟 | await / Average Wait Time | iostat -x 1 | 机械盘 < 20ms,SSD < 1ms,NVMe < 0.2ms | 持续高 → 盘慢或请求在排队(也看 r_await w_await 拆开分析) |
| 读/写延迟 | r_await w_await / Read/Write Latency | iostat -x 1 | 同上 | 读远高于写 → 读密集型 IO 瓶颈;写高 → 写拥塞 |
| 平均队列深度 | avgqu-sz / aqu-sz / Average Queue Size | iostat -x 1 | < 1 | > 2 且持续 → IO 请求在堆积 |
| 设备占用率 | %util / Device Utilization | iostat -x 1 | — | 仅机械盘可参考:近 100% = 打满;SSD/NVMe 多队列下会失真 |
| 平均请求大小 | avgrq-sz rareq-sz wareq-sz / Avg Request Size | iostat -x 1 | — | 几 KB → 随机小 IO;几百 KB → 顺序大 IO |
| 合并请求数 | rrqm/s wrqm/s / Read/Write Merge | iostat -x 1 | 有合并 = 正常 | 合并不多 → 应用在做大量小 IO,核 IO 调度器可优化 |
| 磁盘空间使用 | Disk Usage | df -h | < 85% | > 90% → 接近满,可能触发写性能下降(碎片)或写入失败 |
| Inode 使用 | Inode Usage | df -i | < 85% | 100% → 磁盘有空间但无法创建新文件(小文件过多) |
| 哪个进程在读写 | Process IO | iotop -o, pidstat -d 1 | — | 找 DISK READ/WRITE 和 IO> 最高的进程,iodelay 高的线程 |
| 进程 IO 延迟 | IODelay | pidstat -d 1 | ≈ 0 | 持续 > 几十 ms → 该进程/线程正在等磁盘 |
| 文件系统错误 | FS Errors | dmesg | grep -i "I/O error", cat /sys/fs/ext4/*/errors_count | 0 | 非零 → 硬件故障或有坏块 |
Network(网络)
| 指标 | 缩写/英文 | 工具 | 正常 | 异常信号 |
|---|---|---|---|---|
| TCP 连接状态分布 | TCP States | ss -s, ss -tan | 视业务 | TIME-WAIT 上万 → 短连接过多;CLOSE-WAIT 堆积 → 应用忘了 close()(连接泄漏);SYN-SENT 多 → 连不上对端 |
| ESTABLISHED 连接数 | Established Count | ss -tan state established | wc -l | 视业务 | 接近 net.core.somaxconn → 连接建立受限 |
| 接收队列积压 | Recv-Q | ss -tanp | 0 | 持续 > 0 → 应用程序消费太慢 |
| 发送队列积压 | Send-Q | ss -tanp | 视情况 | 持续 > 0 → 对端窗口关闭或本地发送过快 |
| 收发吞吐量 | rxkB/s txkB/s / RX/TX Throughput | sar -n DEV 1 | 视带宽 | 接近 NIC 线速 → 带宽打满 |
| 收发包速率 | rxpck/s txpck/s / Packets Per Second | sar -n DEV 1 | 视业务 | PPS 高 + 小包多(< 64B)→ 包速率打满 CPU(中断风暴),需开网卡多队列/RPS |
| TCP 重传率 | TCP Retransmission | ss -ti | grep retrans, sar -n ETCP 1 | < 0.1% | > 1% → 丢包严重,网络质量差或对端窗口慢 |
| RTT(往返时延) | RTT / Round-Trip Time | ss -ti | grep rtt | < 10ms(同机房) | 几百 ms → 跨地域/拥塞/对端慢 |
| 网卡错误 | NIC Errors | sar -n EDEV 1, ifconfig/ip -s link | 0 | RX errors → 物理层问题;TX errors → 网卡/驱动问题 |
| 网卡丢包 | NIC Drops | sar -n EDEV 1 rxdrop/s txdrop/s | 0 | 持续 > 0 → 网卡 buffer 不足/应用处理太慢/中断不均衡 |
| 监听队列溢出 | ListenDrops / ListenOverflows | nstat -az | grep -i listen | 0 | 非零 → net.core.somaxconn 或应用 backlog 太小 |
| 软中断 CPU 分布 | %soft Distribution | mpstat -P ALL 1 | 各核均匀 | 集中在 CPU0 → 网卡没开多队列;RPS/RFS 未配置或配置不当 |
| Socket 缓冲区 | Socket Buffer / rmem wmem | ss -m / getsockopt | 视场景 | 默认 128KB~几 MB(自动伸缩);高吞吐场景需调大 tcp_rmem/tcp_wmem |
| 拥塞窗口 | Cwnd / Congestion Window | ss -ti | grep cwnd | 视 RTT | ssthresh 已被压低 → 曾发生过拥塞 |
| SYN Cookie 触发 | SYN Cookie | nstat -az | grep SyncookiesSent | 0 | 非零 → SYN 洪水攻击或短连接并发过高 |
| 连接速率 | Connection Rate | sar -n TCP 1 active/s passive/s | 视业务 | 被动打开速率 > 几万/s → 短连接频繁,检查连接池复用 |
| 网卡环形缓冲区 | NIC Ring Buffer | ethtool -g <iface> | RX/TX 最大值 | 实际值过小 → 高 PPS 下丢包 |
| 多队列/中断亲和性 | IRQ Affinity | cat /proc/interrupts | grep <iface> | 中断分散到不同核 | 所有队列中断在同一个核 → 多队列未生效 |
Scheduling(调度)
| 指标 | 缩写/英文 | 工具 | 正常 | 异常信号 |
|---|---|---|---|---|
| 自愿上下文切换 | Voluntary CS / cswch/s | pidstat -w 1 | 视负载 | 很高 → 进程频繁主动阻塞(IO/锁/睡眠),可能有不必要的 sleep 或低效的 IO |
| 非自愿上下文切换 | Involuntary CS / nvcswch/s | pidstat -w 1 | 视负载 | > 几千/s → CPU 竞争激烈,时间片被抢或线程过多 |
| 调度延迟 | Scheduler Latency | perf sched latency | 微秒级 | 毫秒级 → 实时性差,线程迟迟得不到 CPU |
| 调度等待时间 | Scheduler Wait Time | perf sched script 分析 | — | 等待时间占运行时间 > 50% → CPU 竞争严重 |
| CPU 迁移次数 | CPU Migration | perf stat -e migrations, pidstat -u 1 CPU 列 | 偶尔 | 频繁跳核 → 缓存变冷,用 numactl/taskset 绑核 |
| 实时任务优先级 | RT Priority / SCHED_FIFO/SCHED_RR | ps -eo class,rtprio,comm, chrt -p <PID> | 无或很少 | 高优先级实时任务存在 → 可能饿死普通任务 |
| 调度策略 | Scheduling Policy | chrt -p <PID>, ps -eo class | SCHED_OTHER (TS) | 大量 SCHED_FIFO → 需确认是否有失控的实时线程 |
| Nice 值 | Nice Value | top NI 列, ps -eo ni | 0 | -20 → 极高优先级;19 → 最低优先级 |
NUMA(非一致性内存访问)
| 指标 | 缩写/英文 | 工具 | 正常 | 异常信号 |
|---|---|---|---|---|
| NUMA 命中/未命中 | NUMA Hit / Miss | numastat | numa_miss ≈ 0 | other_node 占比高 → 大量远程内存访问,延迟翻倍 |
| 进程内存分布 | Per-process NUMA Map | numastat -p <PID> | 均衡或集中在本地节点 | 进程内存大量在远程节点 → 绑核但忘绑内存,考虑 --membind |
| 节点间距离 | Node Distance | numactl --hardware | — | 距离 > 20 → 远程访问延迟是本地 2 倍以上 |
| 各节点可用内存 | Node Free Memory | numactl -H | 各节点均衡 | 某节点 free 接近 0 → 新分配必然走远程 |
| 内存策略 | Mem Policy | cat /proc/<PID>/numa_maps | head | default 更常见 | interleave → 可能在"解决"不存在的均衡问题 |
Process(进程资源)
| 指标 | 缩写/英文 | 工具 | 正常 | 异常信号 |
|---|---|---|---|---|
| 文件描述符数 | FD Count / File Descriptors | ls /proc/<PID>/fd | wc -l, lsof -p <PID> | wc -l | 视业务 | 接近 ulimit -n → 可能泄漏或 fd 复用不足 |
| FD 打开上限 | FD Limit / nofile | ulimit -n, cat /proc/<PID>/limits | 视业务 | 太小(如默认 1024)→ 高并发服务必然不够 |
| 进程状态 | Process State (R/S/D/Z/T) | ps -eo pid,state,comm, top | R 或 S 为主 | D → 不可中断睡眠(等 IO 且无法信号唤醒,严重);Z → 僵尸进程 |
| 进程线程数 | Thread Count | cat /proc/<PID>/status | grep Threads | 视业务 | 线程数 >> CPU 核数 × 合理倍率 → 调度开销大 |
| VIRT vs RES vs SHR | Virtual / Resident / Shared Memory | top, ps aux | VIRT >> RES 正常 | RES 持续单调增长 → 内存泄漏 |
| OOM 调整值 | oom_score_adj | cat /proc/<PID>/oom_score_adj | 0 | -1000 → 永不杀;+1000 → 优先杀 |
| Cgroup 限制 | Cgroup Limits | cat /sys/fs/cgroup/memory/<slice>/memory.limit_in_bytes | — | 进程 RSS 接近 cgroup 限制 → 即将被限流或 OOM |
| CPU Cgroup 配额 | Cgroup CPU Quota | cat /sys/fs/cgroup/cpu/<slice>/cpu.cfs_quota_us | -1(无限制) | 配额 < 周期 → 进程被限流,即使有空闲 CPU |
| Page Fault 总计 | Total Page Fault | cat /proc/<PID>/stat 第 10/12 字段 | — | minflt 极高 → 内存分配频率高;majflt 非零 → 触发磁盘 IO |
排查顺序:先看
vmstat(定大方向)→ 按上表对应维度用专项工具 → 落到进程/函数级用perf/strace。不是所有指标同时看——在哪一列发现异常,就深入那一列的工具链。
在线小工具(纯前端,数据不上传)
- JSON 在线格式化 / 校验 —— 粘贴 JSON 自动美化、折叠、校验,基于开源 jsoneditor 库
开发工具
- Claude Code CLI 使用教程 —— 终端 AI 编程 Agent:安装、命令、快捷键、CLAUDE.md、钩子、MCP 一站式手册
- CodeGraph —— 给 AI Agent 一张本地代码地图:预构建语义知识图谱,通过 MCP 与 Claude Code 协作
- AI 编程工具总纲 —— 工具选型、四级演化、核心概念(Agent/Skill/CLAUDE.md)
分类目录(工具)
本目录只放可观测工具(讲某个命令怎么用)。底层原理文档(缓存/CPU 微架构/内存序/进程线程内核/ELF)已移到 ../concepts/;崩溃排查在 ../crash/。全局地图见 ../overview.md。
CPU 与进程 — cpu/
📌 子目录总纲:cpu/README.md —— 整机→进程→单核→调度 逐级下钻
- cpu/vmstat.md —— 整机 CPU/内存/IO/调度 一屏概览
- cpu/top.md —— 实时进程/系统总览
- cpu/pidstat.md —— 按进程/线程拆分 CPU、IO、上下文切换
- cpu/mpstat.md —— 按 CPU 核心拆分利用率与中断分布
- cpu/scheduling-observation.md —— 观察系统调度全貌:队列长度、上下文切换模式、核间迁移、实时任务
- cpu/chrt.md —— 查看/修改进程调度策略与实时优先级
代码级定位 — code/
📌 子目录总纲:code/README.md —— perf/火焰图/strace 代码级分析
- code/perf.md —— 采样调用栈 + 火焰图,定位函数/代码行
- code/perf-internals.md —— perf 原理:perf_event_open/PMU 采样/mmap 环形缓冲区/数据如何落盘到 perf.data/libperf 编程
- code/perf-advanced.md —— perf高级使用指南:硬件性能计数器、汇编级分析、内核追踪、缓存伪共享分析、锁竞争分析、调度器分析
- code/strace.md —— 追踪系统调用,定位 stime 高的元凶
- code/gdb.md —— GNU 调试器系统教程:崩溃还原/死锁定位/逻辑错误,断点观测点/执行控制/内存检视/多线程/core 分析/批处理
磁盘 IO — disk/
📌 子目录总纲:disk/README.md —— iostat 看盘、iotop 看进程
- disk/iostat.md —— 磁盘 IO 与设备利用率/延迟
- disk/iotop.md —— 按进程实时排查磁盘 IO
内存 — memory/
📌 子目录总纲:memory/README.md —— free 看内存够不够
- memory/free.md —— 内存与 swap 使用
NUMA(多路机器内存亲和性)— 工具 — numa/
📌 子目录总纲:numa/README.md —— numastat 查远程访问、numactl 做绑定
- numa/numactl.md —— 查看拓扑 & 把进程/内存绑到指定节点
- numa/numastat.md —— 按节点看内存命中/未命中,定位远程访问
- (NUMA 概念详解见 ../concepts/numa/numa.md)
网络与句柄 — network/
📌 子目录总纲:network/README.md —— ss 看连接、lsof 看 fd、mpstat 看软中断
- network/ss.md —— 套接字/连接状态(netstat 替代)
- network/lsof.md —— 打开的文件/套接字/句柄
- network/rdma.md —— RDMA 远程内存直接访问:原理、IB/RoCE/iWARP、及与 NUMA 的关系
历史采样 — history/
📌 子目录总纲:history/README.md —— sar 事后复盘
- history/sar.md —— 后台持续记录,事后回看
内核接口(数据源总枢纽) — proc/
📌 子目录总纲:proc/README.md —— /proc 读数据、/sys+sysctl 写配置
- proc/procfs.md —— /proc 虚拟文件系统详解:读它=内核现场生成状态快照、三大类(进程级 /proc/<pid>/ · 系统级 meminfo/stat/cpuinfo · 可写的 /proc/sys/sysctl)、几乎所有性能工具的共同数据源、与 /sys 的分工
- proc/kernel-tuning.md —— 内核配置/调优入口地图:往哪写配置(sysctl=/proc/sys 全局参数 · /sys 具体设备属性 · GRUB 启动参数 · 模块参数/ethtool/tuned/ulimit)、临时 vs 永久、一个参数该选哪个入口的决策
- proc/tuned.md —— tuned/tuned-adm 调优配置集:profile 概念/内置常用 profile 速查/自定义 profile(include 继承)/插件机制/生产环境实践
两条排查主线
性能问题(进程活着但慢/忙)和崩溃问题(进程死了)是两条线:
- 性能 → 用下面的实时工具,见"标准排查流程"
- 崩溃(
Segmentation fault、abort、死锁)→ 看 crash/core-dump.md:还原案发现场 - 底层基础 → ../concepts/ 的 ELF 部分讲清楚可执行文件/库/core 的格式,是符号、链接、core 分析问题的根。perf 读符号、gdb 解析 core、strip 分离调试信息,本质都在操作 ELF。
为什么这些工具必须组合使用、各自的不可替代性 → 详见 tools/compare.md(perf 与传统监控工具的定位对比与互补关系);逐工具深度对比与四层下钻综合使用法 → 详见 tool-perf-comprehensive-guide.md
标准排查流程
bash
vmstat 1 # ① 定大方向:CPU?内存?IO?调度?
├─ CPU 高 → top -H → pidstat -ut → perf record(+ strace 若 stime 高)
├─ r 队列高 → mpstat -P ALL 看单核分布 → perf stat 看 IPC/cache/stall
├─ IO 高 / wa 高 → iostat -x → iotop / pidstat -d
├─ 内存紧 → free -h → vmstat 看 si/so → 看 /proc/meminfo 查脏页/Slab
├─ 网络 → ss -s → sar -n DEV/ETCP → mpstat -P ALL 看 %soft
├─ 调度 → pidstat -w 区分 cswch/nvcswch → perf sched latency
├─ NUMA → numastat 看远程访问 → numactl -H 看拓扑
└─ 进程资源 → /proc/<PID>/fd 看 fd → /proc/<PID>/status 看线程数/内存靶子程序见
../demos/cpu-demo/main.cpp和手册 ../README.md:cd demos/cpu-demo && make && ./cpu_demo选场景,即可用上面的工具实操。