4. 资源画像维度:CPU、内存、磁盘、网络、IO、线程池、连接池
资源画像的核心任务是将服务运行时消耗的物理与逻辑资源进行量化建模。只有覆盖完整的资源维度,容量压测和水位基线才能真实反映系统的瓶颈与冗余。本章逐一拆解 CPU、内存、磁盘、网络、IO、线程池、连接池七个维度的关键指标、采集方法与画像输出。
4.1 资源维度总览
下表列出七个维度的核心关注点与典型瓶颈表现,帮助你在制定画像方案时快速对齐目标。
| 维度 | 核心关注点 | 典型瓶颈表现 |
|---|---|---|
| CPU | 使用率、Load Average、上下文切换 | 高使用率导致请求排队,响应时间陡增 |
| 内存 | 堆/非堆、RSS、Swap、GC 频率 | OOM、频繁 Full GC、内存泄漏 |
| 磁盘 | 容量、IOPS、吞吐量、延迟 | 磁盘写满、IO 等待过高 |
| 网络 | 带宽、连接数、重传率、RTT | 带宽打满、丢包重传、连接超时 |
| IO | 文件 IO、网络 IO、IO 调度 | IO 瓶颈导致整体吞吐下降 |
| 线程池 | 活跃线程数、队列深度、拒绝策略 | 线程耗尽、任务堆积、拒绝执行 |
| 连接池 | 活跃连接数、空闲连接、获取等待时间 | 连接获取超时、数据库连接耗尽 |
实践建议: 在压测前,先对每个维度采集 7×24 小时的基线数据,识别出日常峰值与谷值,避免将瞬时毛刺误判为容量瓶颈。
4.2 CPU 画像
CPU 是服务吞吐量的直接上限。画像时需区分 用户态 (us)、系统态 (sy)、等待 IO (wa)、硬/软中断 (hi/si) 和 空闲 (id)。关键指标包括:
- CPU 使用率:整体与按核分布,判断是否存在单核热点。
- Load Average:1/5/15 分钟均值,与 CPU 核数对比判断是否过载。
- 上下文切换 (cs):每秒切换次数,过高可能暗示锁竞争或线程过多。
- 运行队列 (runnable):等待 CPU 的线程数,持续大于核数说明 CPU 饱和。
# 采集 CPU 画像常用命令
top -bn1 | head -5
mpstat -P ALL 1 3
vmstat 1 5 | tail -4
cat /proc/loadavg
4.3 内存画像
内存画像需要区分 进程级 与 系统级。对于 Java 应用,堆内分代(Eden、Survivor、Old)和堆外(MetaSpace、DirectBuffer)都要纳入。核心指标:
- RSS (Resident Set Size):进程实际占用的物理内存。
- 堆内存使用:当前使用量、峰值、GC 后回收量。
- GC 频率与停顿:Young GC / Full GC 间隔与耗时。
- Swap 使用:swap in/out 速率,出现则说明物理内存不足。
避坑提醒: 不要只看堆内存使用率。堆外内存(如 DirectBuffer、线程栈)泄漏同样会导致 OOM,务必通过
/proc/[pid]/smaps 或 NMT (Native Memory Tracking) 监控。
4.4 磁盘与 IO 画像
磁盘和 IO 通常合并分析,因为磁盘瓶颈最终表现为 IO 等待。关键指标:
| 指标 | 说明 | 危险阈值 |
|---|---|---|
| 磁盘使用率 | 已用容量 / 总容量 | > 80% 需预警,> 90% 立即处理 |
| IOPS | 每秒读写次数 | 接近设备上限时延迟飙升 |
| 吞吐量 | 每秒读写 MB | 接近带宽上限 |
| IO 等待时间 | 平均每次 IO 的完成耗时 | > 10ms 需关注,> 30ms 严重 |
| await / svctm | IO 平均等待时间与服务时间 | await 远大于 svctm 说明队列拥堵 |
# 磁盘与 IO 采集
iostat -x 1 5
df -h
dstat -d 1 10
4.5 网络画像
网络维度关注带宽、连接质量与协议栈状态。核心指标:
- 带宽使用率:入口/出口流量 vs 网卡带宽上限。
- TCP 连接数:ESTABLISHED、TIME_WAIT、CLOSE_WAIT 数量。
- 重传率 (Retrans):重传报文占比,超过 1% 通常表示网络质量劣化。
- RTT (Round Trip Time):端到端延迟,影响远程调用耗时。
案例: 某服务压测时 QPS 上不去,CPU 和内存均低。排查发现 TIME_WAIT 连接数超过 5 万,导致新连接建立失败。优化连接复用后 QPS 提升 3 倍。
4.6 线程池与连接池画像
线程池和连接池是服务端最关键的 逻辑资源,直接影响请求处理能力。画像时需采集:
| 池类型 | 关键指标 | 画像输出 |
|---|---|---|
| 线程池 | 核心线程数、最大线程数、活跃线程数、队列大小、拒绝次数 | 线程利用率曲线、任务排队延迟分布 |
| 连接池 | 最大连接数、活跃连接数、空闲连接数、获取连接等待时间 | 连接获取超时率、连接周转速率 |
// Java 线程池画像示例(Micrometer 指标)
thread_pool_active_threads{pool_name="biz-pool"}
thread_pool_queue_size{pool_name="biz-pool"}
thread_pool_rejected_count{pool_name="biz-pool"}
// 连接池(HikariCP)
hikaricp_connections_active{pool_name="main-pool"}
hikaricp_connections_waiting{pool_name="main-pool"}
hikaricp_connections_timeout_total{pool_name="main-pool"}
4.7 资源画像维度关系图
下图展示七个维度之间的依赖与影响关系,帮助你在制定水位基线时识别级联效应。
4.8 画像输出规范
每个维度的画像最终应输出以下内容,用于压测场景设计和基线制定:
- 维度指标列表:明确采集哪些指标,采集频率(如 10s 粒度)。
- 基线区间:日常低峰、高峰、毛刺的 P50/P95/P99 值。
- 瓶颈阈值:触发告警或限流的指标边界值。
- 关联关系:该维度变化时,对其他维度的影响(如 CPU 高导致连接池等待增加)。
输出示例(CPU 维度):
- 指标:user%, sys%, load1, context_switch/s
- 基线:user% P50=35%, P95=68%, P99=82%
- 瓶颈阈值:user% > 85% 持续 30s 触发扩容
- 关联:CPU user% > 75% 时,线程池活跃线程数同步上升,连接池获取等待时间增加 200%
- 指标:user%, sys%, load1, context_switch/s
- 基线:user% P50=35%, P95=68%, P99=82%
- 瓶颈阈值:user% > 85% 持续 30s 触发扩容
- 关联:CPU user% > 75% 时,线程池活跃线程数同步上升,连接池获取等待时间增加 200%
完成七个维度的独立画像后,下一步将进入 资源画像的关联分析,识别维度间的因果链与级联效应,为压测场景编排提供依据。