上周有个问题一直困扰着我。
在 Windows 调试器中,有一个!heap -s
命令可以输出虚拟内存的堆状态并使用以下公式计算外部碎片:
External fragmentation = 1 - (larget free block / total free size)
linux中是否有类似的方法,可以输出计算效果所需的那些统计数据?
现在长话短说:我有一个 C 应用程序,它使用 malloc 和 free 不断分配和释放不同大小的空间,每次分配都有不同的寿命。我使用的平台是 Lubuntu,所以ptmalloc2
算法是默认的。
我知道这些分配是在虚拟用户空间堆中提供的(分配器使用的那些大于 128Kb 的分配mmap
除外),并且在实际访问时映射到物理页面。大多数分配的大小小于 80 字节,因此它们由 FastBins 提供。
使用Valgrind
andMassif
我可以获得内部碎片,因为它报告了用于每个分配的额外字节。
但是,我主要关心的是如何找出外部碎片。我知道/proc/[pid]/smaps
堆大小和pmap-d[pid] anon
统计信息,但我发现很难根据外部碎片来解释它们。
我也知道了LD_PRELOAD
,我可以动态连接的/lib/i386-linux-gnu/libmemusage.so
。该库输出堆总数、峰值和请求分配大小的分布。
我知道__malloc__hook
现在已弃用,我真的不想依赖于实现特定的统计数据,例如malloc_stats()
和mallinfo()
。但是,如果您对使用这两个有任何建议,请告诉我。
我可以说外部碎片问题是当一个请求无法满足时,因为堆中没有连续的空间,但请求的总大小分散在该区域周围。
我还没有弄清楚,如何获得所需的统计数据,以便计算这种效果。例如,不同的公式说明我必须捕获live_memory
或获取total_free_pages
,或获取largest_free_block
. 我怎样才能有一个函数来“遍历”堆并收集这些统计信息?
提前谢谢大家。