3. 碎片度量指标

聊到显存碎片,很多人第一反应就是「碎片率」。但说实话,碎片率到底怎么算?我见过不少团队,嘴上说着碎片严重,实际连个量化指标都没有。这就像看病只喊疼,却不去量体温——你没法判断病情到底多重。

今天我们就来把这几个指标掰开揉碎。外部碎片率、内部碎片率、最大连续块统计、碎片系数,这四个维度基本能覆盖90%的碎片分析场景。我个人习惯是,每次做显存优化前,先把这四个指标跑一遍,心里就有底了。

1. 外部碎片率:你浪费了多少连续空间?

外部碎片,说白了就是「有空间,但不连续」。你想想看,显存里明明还有10MB空闲,但分配一个8MB的块却失败了——这就是外部碎片在作祟。

计算公式很简单:

外部碎片率 = 1 - (最大连续空闲块大小 / 总空闲大小) × 100%

举个例子:

  • 总空闲大小:20MB
  • 最大连续空闲块:8MB
  • 外部碎片率 = 1 - (8 / 20) = 60%

这个60%意味着什么?意味着你有六成的空闲空间是「看得见摸不着」的。我在项目中遇到过,某个推理服务的外部碎片率飙到75%,结果一个中等大小的tensor分配失败,服务直接挂了。嗯,那次教训挺深刻的。

经验阈值:我个人建议,外部碎片率超过40%就要开始警惕了。超过60%基本属于「重度碎片」,必须介入整理。

3. 内部碎片率:分配粒度带来的浪费

内部碎片和外部碎片不同。外部碎片是「空间不连续」,内部碎片是「分配多了用不完」。比如你申请了3KB,但分配器给了你一个4KB的块——那1KB就是内部碎片。

计算公式:

内部碎片率 = (已分配但未使用的空间 / 总分配空间) × 100%

为什么会有内部碎片?说白了就是对齐和固定块大小导致的。我见过一个场景:某个框架默认分配粒度是256字节,结果大量请求只有几十字节,内部碎片率直接干到30%。

分配粒度 平均请求大小 内部碎片率
256B 64B 75%
128B 64B 50%
64B 64B 0%
避坑指南:我曾经为了追求分配速度,把粒度设得很大。结果内部碎片率飙升,显存利用率惨不忍睹。后来我学乖了——分配粒度要根据实际请求分布来定,不能一刀切。

3. 最大连续块统计:最直观的「健康指标」

这个指标最简单,也最实用。最大连续块的大小,直接决定了你能不能分配大块内存。我习惯把这个指标做成一个时间序列图,实时监控。

统计方式:

  • 扫描所有空闲块,找出最大的那个
  • 记录其起始地址和大小
  • 按时间维度记录变化趋势

举个例子,一个8GB显存的GPU:

  • 初始状态:最大连续块 ≈ 8GB
  • 运行一段时间后:最大连续块 ≈ 2GB
  • 碎片严重时:最大连续块 ≈ 256MB

你想想看,从8GB掉到256MB,这中间发生了什么?其实就是碎片在慢慢积累。我记得有一次排查线上问题,发现最大连续块在30分钟内从4GB降到了512MB,赶紧触发了碎片整理,才避免了一次OOM。

注意:最大连续块下降不一定是坏事。如果是因为正常分配导致的,那没问题。但如果下降速度异常快,或者持续下降不恢复,那就要警惕了。

4. 碎片系数:综合评估碎片程度

碎片系数是我个人比较喜欢的一个指标。它把外部碎片和内部碎片综合起来,给出一个0到1之间的分数。0表示完全无碎片,1表示碎片极其严重。

计算公式:

碎片系数 = 1 - (有效使用空间 / 总显存空间)

其中「有效使用空间」指的是:

  • 实际被应用程序使用的数据大小
  • 不包括内部碎片和外部碎片造成的浪费

举个例子:

  • 总显存:8GB
  • 实际数据:4GB
  • 内部碎片:1GB
  • 外部碎片导致无法使用的空间:1GB
  • 有效使用空间:4GB
  • 碎片系数 = 1 - (4 / 8) = 0.5

这个0.5意味着,你有一半的显存被浪费了。说实话,这个数字挺吓人的。我在实际项目中见过碎片系数0.6以上的情况,那基本就是「显存快废了」的状态。

我的建议:碎片系数超过0.3就要开始优化。超过0.5必须立即介入。超过0.7?嗯,那基本可以准备重启服务了。

5. 四个指标的综合运用

单独看一个指标,容易误判。我习惯把这四个指标放在一起看:

  • 外部碎片率高 + 最大连续块小:典型的碎片问题,需要整理或改用伙伴系统
  • 内部碎片率高 + 外部碎片率低:分配粒度问题,调整对齐策略
  • 碎片系数高 + 最大连续块正常:可能是内部碎片严重,检查分配粒度
  • 四个指标都高:显存管理策略需要重构

你想想看,如果只看外部碎片率,你可能会忽略内部碎片的浪费。如果只看最大连续块,你可能会错过整体利用率低的问题。四个指标一起看,才能看到全貌。

实战技巧:我曾经在一个项目中,把四个指标做成仪表盘,每5秒刷新一次。这样碎片一有异常,马上就能发现。有一次凌晨3点,碎片系数突然飙升,系统自动触发了整理,服务完全没受影响。

6. 知识体系图

下面这张图,把四个指标的关系和核心逻辑梳理清楚了。我建议你保存下来,做碎片分析时对照着看。

碎片度量指标知识体系 碎片度量指标 外部碎片率 内部碎片率 最大连续块 碎片系数 1 - (最大连续块/总空闲) 已分配未使用/总分配 扫描空闲块取最大值 1 - (有效空间/总空间) 综合运用:四个指标一起看,避免误判 经验阈值参考 外部碎片率 > 40% 需警惕 | 内部碎片率 > 30% 需优化 碎片系数 > 0.3 需关注 | 最大连续块持续下降需介入

这四个指标,说白了就是显存碎片的「体检报告」。外部碎片率看空间连续性,内部碎片率看分配效率,最大连续块看大块分配能力,碎片系数看整体利用率。四个指标结合起来,你就能对显存碎片有个全面的认识。

我个人习惯是,每次优化前后都跑一遍这四个指标。优化前看问题在哪,优化后看效果如何。数据不会骗人,指标会告诉你一切。

最后说一句:指标只是工具,关键还是理解背后的原理。你把这些指标吃透了,显存碎片管理就成功了一半。