上下文的一部分:我尝试实现一个使用mmap
映射一些任意大文件以进行读写的C ++应用程序,该文件可以从几MB扩展到几GB。因此,分析程序的内存使用情况(峰值RSS,我想查看它消耗了多少物理内存)很重要,以便查看其性能。
我将Valgrind的块工具用于选项pages-as-heap=yes
和massif 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
则由于页面是没有修改?