首页 > 解决方案 > 分析内存以获得具有地块和时间的最大 RSS 时的不同结果

问题描述

一点上下文:我尝试实现一个 C++ 应用程序,该应用程序用于mmap映射一些任意大文件以进行读写,可以从几 MB 扩展到几 GB。因此,分析程序的内存使用情况(峰值 RSS,我想看看它消耗了多少物理内存)以查看其性能非常重要。

我将 Valgrind 的地块工具与选项pages-as-heap=yesmassif visualizer. 我希望这将向我展示 RSS 峰值。我运行程序时mmap正好保留 1GB。massif-visualizer 向我准确展示了预期的内容(1GB 峰值)(见图)

我还使用\time -v了命令,这表明最大 RSS 的大小非常小(5000 KB,或多或少)。这是一个示例输出:

User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 112%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 4772
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 1928
Voluntary context switches: 32
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 88
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

我还修改了程序,以便time运行更长时间,以防内存快照的增量不足,但我得到了相同的结果。

为什么内存峰值不同?从我在几篇文章中阅读的内容来看,人们期望带有pages-as-heap=yes选项的地块会向您显示最大的 RSS,这将是它的峰值。\time但是,显示较小峰值的命令输出存在差异。我怀疑地块的快照是关于虚拟内存的,但如果我错了,请纠正我。此外,如果任何非常熟悉地块的人能够描述它的工作原理以及是否有办法获得最大 RSS,我将不胜感激。提前致谢!

编辑:这里的答案似乎部分回答了我的问题: mmap 或 malloc 是否分配 RAM?

据我了解,在大多数操作系统系统中,当您将文件映射到内存时,它们会占用虚拟空间而不是物理内存空间。然而,映射页面一旦变脏就开始占用物理内存空间,即在它们上面写了一些东西。

那么,回到我最初的问题,这是否意味着带有标志--pages-as-heap=yes的 valgrind 地块跟踪虚拟内存空间,而\time -v由于页面未被修改,显示的物理内存较少?

标签: c++performancetimemmapmassif

解决方案


推荐阅读