程序在linux中使用最大内存

时间:2015-02-13 06:14:48

标签: linux performance kernel perf memory-access

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

让我们说所有这些程序运行5秒钟。

我想找到的东西 -

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

  2. 如果多个功能在同一时刻需要大量内存(超过阈值限制),那么它们的名称是什么以及它们需要多长的内存。

  3. 我需要一些帮助 - 实际上不能理解如何继续。使用perf工具帮助缓存未命中计算?我是linux新手,请写一点解释。提前谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

程序正在使用内存来保存对象和变量。通过仅查看内存快照,您可以找出哪个方法/对象占用大量内存。您可以获得 heapdump或内存快照(我不确定c,c ++代码,但可能有工具,命令可用)。一旦获得这些快照,就可以分析占用最大内存块的对象/方法。

找到这些罪魁祸首后,尝试使用更好的hw,sw,库,性能等来改善它们。

我希望你现在明白了:)

答案 1 :(得分:1)

您可以使用ps(可能使用watch)或tophtop来查看进程的内存消耗情况。例如,如果您有三个processes的pid 1234,2345和3456(您可以使用ps|grep programnamepidofpgrep等找到这些pid ...)可能会运行

watch ps -F 1234 2345 3456
  

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

     

如果多个功能需要大量内存

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

您可以使用valgrind(至少检查一下您是否泄漏内存)。

另请注意,如果您的程序正确调用malloc然后调用free,则释放的内存并不总是返回给操作系统:大多数malloc实现会尝试"保持& #34; free - 可以在将来调用malloc时立即重复使用内存

阅读garbage collectionmemory leakmemory management上的wikipages,特别是C dynamic memory allocation上的wikipages。 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)。另请阅读Advanced Linux Programming