问题标签 [massif]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
295 浏览

rust - 为什么通过地块执行时在 Rust 中连接到 MySQL 会崩溃?

考虑这个使用mysql crate 版本 12.3.1 的小程序:

货物.toml:

我有一个 MySQL 服务器在运行localhost:3306并通过它执行cargo run它不会产生任何错误。但是,如果我使用massif运行它,我可以重现以下崩溃:

这可能是什么原因,有没有可能避免这种情况?

我有一个更大的应用程序,我想分析它的内存使用情况,但这会妨碍我。

0 投票
1 回答
729 浏览

valgrind - valgrind 生成非常大的 xtree

valgrind 3.13 支持 xtree http://valgrind.org/docs/manual/dist.news.html

我用它和地块

然后它生成了一个16G的文件。Massif Visualizer 无法加载它。使用 xtree-memory 的最佳实践是什么

0 投票
1 回答
930 浏览

ubuntu - valgrind massif heap profiler 没有详细的快照视图 - 你如何放大/缩小?

所以我试图在 Ubuntu 18 中查看我的 c++ 程序的堆内存使用情况

我使用以下方法运行它:

valgrind --tool=massif --smc-check=all ./myprogram

我得到了相当大的输出,这没关系。我使用 massif-visualizer 查看它。

我得到一个漂亮的图表和所有这些。但我想在我的程序结束时详细查看它的关闭情况。但我似乎无法放大图表视图,而且我看不到这样做的选项。

手册页(这里)是这样说的:

Massif 会生成一些详细的快照,这些快照基本上构成了树。如果您想以比简单树视图更舒适的方式获得概览,请切换到详细快照选项卡并查看可视化为调用图的树。放大、缩小、使用鸟瞰图并查看对给定快照有何贡献。请注意,具有相同内存成本的函数调用被分组以轻松找到有趣的部分。

但我看不到“ switch over to the detailed snapshot tab”的选项......还有其他人知道该怎么做吗?

Ubuntu 18

地块可视化器 0.7

0 投票
2 回答
2523 浏览

valgrind - 如何正确使用 valgrind 的 massif-out-file 选项?

valgrind --tool=massif benchmark1 --massif-out-file=test.out在版本为 的 MacOS (10.12.6) 上运行时valgrind-3.13.0,会生成输出,但仅以默认文件名格式,即massif.out.\d+. 不test.out生成文件。示例输出是:

我缺少什么,或者 MacOS 版本忽略了此功能?我还尝试将文件名放在引号中,但没有成功。

0 投票
4 回答
3984 浏览

c++ - 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了使用和不使用 --pages-as-heap 的主要区别

我已经阅读了有关此参数的文档,但差异确实很大!启用时,一个简单程序(见下文)的内存使用量约为7 GB,禁用时,报告的使用量约为160 KB

top还显示大约 7 GB,这有点证实了结果pages-as-heap=yes

(我有一个理论,但我不相信它会解释如此巨大的差异,所以 - 寻求帮助)。

尤其困扰我的是,报告的大部分内存使用量都被 使用std::string,而what?从未打印(这意味着 - 实际容量非常小)。

我确实需要pages-as-heap=yes在分析我的应用程序时使用,我只是想知道如何避免“误报”


代码片段:

编译:g++ --std=c++11 -fno-inline -g3 -pthread

pages-as-heap=yes

同时pages-as-heap=no


请忽略线程的糟糕处理,这只是一个非常简短的示例。


更新

看来,这根本不相关std::string。正如@Lawrence 所建议的,这可以通过简单地在堆上分配一个int(带有new)来重现。我相信@Lawrence 非常接近这里的真实答案,引用了他的评论(对于更多读者来说更容易):

劳伦斯:

@KirilKirov 字符串分配实际上并没有占用那么多空间......每个线程都获得它的初始堆栈,然后堆访问映射了一些被不准确反映的大量空间(大约 70m)。您可以通过仅声明 1 个字符串然后进行自旋循环来测量它......显示了相同的虚拟内存使用情况 – Lawrence Sep 28 at 14:51

我:

@Lawrence - 你说得对!好的,所以,你是说(看起来是这样的),在每个线程上,在第一个堆分配上,内存管理器(或操作系统,或其他)为线程的堆分配大量内存需要?并且这个块稍后会被重用(或缩小,如果需要)?– 基里尔基洛夫 9 月 28 日 15:45

劳伦斯:

@KirilKirov 类似的东西......确切的分配可能取决于 malloc 的实现等等——劳伦斯 2 天前

0 投票
0 回答
195 浏览

c++ - 我如何找到为什么虚拟内存足迹随着这个守护进程不断增长?

我创建了一个守护进程,用作 Cassandra 数据库的代理。我称之为它snapdbproxy是因为它代理了来自其他服务器和工具的 CQL 命令。

每当我访问该工具时,它都会创建一个新线程,管理各种 CQL 命令,然后一旦连接丢失,我就会干净地退出线程。

看看内存占用,它增长得非常快(最活跃的系统很快达到 Gb 的虚拟内存,这利用了一些不断增长的交换内存。)在启动时,它大约是 300Mb。

在此处输入图像描述

该软件是用 C++ 编写的,带有析构函数、RAII、智能指针等......但我仍然验证了:

  1. 使用-fsanitizer=address(我在 Linux 下使用 g++)并且我没有泄漏(好吧,很少... 300 字节以下,因为我找不到如何摆脱 OpenSSL 创建的一些 Cryto 缓冲区)

  2. 使用 valgrind massif,它说我在初始化时使用 4.7mB,然后在 4mB 下进行(我运行相同的代码超过 1 小时,结果相同!)

有一些输出ms_print(我删除了堆栈,因为它全为零)。

正如我们所看到的,经过一小时和来自各种其他守护进程的多次访问(至少 100 次访问)后,valgrind 告诉我我只使用了大约 4mB 的内存。我尝试了两次,认为第一次尝试可能失败了。结果相同。

所以......我或多或少没有想法。为什么我的进程在虚拟内存方面会继续增长,即使在每个线程退出时都正确释放了一切——如地块输出所示——以及整个过程——如-fsanitizer=address(好吧,我没有显示这里是消毒剂的输出,但相信我,它不到 300 字节。不是 Gb 的泄漏。)


watch当我查看内存(虚拟内存)状态时,会在一段时间后输出命令:

每次其他守护程序运行时VmPeakVmSize、 和VmDataall 都会增加(大约每 5 分钟一次)。

但是,内存(malloc/free)没有改变。我现在正在登录sbrk(0)(根据 1201ProgramAlarm 评论的一个想法——我对他评论第一部分的解释),该地址保持不变:


正如博士所建议的那样,我查看/proc/<pid>/maps了一段时间内的内容。这是一两个增量。不幸的是,我没有被告知是什么创建了这些缓冲区。我唯一能想到的是我的线程......(即堆栈和线程状态的一点空间)

哦……是的!我从分离线程到加入的最新变化......实际上根本没有加入线程。现在使用正确的连接进行测试......它工作正常!我的!坏一个!

0 投票
2 回答
964 浏览

c++ - 如何在程序执行时查看 Valgrind Massif 输出(或其他堆分析器)?

在 LINUX 中使用 Valgrind Massif 时,我尝试实时查看 massif.out.pid 文件,但在 Massif 执行完成后会生成此文件。我想在代码中放置断点来观察某些指令对堆的影响,因为只有几个兴趣点。我知道我可以重写一些代码来管理它,但这意味着以一种不会成为最终结果的方式影响主题代码,因为它们是我想要执行此操作的众多程序。有没有办法在观察分析器分析堆的同时观察代码中的点,所以我可以区分执行点?

0 投票
1 回答
660 浏览

memory - valgrind massif dlclose() 没有符号

massif 不显示库中函数的任何函数名称,并且该库由 dlclose() 关闭。

如果我删除 dlclose(),然后运行重新编译和执行程序,我可以看到这些符号。有没有办法在不更改源代码的情况下知道函数名称?

0 投票
1 回答
292 浏览

c++ - massif 可视化工具和 ms_print 之间的大小差异

我一直在尝试使用 valgrind 内存使用工具 massif。但是当我尝试使用程序 ms_print 和 massiff 可视化应用程序可视化 valgrind --massif output .out 的输出时遇到了问题。

ms_print 和 massiff 可视化应用程序 ( http://milianw.de/tag/massif-visualizer )之间存在 2KiB 的差异。

有什么我想念的吗?我添加了两者的屏幕截图。

谢谢

在此处输入图像描述 在此处输入图像描述

0 投票
0 回答
537 浏览

c++ - 分析内存以获得具有地块和时间的最大 RSS 时的不同结果

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

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

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

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

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

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

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

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