上周我有个问题一直困扰着我。
在windows调试器中,有一个!heap -s
命令,它输出虚拟内存的堆状态,并使用以下公式计算外部碎片:
External fragmentation = 1 - (larget free block / total free size)
Linux中是否有类似的方法输出计算效果所需的统计数据?
长话短说:
我有一个c应用程序,它使用malloc和free不断地分配和释放不同大小的空间,每个分配都有不同的生命周期。
我使用的平台是lubuntu,因此
ptmalloc2
算法是默认的。我知道这些分配是在虚拟用户空间堆中提供的(除了那些大于128KB的分配程序使用
mmap
的分配程序外),并且在实际访问时映射到物理页。大多数分配的大小都小于80字节,因此它们是从fastbins提供的。
使用
Valgrind
和Massif
可以得到内部碎片,因为它报告了每次分配使用的额外字节。然而,我主要关心的是如何找出外部碎片。
我知道
/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
的大小。我怎样才能有一个函数来“遍历”堆并收集这些统计数据?
提前谢谢大家。
最佳答案
我相信这将取决于您使用的分配器。也就是说,对于您正在使用的malloc(等)和free实现,您可能需要不同的策略。如果实现没有提供作为扩展所需的信息,则可能需要读取其源代码并键入自己的逻辑来检查分配状态。
我相信页面到交换空间和物理ram的映射在一个较低的级别上,因此对您的目标没有特别的帮助。malloc(等)和free实现可能关心也可能不关心那些较低级别的细节。
如果您确定您正在使用ptmalloc2,那么您能够找到它的源代码吗?
关于c - Linux堆碎片,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23853619/