碎片度量指标:外部碎片率、内部碎片率、最大连续块与碎片系数
聊到显存碎片,很多人第一反应就是「碎片率」。但说实话,碎片率到底怎么算?我见过不少团队,嘴上说着碎片严重,实际连个量化指标都没有。这就像看病只喊疼,却不去量体温——你没法判断病情到底多重。
今天我们就来把这几个指标掰开揉碎。外部碎片率、内部碎片率、最大连续块统计、碎片系数,这四个维度基本能覆盖90%的碎片分析场景。我个人习惯是,每次做显存优化前,先把这四个指标跑一遍,心里就有底了。
1. 外部碎片率:你浪费了多少连续空间?
外部碎片,说白了就是「有空间,但不连续」。你想想看,显存里明明还有10MB空闲,但分配一个8MB的块却失败了——这就是外部碎片在作祟。
计算公式很简单:
外部碎片率 = 1 - (最大连续空闲块大小 / 总空闲大小) × 100%
举个例子:
- 总空闲大小:20MB
- 最大连续空闲块:8MB
- 外部碎片率 = 1 - (8 / 20) = 60%
这个60%意味着什么?意味着你有六成的空闲空间是「看得见摸不着」的。我在项目中遇到过,某个推理服务的外部碎片率飙到75%,结果一个中等大小的tensor分配失败,服务直接挂了。嗯,那次教训挺深刻的。
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以上的情况,那基本就是「显存快废了」的状态。
5. 四个指标的综合运用
单独看一个指标,容易误判。我习惯把这四个指标放在一起看:
- 外部碎片率高 + 最大连续块小:典型的碎片问题,需要整理或改用伙伴系统
- 内部碎片率高 + 外部碎片率低:分配粒度问题,调整对齐策略
- 碎片系数高 + 最大连续块正常:可能是内部碎片严重,检查分配粒度
- 四个指标都高:显存管理策略需要重构
你想想看,如果只看外部碎片率,你可能会忽略内部碎片的浪费。如果只看最大连续块,你可能会错过整体利用率低的问题。四个指标一起看,才能看到全貌。
6. 知识体系图
下面这张图,把四个指标的关系和核心逻辑梳理清楚了。我建议你保存下来,做碎片分析时对照着看。
这四个指标,说白了就是显存碎片的「体检报告」。外部碎片率看空间连续性,内部碎片率看分配效率,最大连续块看大块分配能力,碎片系数看整体利用率。四个指标结合起来,你就能对显存碎片有个全面的认识。
我个人习惯是,每次优化前后都跑一遍这四个指标。优化前看问题在哪,优化后看效果如何。数据不会骗人,指标会告诉你一切。
想要更多资料,联系可可