深入理解Google TCMalloc内存统计信息
tcmalloc 项目地址: https://gitcode.com/gh_mirrors/tc/tcmalloc
概述
TCMalloc作为Google开发的高性能内存分配器,其内部统计信息对于性能调优和问题诊断至关重要。本文将详细解析如何获取和解读TCMalloc的内存统计信息,帮助开发者更好地理解内存使用情况。
获取内存统计信息
通过调用tcmalloc::MallocExtension::GetStats()
接口,可以获取TCMalloc的详细统计信息。这些信息以人类可读的格式呈现,包含了内存使用的各个方面。
统计信息详解
摘要信息
统计输出的前几行是最重要的摘要信息:
MALLOC: 10858234672 (10355.2 MiB) Bytes in use by application
MALLOC: + 827129856 ( 788.8 MiB) Bytes in page heap freelist
...
MALLOC: = 12238113346 (11671.2 MiB) Actual memory used (physical + swap)
各字段含义如下:
- 应用程序使用字节数:应用程序实际使用的内存量,不包括缓存和内部数据结构占用的内存
- 页堆空闲列表字节数:TCMalloc页堆中可用的内存,这些内存可以返回给操作系统
- 中央缓存空闲列表字节数:中央缓存中保存的部分使用过的内存块
- 每CPU缓存空闲列表字节数:每个CPU核心缓存的内存块(默认模式)
- 传输缓存空闲列表字节数:准备提供给应用程序使用的内存缓存
- 线程缓存空闲列表字节数:每个线程缓存的内存块(旧模式)
- 元数据字节数:用于跟踪内存分配的数据结构大小
关键汇总指标
- 实际使用内存:TCMalloc认为正在使用的总内存量
- 释放给操作系统的字节数:TCMalloc已释放但可能尚未减少RSS的内存
- 虚拟地址空间使用量:TCMalloc使用的虚拟地址空间总量
元数据详细信息
这部分提供了TCMalloc内部数据结构的详细使用情况,主要用于调试:
MALLOC: 236176 Spans in use
MALLOC: 238709 ( 10.9 MiB) Spans created
...
- Span使用情况:管理内存块的数据结构
- 线程堆使用情况:线程本地内存管理结构
- 堆栈跟踪信息:采样对象的相关元数据
- 页表信息:对象地址到页面信息的映射结构
实际内存碎片率
MALLOC: 12238113346 (11671.2 MiB) Actual memory used at peak
MALLOC: 11626207678 (11087.6 MiB) Estimated in-use at peak
MALLOC: 5.2632 Realized fragmentation (%)
实际碎片率是一个重要指标,表示在内存需求峰值时的内存开销比例。这个指标来自Google的研究论文,反映了整个进程生命周期中的内存碎片情况。
页面大小信息
TCMalloc涉及三种页面概念:
- 系统默认页面大小:通常为4KB(x86架构)
- TCMalloc页面大小:内存管理的基本单位,可配置为4KB、8KB(默认)、32KB或256KB
- TCMalloc大页面大小:系统的大页面尺寸(x86为2MB)
MALLOC: 32768 Tcmalloc page size
MALLOC: 2097152 Tcmalloc hugepage size
不同页面大小的选择需要在内存效率和管理开销之间进行权衡。
实验和钩子状态
TCMalloc内置了实验框架,会报告当前启用的实验:
MALLOC EXPERIMENTS: TCMALLOC_TEMERAIRE=0 TCMALLOC_TEMERAIRE_WITH_SUBRELEASE_V3=0
同时会报告钩子状态:
MALLOC HOOKS: NEW=0 DELETE=0 SAMPLED_NEW=0 SAMPLED_DELETE=0
实际内存占用
统计信息还包括操作系统报告的内存使用情况:
TOTAL: 86880677888 (82855.9 MiB) Bytes resident (physical memory used)
TOTAL: 89124790272 (84996.0 MiB) Bytes mapped (virtual memory used)
- 常驻字节数:实际物理内存使用量(RSS)
- 映射字节数:虚拟地址空间使用量(VSS)
按大小分类的信息
内存请求会被舍入到特定大小(称为大小类)。统计信息详细列出了每个大小类的内存使用情况:
class 1 [ 8 bytes ] : 45645 objs; 0.3 MiB; 0.3 cum MiB; 73 live pages; spans: 19 ret / 92 req = 0.2065;
class 2 [ 16 bytes ] : 39942 objs; 0.6 MiB; 1.0 cum MiB; 120 live pages; spans: 3 ret / 123 req = 0.0244;
...
各列分别表示:
- 对象大小
- 各缓存中的对象数量
- 占用内存量
- 累计内存量
- 活动页面数
- 已返回/请求的span比例
中央缓存利用率
这部分展示了中央缓存中span的利用率直方图:
class 1 [ 8 bytes ] : 0 < 1, 0 < 2, 0 < 4, 0 < 8, 0 < 16, 1 < 32, 0 < 64, 1 < 128, 1 < 256, 1 < 512, 0 < 1024, 0 < 2048, 4 < 4096, 16 < 8192, 0 < 16384, 0 < 32768, 0 < 65536
...
每列表示分配对象数小于N的span数量。
传输缓存信息
传输缓存是TCMalloc的重要组件,统计信息详细记录了每个大小类的缓存情况:
class 1 [ 8 bytes ] : 1472 objs; 0.0 MiB; 0.0 cum MiB; 2048 capacity; 2048 max_capacity; 935 insert hits; 8543 insert misses ( 4507 partial); 889 remove hits; 6612 remove misses ( 86 partial);
...
包括:
- 当前缓存对象数和容量
- 插入/移除操作的命中/未命中次数
- 部分未命中情况
总结
TCMalloc的统计信息非常全面,从宏观的内存使用概况到微观的每个大小类的缓存情况都有详细记录。理解这些信息对于优化内存使用、诊断内存问题至关重要。建议开发者重点关注摘要信息和关键指标,在需要深入分析时再查看详细的分类统计。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考