0

假设有 3-4 个高度内存密集型应用程序在 linux 中运行 - 例如,任何视频处理应用程序。这些应用程序使用不同数量的 RAM,它们的内存访问模式也不同。此外,假设这些应用程序在不同的内核中运行。

假设所有这些程序运行 5 秒。

我试图找到的 -

  1. 这些应用程序中的哪些功能在特定时刻使用最大内存?我需要占用最大内存资源的前 2-3 个函数的名称。

  2. 如果多个函数在同一时刻需要大量内存(高于阈值限制),它们的名称是什么以及它们需要多长时间的内存。

我需要一些帮助——实际上无法理解如何进行。使用 perf 工具进行缓存未命中计算会有帮助吗?我是linux新手,请写一点解释。先感谢您。

4

2 回答 2

2

您可以使用分析器、堆分析工具来获取每种方法的 cpu 和 memory util。

探查器是一种工具,可以将一些记录器/调试语句/自定义代码添加到您的应用程序代码中,并会告诉您每个方法所花费的时间,在您的应用程序中进行查询。这解决了您的第一个问题,即您希望使用哪种方法占用最多的 cpu。运行时间最长的进程最有可能使用最多的 cpu。Profiler 将向您展示这些过程。之后,您可以通过将调试语句和记录器向下钻取来自行分析方法。

程序使用内存来保存对象、变量。您可以通过仅查看内存快照来找出哪个方法/对象占用了高内存。您可以获得堆转储或内存快照(我不确定 c、c++ 代码,但可能有可用的工具、命令)。获得这些快照后,分析它们以查找占用最大内存块的对象/方法。

在找到这些罪魁祸首之后,尝试使用更好的硬件、软件、库、性能调整等来改进它们。

我希望你现在清楚:)

于 2015-02-13T10:42:37.607 回答
1

您可以使用ps(也许与watch)或tophtop来查看进程的内存消耗。例如,如果您有pid 1234、2345 和 3456三个进程ps|grep programname(您可以使用orpidofpgrep等找到这些 pid...),您可以运行

watch ps -F 1234 2345 3456

这些应用程序中的哪些功能在特定时刻使用最大内存?

如果多个函数需要大量内存

我猜您是在说代码中的 C(或 C++)函数。那么上面的两个问题都没有任何意义:内存消耗是程序的全局属性。当(并且这种情况经常发生)在一个函数中分配内存区域(调用malloc),填充另一个函数,并在另一个函数中释放(调用free)时,说哪个函数拥有该数据或消耗该内存是没有意义的.

您可能会使用valgrind(至少要检查您是否没有泄漏内存)。

另请注意,如果您的程序正确调用,mallocfree释放的内存并不总是返回给操作系统:大多数malloc实现会尝试“保留” free-d 内存以便在将来调用时立即重用malloc

阅读有关垃圾收集内存泄漏内存管理的维基页面,尤其是C 动态内存分配。RTFM malloc(3) & mmap(2) (因为mmap被 使用malloc) & proc(5) (因为/proc/可以用来查询内存映射和状态,使用cat /proc/$(pidof yourprogram)/maps等等...) & setrlimit(2) (它可以让你限制,例如使用ulimit内置bash的可用内存) & ps(1) & watch(1) & pgrep(1) & pidof(1)。另请阅读高级 Linux 编程

于 2015-02-13T06:17:52.873 回答