当前位置:首页>Linux>Linux 系统性能排查实战:从 top 到 perf 的完整排障流程

Linux 系统性能排查实战:从 top 到 perf 的完整排障流程

  • 2026-02-08 12:09:51
Linux 系统性能排查实战:从 top 到 perf 的完整排障流程

Linux 系统性能排查实战:从 top 到 perf 的完整排障流程

一、概述

1.1 背景介绍

线上服务响应变慢、load 飙高、进程被 OOM Killer 干掉——这些问题每个运维都会遇到。性能排查不是靠猜,而是靠方法论和工具链。本文基于 Brendan Gregg 提出的 USE 方法论(Utilization 利用率 / Saturation 饱和度 / Errors 错误数),从 CPU、内存、磁盘 IO、网络四个维度,给出一套完整的分层排查流程。

USE 方法论的核心思路:对每一类系统资源,依次检查三个指标:

  • Utilization(利用率):资源忙碌的时间百分比,如 CPU 使用率 90%
  • Saturation(饱和度):资源过载后排队的程度,如 CPU run queue 长度
  • Errors(错误数):错误事件计数,如网卡 CRC 错误、磁盘 IO 错误

实测下来,按这个框架排查,90% 以上的性能问题能在 15 分钟内定位到根因。

1.2 技术特点

  • 系统化:四维度分层排查,不遗漏,不瞎猜
  • 工具链完整:从 top/vmstat 快速概览到 perf/bcc-tools 深入分析,覆盖从应用层到内核层
  • 可复现:每个步骤给出具体命令和参数,直接复制执行
  • 生产验证:所有命令和参数都在 CentOS 7/8、Ubuntu 20.04/22.04 线上环境验证过

1.3 适用场景

  • 场景一:线上服务响应时间突然变长,需要快速定位瓶颈在 CPU、内存、IO 还是网络
  • 场景二:服务器 load average 持续飙高,但不确定是 CPU 密集还是 IO 等待导致
  • 场景三:进程被 OOM Killer 杀掉,需要分析内存使用情况和泄漏点
  • 场景四:网络丢包或延迟增大,需要从协议栈到网卡逐层排查

1.4 环境要求

组件
版本要求
说明
操作系统
CentOS 7+ / Ubuntu 20.04+
内核版本建议 4.9+,perf 和 BPF 支持更完善
sysstat
11.0+
提供 mpstat、iostat、pidstat、sar 等工具
perf
与内核版本匹配
linux-tools-$(uname -r)
bcc-tools
0.12+
基于 eBPF 的高级追踪工具集,需要内核 4.9+
dstat
0.7+
替代 vmstat/iostat 的综合监控工具(部分发行版已用 dool 替代)

二、详细步骤

2.1 准备工作

2.1.1 系统检查

# 检查系统版本cat /etc/os-release# 检查内核版本(perf 和 bcc-tools 对内核版本有要求)uname -r# 检查资源状况free -hdf -hnproc

2.1.2 安装依赖(CentOS 7/8)

# CentOS 7yum install -y sysstat perf iotop dstat strace lsof net-tools# CentOS 8 / Rocky Linux 8dnf install -y sysstat perf iotop dstat strace lsof# 安装 bcc-tools(CentOS 8)dnf install -y bcc-tools bcc-tools-doc# 启动 sysstat 数据采集(默认每 10 分钟采集一次)systemctl enable --now sysstat

2.1.3 安装依赖(Ubuntu 20.04/22.04)

apt updateapt install -y sysstat linux-tools-$(uname -r) iotop dstat strace lsof# 安装 bcc-toolsapt install -y bpfcc-tools linux-headers-$(uname -r)# 启用 sysstat 数据采集sed -i 's/ENABLED="false"/ENABLED="true"/' /etc/default/sysstatsystemctl enable --now sysstat

2.1.4 确认工具可用

# 逐个确认mpstat -Viostat -Vpidstat -Vperf --version

注意:perf 版本必须和内核版本匹配。如果 perf --version 报错,检查是否安装了对应内核版本的 linux-tools 包。Ubuntu 上经常因为内核升级后没装新的 linux-tools 导致 perf 不可用。

2.2 全局概览:60 秒快速诊断

拿到一台"有问题"的服务器,先用 60 秒做全局概览,确定瓶颈方向。这套流程来自 Netflix 的 Brendan Gregg,我们团队在此基础上做了调整。

2.2.1 uptime — 看 load average 趋势

uptime

输出示例:

 14:23:15 up 45 days,  3:12,  2 users,  load average: 28.53, 18.74, 12.01

解读要点

  • load average 三个值分别是 1 分钟、5 分钟、15 分钟的平均值
  • 1 分钟 > 5 分钟 > 15 分钟:负载在上升,问题正在发生
  • 1 分钟 < 5 分钟 < 15 分钟:负载在下降,问题可能已缓解
  • load average 的绝对值要和 CPU 核数对比。8 核机器 load 8 表示刚好满载,load 28 表示严重过载
  • load average 包含 D 状态(不可中断睡眠)进程,所以 load 高不一定是 CPU 忙,可能是 IO 等待

2.2.2 top — 全局资源概览

top -bn1 | head -20

重点关注第一屏的几个指标:

top - 14:23:15 up 45 days,  3:12,  2 users,  load average: 28.53, 18.74, 12.01Tasks: 312 total,   3 running, 308 sleeping,   0 stopped,   1 zombie%Cpu(s): 72.3 us, 12.1 sy,  0.0 ni,  8.2 id,  5.8 wa,  0.0 hi,  1.6 si,  0.0 stMiB Mem :  15921.4 total,    312.8 free,  12847.2 used,   2761.4 buff/cacheMiB Swap:   4096.0 total,   2048.0 free,   2048.0 used.   2156.3 avail Mem

关键指标解读

指标
含义
告警信号
us
用户态 CPU
持续 > 80% 说明应用层 CPU 密集
sy
内核态 CPU
持续 > 20% 说明系统调用频繁或锁竞争
wa
IO 等待
> 5% 说明有 IO 瓶颈
st
虚拟机被宿主机偷走的 CPU
> 5% 说明宿主机超卖严重
si
软中断
偏高通常是网络包处理导致
zombie
僵尸进程
> 0 需要排查父进程

2.2.3 vmstat — 系统级快照

vmstat 1 10

输出示例:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 8  3 204800 320480  12048 2832640    2   12   128  2048 8521 15234 72 12  8  6  2 6  5 204800 318240  12048 2832640    0    0     0  4096 9012 16432 68 15  5 10  2

关键列解读

  • r:运行队列长度。大于 CPU 核数说明 CPU 饱和
  • b:不可中断睡眠进程数(通常是 IO 等待)。持续 > 0 说明有 IO 瓶颈
  • si/so:swap in/out。持续 > 0 说明内存不足,正在使用 swap
  • bi/bo:块设备读写(KB/s)
  • in:中断数/秒
  • cs:上下文切换数/秒。实测超过 10 万/秒需要关注
  • wa:IO 等待百分比

2.2.4 dstat — 综合实时监控

dstat -tcmsdnl --top-cpu --top-io 5

dstat 的优势是把 CPU、内存、磁盘、网络整合在一个视图里,颜色高亮,适合实时观察。参数说明:

  • -t:显示时间戳
  • -c:CPU 统计
  • -m:内存统计
  • -s:swap 统计
  • -d:磁盘统计
  • -n:网络统计
  • -l:load average
  • --top-cpu:显示 CPU 占用最高的进程
  • --top-io:显示 IO 最高的进程

2.3 CPU 深入排查

当全局概览发现 CPU 是瓶颈时(us+sy 高、wa 低、r 值大),进入 CPU 深入排查。

2.3.1 mpstat — 查看每个 CPU 核心的使用情况

mpstat -P ALL 1 5

输出示例:

CPU    %usr   %nice    %sys %iowait   %irq   %soft  %steal  %idleall    72.31   0.00   12.08    5.82    0.00    1.58    0.00    8.21  0    98.02   0.00    1.98    0.00    0.00    0.00    0.00    0.00  1    45.10   0.00    8.82    2.94    0.00    0.00    0.00   43.14  2    95.05   0.00    3.96    0.00    0.00    0.99    0.00    0.00  3    51.49   0.00   33.66   20.79    0.00    5.94    0.00    0.00

排查要点

  • 如果某个核 100% 而其他核空闲 → 单线程应用瓶颈,或者中断没有分散(检查 /proc/interrupts
  • %sys 某个核特别高 → 可能是锁竞争或系统调用密集
  • %soft 某个核特别高 → 网络软中断集中在一个核上,需要配置 RPS/RFS 或 irqbalance

2.3.2 pidstat — 定位 CPU 占用进程

# 每秒采样,显示 CPU 使用率pidstat -u 1 5# 只看 CPU 使用率 > 10% 的进程pidstat -u 1 5 | awk 'NR<=3 || $8>10'# 查看指定进程的线程级 CPU 使用pidstat -u -t -p <PID> 1 5

2.3.3 perf top — 实时查看 CPU 热点函数

# 实时查看系统级 CPU 热点perf top# 只看指定进程perf top -p <PID># 只看用户态函数perf top -p <PID> --no-children -U

注意:perf top 默认需要 root 权限。如果普通用户需要使用,调整内核参数:

# 0=不限制 1=限制内核态 2=限制内核态+用户态# 生产环境建议设为 1,不要设为 0echo 1 > /proc/sys/kernel/perf_event_paranoid# 持久化echo'kernel.perf_event_paranoid = 1' >> /etc/sysctl.d/99-perf.confsysctl -p /etc/sysctl.d/99-perf.conf

2.3.4 perf record + perf report — 采样分析

# 对整个系统采样 30 秒perf record -ag -- sleep 30# 对指定进程采样 30 秒perf record -p <PID> -g -- sleep 30# 查看报告perf report --no-children --sort comm,dso,symbol# 生成火焰图(需要 FlameGraph 工具)perf script | /opt/FlameGraph/stackcollapse-perf.pl | /opt/FlameGraph/flamegraph.pl > cpu_flame.svg

火焰图安装

git clone https://github.com/brendangregg/FlameGraph.git /opt/FlameGraph

火焰图的解读:

  • 横轴是采样比例,越宽说明该函数占 CPU 时间越多
  • 纵轴是调用栈,从下到上是调用关系
  • 重点看"平顶"的函数,那就是 CPU 热点

2.3.5 上下文切换分析

# 系统级上下文切换统计vmstat 1 | awk '{print $12, $13}'# 进程级上下文切换pidstat -w 1 5# cswch/s:自愿上下文切换(IO 等待等)# nvcswch/s:非自愿上下文切换(时间片用完被抢占)

经验值

  • 自愿切换高 → 进程在等 IO 或锁
  • 非自愿切换高 → CPU 竞争激烈,进程太多
  • 实测单核上下文切换超过 1 万/秒就需要关注

2.4 内存排查

当发现 swap 使用量增长、available 内存持续下降、或者进程被 OOM Killer 杀掉时,进入内存排查。

2.4.1 free — 内存概览

free -h

输出示例:

              total        used        free      shared  buff/cache   availableMem:           15Gi        12Gi       312Mi       256Mi       2.7Gi       2.1GiSwap:         4.0Gi       2.0Gi       2.0Gi

关键点

  • 看 available,不要看 free。free 只是完全未使用的内存,available 包含了可回收的 buff/cache
  • available < 总内存的 10% 时需要警惕
  • swap used > 0 且持续增长,说明物理内存不够用了
  • shared 列是 tmpfs 使用量,有些应用(如 PostgreSQL)会用大量 shared memory

2.4.2 /proc/meminfo — 详细内存分布

# 查看关键内存指标cat /proc/meminfo | grep -E "MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree|Slab|SReclaimable|SUnreclaim|Dirty|Writeback|AnonPages|Mapped|Shmem|HugePages"

重点关注

  • Slab / SUnreclaim:内核 slab 分配器使用的内存,SUnreclaim 不可回收,如果持续增长可能是内核内存泄漏
  • Dirty / Writeback:脏页和正在回写的页,过高说明 IO 跟不上
  • AnonPages:匿名页(进程堆栈等),这是应用实际使用的内存
  • HugePages_Total:大页配置,数据库场景常用

2.4.3 slabtop — 内核 slab 内存分析

# 按内存大小排序查看 slabslabtop -o | head -20# 持续监控slabtop -d 2

如果 dentry 或 inode_cache 占用异常大,通常是文件系统缓存导致,可以手动释放:

# 释放 pagecache + dentries + inodesecho 3 > /proc/sys/vm/drop_caches# 生产环境建议只释放 dentries 和 inodesecho 2 > /proc/sys/vm/drop_caches

这个操作会导致短暂的 IO 升高,业务高峰期慎用。

2.4.4 smem — 查看进程真实内存占用

# 安装yum install -y smem    # CentOSapt install -y smem    # Ubuntu# 按 PSS 排序查看进程内存smem -rkt -s pss | head -20

为什么用 PSS 而不是 RSS

  • RSS(Resident Set Size)包含共享库的全部内存,多个进程共享同一个库时会重复计算
  • PSS(Proportional Set Size)按比例分摊共享内存,更准确反映进程真实内存占用
  • 实测一台跑了 50 个 PHP-FPM worker 的机器,RSS 总和 8GB,PSS 总和只有 3GB

2.4.5 进程级内存分析

# 查看指定进程的内存映射pmap -x <PID> | tail -1# 查看进程内存详情cat /proc/<PID>/status | grep -E "VmSize|VmRSS|VmSwap|Threads"# 查看进程的 smaps 汇总cat /proc/<PID>/smaps_rollup

2.4.6 OOM Killer 分析

# 查看 OOM 日志dmesg | grep -i "oom\|out of memory" | tail -20# 查看被 OOM 杀掉的进程dmesg | grep "Killed process"# 查看当前进程的 OOM 分数(分数越高越容易被杀)cat /proc/<PID>/oom_score# 调整 OOM 优先级(-1000 到 1000,-1000 表示永不 OOM)echo -1000 > /proc/<PID>/oom_score_adj

2.5 磁盘 IO 排查

当 %wa 偏高、vmstat 的 b 列持续 > 0、或者应用日志出现 IO 超时时,进入磁盘 IO 排查。

2.5.1 iostat — 磁盘 IO 统计

# 每秒采样,显示扩展统计,忽略无活动的设备iostat -xz 1 5

输出示例:

Device  r/s    w/s   rkB/s   wkB/s  rrqm/s  wrqm/s  %rrqm  %wrqm  r_await  w_await  aqu-sz  rareq-sz  wareq-sz  svctm  %utilsda    12.00  285.00  48.00 18432.00   0.00   42.00   0.00  12.84    1.25    8.52    2.43     4.00    64.67   3.12  92.80

关键指标

指标
含义
告警阈值
%util
设备繁忙百分比
> 80% 说明 IO 接近饱和(SSD 可以更高)
r_await / w_await
读/写平均耗时(ms)
HDD > 20ms、SSD > 5ms 需要关注
aqu-sz
平均队列长度
> 4 说明 IO 排队严重
svctm
平均服务时间(ms)
已废弃,不要参考
r/s + w/s
IOPS
对比磁盘标称 IOPS
rkB/s + wkB/s
吞吐量
对比磁盘标称带宽

注意%util 对于并行设备(SSD、RAID)可能不准确。SSD 的 %util 100% 不一定表示饱和,要结合 await 判断。

2.5.2 iotop — 定位 IO 进程

# 只显示有 IO 活动的进程iotop -oP# 批量模式,适合脚本采集iotop -oP -b -n 5 -d 1

2.5.3 pidstat — 进程级 IO 统计

# 每秒采样进程 IOpidstat -d 1 5# 查看指定进程pidstat -d -p <PID> 1 5

2.5.4 blktrace — 块设备级追踪

# 追踪 sda 设备 10 秒blktrace -d /dev/sda -o trace -w 10# 解析追踪数据blkparse -i trace.blktrace.0 -o trace.txt# 生成 IO 延迟分布btt -i trace.blktrace.0 -o btt_output

blktrace 会产生大量数据,生产环境短时间采样即可,不要长时间运行。

2.5.5 文件系统级排查

# 查看文件系统使用情况df -hT# 查看 inode 使用情况(inode 耗尽也会导致无法写入)df -i# 查看哪个目录占用空间最大du -sh /* 2>/dev/null | sort -rh | head -10# 查看已删除但未释放的文件(进程还在占用)lsof +L1

2.6 网络排查

当出现连接超时、丢包、带宽打满等问题时,进入网络排查。

2.6.1 ss — 连接状态统计

# 连接状态汇总ss -s# 查看 TIME_WAIT 数量ss -tan state time-wait | wc -l# 查看 ESTABLISHED 连接,按目标端口统计ss -tn state established | awk '{print $4}' | awk -F: '{print $NF}' | sort | uniq -c | sort -rn | head -10# 查看监听端口ss -tlnp

经验值

  • TIME_WAIT 超过 2 万需要关注,超过 5 万需要优化
  • ESTABLISHED 连接数要和应用的连接池配置对比

2.6.2 sar — 网络流量统计

# 实时查看网卡流量sar -n DEV 1 5# 查看网络错误统计sar -n EDEV 1 5# 查看 TCP 统计sar -n TCP,ETCP 1 5

关键指标

  • rxkB/s / txkB/s:收发带宽,对比网卡标称带宽
  • rxpck/s / txpck/s:收发包数,万兆网卡实测小包极限约 1400 万 pps
  • %ifutil:网卡利用率
  • retrans/s:TCP 重传数,> 0 说明有丢包

2.6.3 nstat — 协议栈计数器

# 查看 TCP 相关计数器nstat -az | grep -i tcp# 重点关注nstat -az | grep -E "TcpRetransSegs|TcpExtTCPLostRetransmit|TcpExtListenOverflows|TcpExtListenDrops|TcpExtTCPAbortOnMemory"

关键计数器

计数器
含义
说明
TcpRetransSegs
TCP 重传段数
持续增长说明有丢包
TcpExtListenOverflows
全连接队列溢出
需要调大 somaxconn 和应用 backlog
TcpExtListenDrops
监听队列丢弃
同上
TcpExtTCPAbortOnMemory
内存不足导致连接中断
需要调大 TCP 内存参数

2.6.4 tcpdump — 抓包分析

# 抓取指定端口的包,保存到文件tcpdump -i eth0 port 80 -w /tmp/capture.pcap -c 10000# 抓取指定 IP 的包tcpdump -i eth0 host 10.0.0.1 -nn# 只看 TCP SYN 包(排查连接问题)tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0' -nn# 只看 TCP RST 包(排查连接被重置)tcpdump -i eth0 'tcp[tcpflags] & tcp-rst != 0' -nn

注意:生产环境抓包一定要加 -c 限制包数量或 -G 限制时间,否则 pcap 文件会撑爆磁盘。我们团队的做法是最多抓 10 万个包或 60 秒。

2.6.5 网卡级排查

# 查看网卡错误统计ethtool -S eth0 | grep -i error# 查看网卡丢包ethtool -S eth0 | grep -i drop# 查看网卡 ring buffer 大小ethtool -g eth0# 查看软中断统计(网络包处理)cat /proc/net/softnet_stat

/proc/net/softnet_stat 每行对应一个 CPU 核,三列分别是:

  • 第 1 列:处理的包数
  • 第 2 列:因 netdev_budget 用完而退出的次数(> 0 说明 CPU 处理不过来)
  • 第 3 列:因 backlog 满而丢弃的包数(> 0 说明需要调大 netdev_max_backlog

三、示例代码和配置

3.1 完整配置示例

3.1.1 一键性能快照脚本

线上出问题时手忙脚乱敲命令容易遗漏信息。我们团队的做法是在每台机器上放一个快照脚本,出问题时一键执行,把所有关键数据收集到一个文件里,事后慢慢分析。

#!/bin/bash# 文件名:perf_snapshot.sh# 功能:一键收集系统性能快照,输出到指定目录# 用法:sudo bash perf_snapshot.sh [输出目录]set -euo pipefailOUTPUT_DIR="${1:-/tmp/perf_snapshot_$(date +%Y%m%d_%H%M%S)}"mkdir -p "$OUTPUT_DIR"log() {echo"[$(date '+%Y-%m-%d %H:%M:%S')] $*"}collect() {local name="$1"shiftlog"采集 $name ...""$@" > "$OUTPUT_DIR/$name.txt" 2>&1 || echo"采集 $name 失败: $?" >> "$OUTPUT_DIR/errors.log"}log"开始采集,输出目录: $OUTPUT_DIR"# 基础信息collect "uname" uname -acollect "uptime" uptimecollect "date" date '+%Y-%m-%d %H:%M:%S %Z'collect "hostname" hostname -f# CPU 相关collect "top_snapshot" bash -c "top -bn1 | head -50"collect "mpstat" mpstat -P ALL 1 5collect "pidstat_cpu" pidstat -u 1 5collect "pidstat_context_switch" pidstat -w 1 5# 内存相关collect "free" free -hcollect "meminfo" cat /proc/meminfocollect "slabtop" slabtop -ocollect "smem" bash -c "smem -rkt -s pss 2>/dev/null || echo 'smem not installed'"# 磁盘 IO 相关collect "iostat" iostat -xz 1 5collect "pidstat_io" pidstat -d 1 5collect "df" df -hTcollect "df_inode" df -i# 网络相关collect "ss_summary" ss -scollect "ss_established" bash -c "ss -tn state established | head -100"collect "ss_time_wait_count" bash -c "ss -tan state time-wait | wc -l"collect "ss_listen" ss -tlnpcollect "netstat_stats" bash -c "nstat -az 2>/dev/null || netstat -s"# vmstat 采样collect "vmstat" vmstat 1 10# dmesg 最近的错误collect "dmesg_errors" bash -c "dmesg -T 2>/dev/null | tail -100"collect "dmesg_oom" bash -c "dmesg | grep -i 'oom\|out of memory\|killed process' || echo 'No OOM events'"# 进程列表collect "ps_aux" bash -c "ps aux --sort=-%mem | head -30"collect "ps_d_state" bash -c "ps aux | awk '\$8~/D/' || echo 'No D state processes'"# 系统日志collect "journal_recent" bash -c "journalctl --since '10 minutes ago' --no-pager 2>/dev/null | tail -200 || tail -200 /var/log/syslog 2>/dev/null || echo 'No syslog access'"log"采集完成,文件列表:"ls -la "$OUTPUT_DIR/"# 打包tar czf "${OUTPUT_DIR}.tar.gz" -C "$(dirname "$OUTPUT_DIR")""$(basename "$OUTPUT_DIR")"log"已打包: ${OUTPUT_DIR}.tar.gz"log"大小: $(du -sh "${OUTPUT_DIR}.tar.gz" | awk '{print $1}')"

3.1.2 持续性能监控脚本

用于在问题复现窗口期持续采集数据,每隔 N 秒记录一次关键指标。

#!/bin/bash# 文件名:perf_monitor.sh# 功能:持续采集性能数据,适合等待问题复现时使用# 用法:sudo bash perf_monitor.sh [采样间隔秒数] [持续时间秒数]set -euo pipefailINTERVAL="${1:-5}"DURATION="${2:-3600}"OUTPUT="/tmp/perf_monitor_$(date +%Y%m%d_%H%M%S).csv"echo"timestamp,load1,load5,load15,cpu_us,cpu_sy,cpu_wa,cpu_st,mem_used_pct,swap_used_mb,disk_util,net_rx_kb,net_tx_kb,tcp_estab,tcp_tw,context_switch,interrupts" > "$OUTPUT"END_TIME=$((SECONDS + DURATION))echo"开始监控,间隔 ${INTERVAL}s,持续 ${DURATION}s,输出: $OUTPUT"while [ $SECONDS -lt $END_TIME ]; do    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')# load averageread LOAD1 LOAD5 LOAD15 <<< $(awk '{print $1, $2, $3}' /proc/loadavg)# CPU(取 vmstat 第二行数据)read CPU_US CPU_SY CPU_WA CPU_ST <<< $(vmstat 1 2 | tail -1 | awk '{print $13, $14, $16, $17}')# 内存使用率    MEM_USED_PCT=$(free | awk '/Mem:/{printf "%.1f", ($3/$2)*100}')# swap 使用量(MB)    SWAP_USED=$(free -m | awk '/Swap:/{print $3}')# 磁盘最大 %util    DISK_UTIL=$(iostat -xz 1 2 | awk '/^[a-z]/{if($NF+0 > max) max=$NF+0} END{print max+0}')# 网络流量(取第一个非 lo 网卡)read NET_RX NET_TX <<< $(sar -n DEV 1 1 2>/dev/null | awk '/Average:/ && !/lo/ && !/IFACE/{print $5, $6; exit}' || echo"0 0")# TCP 连接数    TCP_ESTAB=$(ss -tn state established 2>/dev/null | wc -l)    TCP_TW=$(ss -tan state time-wait 2>/dev/null | wc -l)# 上下文切换和中断read CS INTR <<< $(vmstat 1 2 | tail -1 | awk '{print $12, $11}')echo"$TIMESTAMP,$LOAD1,$LOAD5,$LOAD15,$CPU_US,$CPU_SY,$CPU_WA,$CPU_ST,$MEM_USED_PCT,$SWAP_USED,$DISK_UTIL,$NET_RX,$NET_TX,$TCP_ESTAB,$TCP_TW,$CS,$INTR" >> "$OUTPUT"    sleep "$INTERVAL"doneecho"监控结束,数据文件: $OUTPUT"echo"共 $(wc -l < "$OUTPUT") 条记录"

3.2 实际应用案例

案例一:Java 应用 CPU 100% 排查

场景描述:线上 Java 服务突然 CPU 飙到 100%,接口响应超时。这是 Java 应用最常见的性能问题之一。

排查步骤

# 第一步:确认是哪个 Java 进程top -bn1 | grep java# 输出:PID 12345 占用 CPU 398%(4 核机器)# 第二步:找到 CPU 最高的线程top -Hp 12345 -bn1 | head -20# 输出:线程 12378 占用 CPU 98%# 第三步:将线程 ID 转为 16 进制(jstack 用 16 进制)printf"%x\n" 12378# 输出:305a# 第四步:用 jstack 导出线程栈jstack 12345 > /tmp/jstack_12345.txt# 第五步:搜索对应线程grep -A 30 "nid=0x305a" /tmp/jstack_12345.txt

实际输出

"http-nio-8080-exec-15"#78 daemon prio=5 os_prio=0 tid=0x00007f8a3c012800 nid=0x305a runnable [0x00007f8a1c5f9000]   java.lang.Thread.State: RUNNABLE        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)        at java.util.regex.Pattern$Loop.match(Pattern.java:4785)        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)        at java.util.regex.Pattern$Loop.matchInit(Pattern.java:4801)        at java.util.regex.Pattern$Loop.match(Pattern.java:4785)        ...        at com.example.service.UserService.validateEmail(UserService.java:142)

根因:正则表达式回溯导致 CPU 死循环(ReDoS)。validateEmail 方法里用了一个有缺陷的邮箱正则,遇到特定输入会触发指数级回溯。

解决方案

  1. 临时:重启服务恢复
  2. 根治:替换正则表达式,或者加上超时控制
  3. 预防:对正则表达式做 ReDoS 检测

进阶方法 — 用 perf + perf-map-agent 生成 Java 火焰图

# 安装 perf-map-agent(需要 JAVA_HOME)git clone https://github.com/jvm-profiling-tools/perf-map-agent.gitcd perf-map-agent && cmake . && make# 生成 /tmp/perf-<pid>.map 符号映射文件bin/create-java-perf-map.sh 12345# 用 perf 采样perf record -p 12345 -g -F 99 -- sleep 30# 生成火焰图perf script | /opt/FlameGraph/stackcollapse-perf.pl | /opt/FlameGraph/flamegraph.pl > java_flame.svg

案例二:MySQL IO wait 高排查

场景描述:数据库服务器 iowait 持续 30%+,MySQL 慢查询增多,业务接口超时。

排查步骤

# 第一步:确认 IO 瓶颈iostat -xz 1 3# 输出:sda %util 95%, w_await 45ms# 第二步:确认是 MySQL 导致的 IOiotop -oP -b -n 3 -d 1# 输出:mysqld 进程写入 180MB/s# 第三步:查看 MySQL 当前执行的查询mysql -e "SHOW PROCESSLIST\G" | grep -B5 "Query"# 第四步:查看慢查询日志tail -100 /var/log/mysql/slow.log# 第五步:分析慢查询(用 pt-query-digest)pt-query-digest /var/log/mysql/slow.log --since '1h' | head -50

发现的问题

-- 慢查询 TOP1:全表扫描,每次扫描 500 万行SELECT * FROM orders WHERE create_time > '2024-01-01'ANDstatus = 'pending';-- Rows_examined: 5000000, Query_time: 12.5s

解决方案

# 1. 添加复合索引mysql -e "ALTER TABLE orders ADD INDEX idx_status_create_time (status, create_time);"# 2. 调大 InnoDB Buffer Pool(当前 1GB,实际数据 8GB)# 编辑 /etc/mysql/mysql.conf.d/mysqld.cnf# innodb_buffer_pool_size = 6G  (物理内存的 60-70%)# 3. 调整脏页刷新参数# innodb_io_capacity = 2000        (SSD 建议 2000-4000)# innodb_io_capacity_max = 4000# innodb_flush_neighbors = 0       (SSD 关闭邻近页刷新)# 4. 重启 MySQL 生效systemctl restart mysqld# 5. 验证效果iostat -xz 1 5# %util 从 95% 降到 15%,w_await 从 45ms 降到 2ms

案例三:load average 高但 CPU 使用率不高

场景描述:服务器 load average 飙到 50+(8 核机器),但 top 显示 CPU 使用率只有 30%。

排查步骤

# 第一步:查看 vmstat,注意 b 列vmstat 1 5# 输出:b 列持续 40+,说明大量进程在 D 状态(不可中断睡眠)# 第二步:找出 D 状态进程ps aux | awk '$8~/^D/{print $0}'# 输出:大量 rsync 进程处于 D 状态# 第三步:确认 IO 情况iostat -xz 1 3# 输出:sda %util 100%, await 850ms# 第四步:查看是什么在做 IOiotop -oP -b -n 3# 输出:40 个 rsync 进程同时在写磁盘# 第五步:查看 crontabcrontab -l# 发现:40 台服务器的备份任务同时触发,全部 rsync 到这台机器

根因:备份任务没有错峰,40 台机器同时 rsync 到同一台备份服务器,磁盘 IO 被打满,所有 IO 操作排队等待,进程进入 D 状态,load average 飙高。

解决方案

  1. 临时:kill 掉部分 rsync 进程,缓解 IO 压力
  2. 根治:备份任务错峰执行,每台间隔 5 分钟
  3. 优化:rsync 加 --bwlimit=50000(限速 50MB/s)

案例四:网络丢包排查

场景描述:应用日志出现大量连接超时,ping 目标机器偶尔丢包。

# 第一步:确认丢包ping -c 100 10.0.0.2# 输出:5% packet loss# 第二步:查看网卡错误统计ethtool -S eth0 | grep -E "drop|error|fifo"# 输出:rx_dropped: 128456(持续增长)# 第三步:查看 ring buffer 是否太小ethtool -g eth0# 输出:Current RX: 256, Maximum RX: 4096# 第四步:调大 ring bufferethtool -G eth0 rx 4096# 第五步:查看软中断是否集中在单核cat /proc/net/softnet_stat# 输出:第 0 行第 2 列持续增长,说明 CPU0 处理不过来# 第六步:启用 RPS 分散软中断echo"ff" > /sys/class/net/eth0/queues/rx-0/rps_cpus# 第七步:验证ping -c 100 10.0.0.2# 输出:0% packet loss

四、最佳实践和注意事项

4.1 最佳实践

4.1.1 内核参数调优

以下参数在生产环境中线上验证过,适用于大部分 Web 服务和数据库场景。改之前先备份当前值,改错了可能导致系统不稳定。

# 备份当前内核参数sysctl -a > /tmp/sysctl_backup_$(date +%Y%m%d).conf

内存相关

# vm.swappiness:控制 swap 使用倾向# 默认值 60,生产环境建议设为 10# 设为 0 在内核 3.5+ 表示"尽量不用 swap 但 OOM 前还是会用"# 数据库服务器建议设为 1(MySQL/PostgreSQL 官方建议)sysctl -w vm.swappiness=10# vm.dirty_ratio:脏页占总内存的比例上限,超过后进程写操作会阻塞# 默认值 20,IO 密集型服务建议降到 10,避免突发大量刷盘sysctl -w vm.dirty_ratio=10# vm.dirty_background_ratio:后台刷脏页的触发阈值# 默认值 10,建议设为 5,让脏页更早开始刷盘,避免堆积sysctl -w vm.dirty_background_ratio=5# vm.overcommit_memory:内存超分配策略# 0=启发式(默认),1=总是允许,2=不允许超过 swap+物理内存*ratio# Redis 官方要求设为 1,否则 fork 子进程做 RDB 时可能失败# 数据库服务器建议保持 0sysctl -w vm.overcommit_memory=0

网络相关

# 全连接队列大小,默认 128,高并发场景远远不够# Nginx/Tomcat 等 Web 服务器建议 65535sysctl -w net.core.somaxconn=65535# 半连接队列大小sysctl -w net.ipv4.tcp_max_syn_backlog=65535# 网卡接收队列长度,默认 1000# 万兆网卡高流量场景建议 50000sysctl -w net.core.netdev_max_backlog=50000# TIME_WAIT 相关# 开启 TIME_WAIT 快速回收(NAT 环境下不要开,会导致连接异常)sysctl -w net.ipv4.tcp_tw_reuse=1# TIME_WAIT 最大数量,超过后直接销毁sysctl -w net.ipv4.tcp_max_tw_buckets=50000# TCP keepalive 参数# 默认 7200 秒才发第一个探测包,太慢了sysctl -w net.ipv4.tcp_keepalive_time=600sysctl -w net.ipv4.tcp_keepalive_intvl=30sysctl -w net.ipv4.tcp_keepalive_probes=3# TCP 内存参数(单位:页,每页 4KB)# min/pressure/max,16GB 内存机器的参考值sysctl -w net.ipv4.tcp_mem="262144 524288 786432"# 单个 socket 缓冲区大小sysctl -w net.core.rmem_max=16777216sysctl -w net.core.wmem_max=16777216sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

文件描述符

# 系统级文件描述符上限sysctl -w fs.file-max=2097152# 用户级限制(/etc/security/limits.conf)cat >> /etc/security/limits.conf << 'EOF'* soft nofile 1048576* hard nofile 1048576* soft nproc 65535* hard nproc 65535EOF

持久化所有参数

cat > /etc/sysctl.d/99-performance.conf << 'EOF'vm.swappiness = 10vm.dirty_ratio = 10vm.dirty_background_ratio = 5net.core.somaxconn = 65535net.ipv4.tcp_max_syn_backlog = 65535net.core.netdev_max_backlog = 50000net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_max_tw_buckets = 50000net.ipv4.tcp_keepalive_time = 600net.ipv4.tcp_keepalive_intvl = 30net.ipv4.tcp_keepalive_probes = 3net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.ipv4.tcp_rmem = 4096 87380 16777216net.ipv4.tcp_wmem = 4096 65536 16777216fs.file-max = 2097152EOFsysctl -p /etc/sysctl.d/99-performance.conf

4.1.2 安全加固

  • perf 权限控制:perf 可以采集内核符号和其他进程的数据,生产环境必须限制

    # 限制非 root 用户只能采集用户态数据echo 2 > /proc/sys/kernel/perf_event_paranoid# 禁止非 root 用户使用 kprobesecho 1 > /proc/sys/kernel/kptr_restrict
  • 审计日志:记录谁在什么时候执行了性能排查命令

    # 配置 auditd 监控关键命令auditctl -a always,exit -F path=/usr/bin/perf -F perm=x -k perf_usageauditctl -a always,exit -F path=/usr/sbin/tcpdump -F perm=x -k tcpdump_usage
  • tcpdump 抓包安全:抓包文件可能包含敏感数据(密码、token 等),用完立即删除,不要传到不安全的地方

4.1.3 常态化监控

排查问题靠临时命令,预防问题靠常态化监控。我们团队的标准监控栈:

node_exporter + Prometheus + Grafana

# 安装 node_exporterwget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gztar xzf node_exporter-1.7.0.linux-amd64.tar.gzcp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/# 创建 systemd 服务cat > /etc/systemd/system/node_exporter.service << 'EOF'[Unit]Description=Node ExporterAfter=network.target[Service]Type=simpleUser=node_exporterExecStart=/usr/local/bin/node_exporter \    --collector.systemd \    --collector.processes \    --collector.tcpstat \    --web.listen-address=:9100Restart=alwaysRestartSec=5[Install]WantedBy=multi-user.targetEOFuseradd -r -s /sbin/nologin node_exportersystemctl daemon-reloadsystemctl enable --now node_exporter

4.2 注意事项

4.2.1 配置注意事项

注意:以下参数改错了可能导致严重后果,操作前务必备份。

  • net.ipv4.tcp_tw_recycle 不要开:这个参数在 NAT 环境下会导致大量连接失败,Linux 4.12 内核已经移除了这个参数。如果你在网上看到有人推荐开这个,忽略它
  • vm.overcommit_memory=1 要谨慎:Redis 需要设为 1,但如果同一台机器还跑了其他服务,可能导致 OOM。最好 Redis 单独部署
  • drop_caches 不要写进 crontab:手动释放缓存是临时手段,写进定时任务会导致 IO 周期性飙高
  • perf record 不要在高负载时长时间运行:perf 本身也消耗 CPU 和磁盘 IO,采样 30 秒足够了

4.2.2 常见错误

错误现象
原因分析
解决方案
perf: command not found
没安装对应内核版本的 linux-tools
apt install linux-tools-$(uname -r)
perf record
 报 Permission denied
perf_event_paranoid 限制
echo 1 > /proc/sys/kernel/perf_event_paranoid
 或用 sudo
iostat
 输出全是 0
sysstat 服务没启动
systemctl start sysstat
iotop
 报 CONFIG_TASK_IO_ACCOUNTING not enabled
内核没开 IO 统计
换用 pidstat -d 替代
bcc-tools
 安装失败
内核版本太低或缺少 headers
确认内核 >= 4.9,安装 linux-headers-$(uname -r)
smem
 数据不准
没有 root 权限
用 sudo 运行

4.2.3 工具选择建议

  • 快速概览:top → dstat → vmstat(三选一即可,dstat 信息最全)
  • CPU 定位:mpstat → pidstat → perf top(逐步深入)
  • 内存定位:free → smem → pmap(逐步深入)
  • IO 定位:iostat → iotop → blktrace(逐步深入)
  • 网络定位:ss → sar → tcpdump(逐步深入)

五、故障排查和监控

5.1 故障排查

5.1.1 日志查看

# 查看系统日志(systemd 系统)journalctl -xe --since "30 minutes ago" --no-pager# 查看内核日志(带时间戳)dmesg -T | tail -50# 查看 syslogtail -f /var/log/syslog       # Ubuntu/Debiantail -f /var/log/messages     # CentOS/RHEL# 查看认证日志(SSH 登录失败等)tail -f /var/log/auth.log     # Ubuntu/Debiantail -f /var/log/secure       # CentOS/RHEL

5.1.2 常见问题排查

问题一:load average 高但 CPU 使用率不高

这是最容易误判的场景。load average 包含 D 状态进程,所以 load 高不等于 CPU 忙。

# 诊断:查看 D 状态进程ps aux | awk '$8~/^D/{print}'# 如果有大量 D 状态进程,查看它们在等什么cat /proc/<PID>/wchan# 通常是 IO 等待,确认磁盘状态iostat -xz 1 3

解决方案

  1. 如果是磁盘 IO 导致:优化 IO 密集操作(如备份错峰、加索引减少全表扫描)
  2. 如果是 NFS 挂载卡住:检查 NFS 服务器状态,mount -o soft 避免硬挂载导致进程不可杀
  3. 如果是内核 bug:升级内核

问题二:iowait 高 vs steal 高的区别

# 查看 CPU 各状态占比mpstat -P ALL 1 5
  • %iowait 高:本机磁盘 IO 慢,排查磁盘和文件系统
  • %steal 高:虚拟机被宿主机抢占 CPU,说明宿主机超卖。这个问题你解决不了,找云厂商换机器或升配

问题三:OOM Killer 日志分析

# 查看 OOM 事件dmesg | grep -i "out of memory" -A 20# 典型 OOM 日志解读# Out of memory: Kill process 12345 (java) score 850 or sacrifice child# 含义:内核选择了 OOM score 最高的 java 进程杀掉# score 850/1000 说明这个进程占了大量内存# 查看当前各进程的 OOM scorefor pid in $(ls /proc/ | grep -E '^[0-9]+$'); do    name=$(cat /proc/$pid/comm 2>/dev/null)    score=$(cat /proc/$pid/oom_score 2>/dev/null)    [ -n "$score" ] && [ "$score" -gt 100 ] && echo"$pid$name$score"done | sort -k3 -rn | head -10

解决方案

  1. 找到内存占用最大的进程,分析是否有内存泄漏
  2. 如果是 Java 应用,检查堆内存配置(-Xmx)是否合理
  3. 对关键进程设置 oom_score_adj = -1000 防止被杀(如数据库进程)
  4. 增加物理内存或增加 swap(swap 是最后的保险)

问题四:网络丢包排查流程

网络丢包要从外到内逐层排查:物理层 → 网卡 → 内核协议栈 → 应用层。

# 第一层:物理层/网卡层ethtool -S eth0 | grep -E "rx_dropped|rx_errors|rx_fifo_errors|rx_missed_errors"# rx_missed_errors > 0:网卡 ring buffer 满了,调大 ring buffer# rx_fifo_errors > 0:网卡 FIFO 溢出,通常是 CPU 处理不过来# 第二层:内核网络栈cat /proc/net/softnet_stat# 第二列 > 0:netdev_budget 不够,调大# 第三列 > 0:backlog 满了,调大 netdev_max_backlog# 第三层:TCP/IP 协议栈nstat -az | grep -E "Drop|Overflow|Prune"# TcpExtListenDrops:全连接队列满# TcpExtTCPBacklogDrop:socket backlog 满# TcpExtPruneCalled:socket 接收缓冲区满# 第四层:iptables/nftablesiptables -nvL | grep DROP# 检查是否有防火墙规则在丢包# 第五层:conntrack 表满dmesg | grep "nf_conntrack: table full"# 如果满了:sysctl -w net.netfilter.nf_conntrack_max=1048576

5.1.3 调试模式

# strace 追踪进程系统调用(定位进程卡在哪个系统调用)strace -p <PID> -f -T -tt -o /tmp/strace.log# -f:跟踪子进程/线程# -T:显示系统调用耗时# -tt:显示微秒级时间戳# 只看文件相关的系统调用strace -p <PID> -e trace=file -T# 只看网络相关的系统调用strace -p <PID> -e trace=network -T# ltrace 追踪库函数调用ltrace -p <PID> -f -T -o /tmp/ltrace.log

注意:strace 会显著降低目标进程性能(实测降低 50%-80%),生产环境短时间使用,用完立即 detach。高性能场景用 perf trace 替代。

5.2 性能监控

5.2.1 关键指标监控

# CPU 使用率(按进程)top -bn1 -o %CPU | head -15# 内存使用(按进程)top -bn1 -o %MEM | head -15# 网络连接数ss -s# 磁盘 IOiostat -xz 1 1# 系统负载趋势(sar 历史数据)sar -u    # CPU 历史sar -r    # 内存历史sar -b    # IO 历史sar -n DEV  # 网络历史

5.2.2 监控指标说明

指标名称
正常范围
告警阈值
说明
CPU 使用率
< 70%
> 85% 持续 5 分钟
us+sy 总和
load average
< CPU 核数
> CPU 核数 * 2 持续 5 分钟
1 分钟平均值
内存使用率
< 80%
available < 10%
看 available 不看 free
swap 使用量
0
> 0 且持续增长
swap 使用本身不是问题,持续增长才是
磁盘 %util
< 70%
> 90% 持续 1 分钟
SSD 可以放宽到 95%
IO await
HDD < 10ms, SSD < 2ms
HDD > 30ms, SSD > 10ms
读写平均延迟
网络带宽
< 70% 标称带宽
> 85% 标称带宽
接近带宽上限时延迟急剧增加
TCP 重传率
< 0.1%
> 1%
重传率 = retrans/out_segs
TIME_WAIT
< 20000
> 50000
短连接场景关注
上下文切换
< 50000/s
> 100000/s
每秒上下文切换次数

5.2.3 Prometheus 告警规则示例

# 文件路径:/etc/prometheus/rules/node_alerts.ymlgroups:-name:node_alertsrules:-alert:HighCpuUsageexpr:100-(avgby(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m]))*100)>85for:5mlabels:severity:warningannotations:summary:"CPU 使用率过高 ({{ $labels.instance }})"description:"CPU 使用率 {{ $value | printf \"%.1f\" }}% 持续超过 85% 达 5 分钟"-alert:HighMemoryUsageexpr:(1-node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes)*100>90for:5mlabels:severity:warningannotations:summary:"内存使用率过高 ({{ $labels.instance }})"description:"可用内存不足 10%,当前使用率 {{ $value | printf \"%.1f\" }}%"-alert:HighLoadAverageexpr:node_load1/countwithout(cpu,mode)(node_cpu_seconds_total{mode="idle"})>2for:5mlabels:severity:warningannotations:summary:"系统负载过高 ({{ $labels.instance }})"description:"1 分钟 load average 超过 CPU 核数的 2 倍"-alert:HighDiskUtilizationexpr:rate(node_disk_io_time_seconds_total[5m])*100>90for:1mlabels:severity:criticalannotations:summary:"磁盘 IO 饱和 ({{ $labels.instance }})"description:"磁盘 {{ $labels.device }} 利用率超过 90%"-alert:DiskSpaceRunningOutexpr:(1-node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"}/node_filesystem_size_bytes)*100>85for:5mlabels:severity:warningannotations:summary:"磁盘空间不足 ({{ $labels.instance }})"description:"挂载点 {{ $labels.mountpoint }} 使用率 {{ $value | printf \"%.1f\" }}%"-alert:HighNetworkErrorsexpr:rate(node_network_receive_errs_total[5m])>10for:5mlabels:severity:warningannotations:summary:"网卡接收错误 ({{ $labels.instance }})"description:"网卡 {{ $labels.device }} 接收错误率 {{ $value | printf \"%.1f\" }}/s"-alert:SwapUsageIncreasingexpr:rate(node_memory_SwapFree_bytes[10m])<-1048576for:10mlabels:severity:warningannotations:summary:"Swap 使用量持续增长 ({{ $labels.instance }})"description:"Swap 使用量在持续增长,可能存在内存泄漏"

5.3 备份与恢复

5.3.1 sar 历史数据备份

sar 的历史数据是排查"昨天发生了什么"的关键证据,默认只保留 7 天。

# 修改 sar 数据保留天数(默认 7 天,建议 30 天)sed -i 's/^HISTORY=.*/HISTORY=30/' /etc/sysstat/sysstat# 备份 sar 数据到远程rsync -az /var/log/sysstat/ backup-server:/backup/sar/$(hostname)/# 查看历史某天的 CPU 数据sar -u -f /var/log/sysstat/sa15    # 查看 15 号的数据# 查看历史某天的 IO 数据sar -b -f /var/log/sysstat/sa15

5.3.2 性能基线建立

在系统正常运行时采集基线数据,出问题时对比基线快速发现异常。

#!/bin/bash# 文件名:collect_baseline.sh# 功能:采集性能基线数据# 建议每周执行一次,保留最近 4 周的基线set -euo pipefailBASELINE_DIR="/opt/perf_baseline"DATE=$(date +%Y%m%d)OUTPUT="$BASELINE_DIR/baseline_$DATE"mkdir -p "$OUTPUT"# 采集 5 分钟的数据echo"开始采集基线数据(5 分钟)..."vmstat 1 300 > "$OUTPUT/vmstat.txt" &iostat -xz 1 300 > "$OUTPUT/iostat.txt" &mpstat -P ALL 1 300 > "$OUTPUT/mpstat.txt" &sar -n DEV 1 300 > "$OUTPUT/sar_net.txt" &pidstat -u -d -r 5 60 > "$OUTPUT/pidstat.txt" &wait# 采集快照数据free -h > "$OUTPUT/free.txt"df -hT > "$OUTPUT/df.txt"ss -s > "$OUTPUT/ss.txt"cat /proc/meminfo > "$OUTPUT/meminfo.txt"sysctl -a > "$OUTPUT/sysctl.txt" 2>/dev/null# 清理 30 天前的基线find "$BASELINE_DIR" -name "baseline_*" -mtime +30 -exec rm -rf {} +echo"基线数据已保存到 $OUTPUT"

六、总结

6.1 技术要点回顾

  • USE 方法论是核心框架:对每类资源检查 Utilization/Saturation/Errors 三个维度,不遗漏不瞎猜
  • 60 秒快速诊断流程:uptime → top → vmstat → iostat → ss,快速确定瓶颈方向
  • 逐层深入定位:从全局概览到进程级定位再到函数级热点,perf + 火焰图是终极武器
  • 内核参数调优要有依据:每个参数改之前搞清楚默认值、影响范围、回滚方法
  • 常态化监控比临时排查更重要:node_exporter + Prometheus + Grafana 是标配,配合告警规则实现问题早发现

6.2 进阶学习方向

  1. eBPF/BCC 工具集:比 perf 更灵活的内核追踪方案,可以自定义追踪点

    • 学习资源:Brendan Gregg 的《BPF Performance Tools》
    • 实践建议:从 bcc-tools 自带的工具开始用,如 biolatency、tcplife、execsnoop
  2. 火焰图深入应用:不只是 CPU 火焰图,还有 Off-CPU 火焰图、内存火焰图、IO 火焰图

    • 学习资源:https://www.brendangregg.com/flamegraphs.html
    • 实践建议:先掌握 CPU 火焰图,再学 Off-CPU 火焰图(定位锁等待、IO 等待)
  3. 内核调优深入:理解 Linux 内核的内存管理、进程调度、网络协议栈工作原理

    • 学习资源:《Understanding the Linux Kernel》、内核源码 Documentation 目录
    • 实践建议:从 /proc 和 /sys 文件系统入手,理解每个参数的含义

6.3 参考资料

  • Brendan Gregg 的性能分析网站 - Linux 性能分析领域最权威的资源
  • USE Method - USE 方法论详细说明
  • Linux Performance - Linux 性能工具全景图
  • Netflix TechBlog - Netflix 性能工程实践
  • Percona Blog - 数据库性能调优

附录

A. 命令速查表

# === 全局概览 ===uptime                          # 查看 load averagetop -bn1 | head -20             # CPU/内存概览vmstat 1 10                     # 系统级快照(CPU/内存/IO/上下文切换)dstat -tcmsdnl 5                # 综合实时监控# === CPU ===mpstat -P ALL 1 5               # 每个 CPU 核心使用率pidstat -u 1 5                  # 进程级 CPU 使用率pidstat -w 1 5                  # 进程级上下文切换perf top -p <PID>               # 实时 CPU 热点函数perf record -p <PID> -g -- sleep 30  # CPU 采样# === 内存 ===free -h                         # 内存概览(看 available)smem -rkt -s pss                # 进程真实内存(PSS)slabtop -o                      # 内核 slab 内存cat /proc/<PID>/status          # 进程内存详情dmesg | grep -i oom             # OOM 事件# === 磁盘 IO ===iostat -xz 1 5                  # 磁盘 IO 统计iotop -oP                       # IO 进程排名pidstat -d 1 5                  # 进程级 IOdf -hT                          # 文件系统使用率df -i                           # inode 使用率lsof +L1                        # 已删除未释放的文件# === 网络 ===ss -s                           # 连接状态汇总ss -tn state established        # ESTABLISHED 连接ss -tan state time-wait | wc -l # TIME_WAIT 数量sar -n DEV 1 5                  # 网卡流量nstat -az | grep -i tcp         # TCP 协议栈计数器tcpdump -i eth0 port 80 -c 1000 -w /tmp/cap.pcap  # 抓包ethtool -S eth0                 # 网卡统计

B. CPU 状态术语表

术语
英文
解释
us
user
用户态 CPU 时间,运行应用代码
sy
system
内核态 CPU 时间,系统调用、内核线程
ni
nice
低优先级用户态 CPU 时间(nice > 0 的进程)
id
idle
空闲 CPU 时间
wa
iowait
等待 IO 完成的 CPU 时间(CPU 空闲但有进程在等 IO)
hi
hardware interrupt
硬中断处理时间
si
software interrupt
软中断处理时间(网络包处理、定时器等)
st
steal
虚拟机被宿主机偷走的 CPU 时间

C. 进程状态术语表

状态
含义
说明
R
Running
正在运行或在运行队列中等待
S
Sleeping
可中断睡眠,等待事件完成
D
Disk Sleep
不可中断睡眠,通常在等待 IO,不能被 kill -9 杀掉
Z
Zombie
僵尸进程,已退出但父进程没有 wait() 回收
T
Stopped
被信号停止(SIGSTOP/SIGTSTP)
t
Tracing stop
被调试器(ptrace)停止
X
Dead
已退出,正常情况下看不到

D. 常用内核参数参考值

参数
默认值
建议值
适用场景
vm.swappiness
60
10(通用)/ 1(数据库)
所有服务器
vm.dirty_ratio
20
10
IO 密集型
vm.dirty_background_ratio
10
5
IO 密集型
net.core.somaxconn
128
65535
Web 服务器
net.ipv4.tcp_max_syn_backlog
128
65535
高并发服务
net.core.netdev_max_backlog
1000
50000
高流量网卡
net.ipv4.tcp_tw_reuse
0
1
短连接场景(非 NAT)
net.ipv4.tcp_keepalive_time
7200
600
长连接服务
fs.file-max
系统默认
2097152
高并发服务
kernel.perf_event_paranoid
2
1
需要 perf 排查的环境

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 15:34:36 HTTP/2.0 GET : https://f.mffb.com.cn/a/474301.html
  2. 运行时间 : 0.092589s [ 吞吐率:10.80req/s ] 内存消耗:4,727.52kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=5da38045eaa70c9a6b364abc87dee9c7
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000741s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000890s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000328s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000274s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000465s ]
  6. SELECT * FROM `set` [ RunTime:0.000202s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000511s ]
  8. SELECT * FROM `article` WHERE `id` = 474301 LIMIT 1 [ RunTime:0.000542s ]
  9. UPDATE `article` SET `lasttime` = 1770536076 WHERE `id` = 474301 [ RunTime:0.012346s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000274s ]
  11. SELECT * FROM `article` WHERE `id` < 474301 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.004468s ]
  12. SELECT * FROM `article` WHERE `id` > 474301 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000380s ]
  13. SELECT * FROM `article` WHERE `id` < 474301 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001641s ]
  14. SELECT * FROM `article` WHERE `id` < 474301 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001840s ]
  15. SELECT * FROM `article` WHERE `id` < 474301 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000740s ]
0.094219s