在对内存进行性能分析以得到带有断层图和时间的最大RSS时,结果不同

时间:2019-01-14 12:27:31

标签: c++ performance time mmap massif

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

我将Valgrind的块工具用于选项pages-as-heap=yesmassif visualizer。我希望这将使我看到RSS的高峰。我运行mmap的程序时要保留1GB的空间。地块可视化器向我精确显示了预期的结果(峰值1GB)(see image)

我还使用了\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选项的massif将会向您显示RSS的最大值,这是它的峰值。但是,\time命令的输出显示的峰值要小得多。我怀疑massif的快照是关于虚拟内存的,但是如果我错了,请更正我。此外,如果非常熟悉massif的人能描述它的工作原理以及是否有办法获得最大的RSS,我将不胜感激。预先感谢!

编辑:这里的答案似乎部分回答了我的问题: Does mmap or malloc allocate RAM?

据我了解,在大多数OS系统中,将文件映射到内存时,它们会占用虚拟空间而不是物理内存空间。但是,一旦被映射的页面变脏(即在其上写入了某些内容),它们便开始占用物理内存空间。

因此,回到我最初的问题,这是否可能意味着带有标志--pages-as-heap=yes的valgrind massif跟踪虚拟内存空间,而\time -v则由于页面是没有修改?

0 个答案:

没有答案