1. 课程导入与性能分析全景

在开始学习具体的工具和调优手段之前,我们需要先建立一张"性能地图"。RHEL 系统性能分析的核心目标,并不是把某个指标压到最低,而是在给定硬件资源和业务负载下,让系统稳定地满足服务等级要求(SLA)。换句话说,性能分析回答的是三个问题:系统现在表现如何?瓶颈在哪里?为了支撑未来的负载,还需要多少资源?前两个问题属于性能分析,第三个问题属于容量规划,二者共同构成本课程的主线。

三个关键指标:吞吐量、延迟、利用率

无论分析的是 CPU、内存、磁盘还是网络,我们几乎总是围绕三个指标展开观察。

吞吐量(Throughput)描述单位时间内系统完成的工作量,例如每秒处理的 HTTP 请求数(req/s)、每秒读写的字节数(MB/s)、每秒完成的事务数(TPS)。它衡量的是"做了多少事"。

延迟(Latency)描述单个请求从发出到完成所经历的时间,例如一次磁盘 I/O 的服务时间、一次数据库查询的响应时间。它衡量的是"一件事做得多快"。延迟通常用平均值、中位数(p50)、p95、p99 等分位数来描述,因为平均值会掩盖长尾请求,而用户体验往往由 p99 决定。

利用率(Utilization)描述资源在观察窗口内处于忙碌状态的比例,例如 CPU 利用率 65%、磁盘利用率 90%。它衡量的是"资源被用掉了多少"。

这三个指标之间存在典型的相互制约关系:当利用率接近饱和时,排队现象加剧,延迟会非线性上升,而吞吐量增长趋缓甚至下降。理解这一点,是后续判断瓶颈的基础。

经验提示:不要只看平均值。一个 CPU 平均利用率 40% 的系统,可能在每秒的某个瞬间出现 100% 的尖峰,从而造成请求超时。观察窗口和采样粒度同样重要。

性能分析的整体方法论

面对"系统变慢了"这类模糊问题,最忌讳的是凭直觉直接改参数。一个可复用的分析流程是:先定义目标,再建立基线,然后自顶向下逐层定位,最后验证并固化结论。

  1. 定义目标与范围:明确是响应时间超标、吞吐量不足,还是资源即将耗尽;明确影响的是哪类业务、哪个时间段。
  2. 建立基线:在系统正常时采集 CPU、内存、磁盘、网络的关键数据,作为后续对比的参照。没有基线,"异常"就无从谈起。
  3. 自顶向下定位:从应用层现象出发,逐层向下排查,先看整体负载(如 uptime 的 load average),再看各子系统,最后深入到具体进程和线程。
  4. 验证假设:每次只改变一个变量,用数据确认改动是否真正解决了问题,避免"改了但不知道有没有用"。
  5. 固化与复盘:把有效的配置、监控项和判断依据记录下来,形成可复用的经验。

在 RHEL 中,这套流程会落到具体工具上:uptime、vmstat、mpstat、pidstat、iostat、sar、top、perf 等。它们各自覆盖不同的层次,后续章节会逐一展开。

容量规划的基本概念

容量规划是性能分析的"向前看"版本。它要回答:按照当前的增长趋势,现有资源还能支撑多久?需要提前扩容多少?

容量规划通常包含几个要素:当前容量(现有资源能承载的最大负载)、当前负载(实际业务量)、增长预测(按历史趋势或业务计划推算)、安全余量(预留应对突发和峰值)。一个常用的经验法则是:关键资源的目标利用率控制在 70% 左右,为峰值和突发留出空间。

下面这张图把本节的核心概念组织成一张"性能与容量全景图":左侧是三个关键指标,中间是自顶向下的分析方法,右侧是容量规划的输入与输出。它帮助你在后续学习中随时定位自己处在哪个环节。

RHEL 性能分析与容量规划全景 从指标观察到瓶颈定位,再到容量决策 三个关键指标 吞吐量 req/s · MB/s · TPS 做了多少事 延迟 avg · p50 · p95 · p99 一件事做得多快 利用率 CPU · 磁盘 · 网络 % 资源被用掉多少 自顶向下分析方法 ① 定义目标与范围 ② 建立性能基线 ③ 逐层定位瓶颈 ④ 验证假设 ⑤ 固化与复盘 容量规划 当前容量 现有资源可承载上限 当前负载 实际业务量 增长预测 历史趋势 / 业务计划 安全余量 目标利用率 ≈ 70% 扩容决策 观察 决策 性能分析回答"现在如何、瓶颈在哪",容量规划回答"未来需要多少资源"

一个简单的示例:从现象到判断

假设一台 RHEL 服务器上运行 Web 服务,用户反馈"页面变慢"。我们先用 uptime 看整体负载:

$ uptime
 14:32:05 up 12 days,  3:21,  2 users,  load average: 8.42, 6.15, 3.80

1 分钟负载 8.42 明显高于 15 分钟负载 3.80,说明负载正在快速上升。接着用 vmstat 1 观察:

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 6  2      0 512340  82100 920400    0    0   420  1180 3200 5400 22  8 62  8  0
 7  3      0 508200  82100 918600    0    0   510  1320 3500 5900 24  9 58  9  0

这里 r 列(运行队列)持续在 6~7,wa(I/O 等待)约 8%~9%,id(空闲)约 58%~62%。运行队列长度大于 CPU 核数(假设 4 核),说明有进程在排队等 CPU;同时存在一定 I/O 等待。此时可以初步判断:CPU 是主要瓶颈之一,磁盘 I/O 也在贡献延迟。下一步应使用 pidstat -u 1 和 iostat -x 1 进一步定位到具体进程和设备。

这个例子说明:指标不是孤立看的,而是通过"负载—排队—等待—空闲"之间的关系来推断瓶颈。运行队列长、空闲率不低、I/O 等待存在,三者组合起来才指向"CPU 与磁盘共同受限"的判断。

容量规划的一个简化计算

继续上面的例子。假设当前业务峰值是 800 req/s,CPU 平均利用率 55%,目标是把利用率控制在 70% 以内。按线性估算,单机可支撑的峰值约为:

可支撑峰值 ≈ 当前峰值 × (目标利用率 / 当前利用率)
           ≈ 800 × (70% / 55%)
           ≈ 1018 req/s

如果业务预计半年后增长到 1400 req/s,则单机不足,需要至少 2 台同等配置的服务器(1400 / 1018 ≈ 1.38,向上取整并考虑冗余)。这只是一个线性近似,实际还要考虑延迟非线性上升、连接数、内存和磁盘带宽等因素,但它给出了容量规划的基本思路:用当前负载和利用率推算容量上限,再与预测负载比较,得出扩容需求。

注意:上述数值均为教学示例中的假设值,并非真实测量结果。实际容量规划必须基于自己系统的基线数据和压测结果,不能直接套用。

本节小结