让我们说,在Linux中运行3-4个高度内存密集型应用程序 - 例如,任何视频处理应用程序。这些应用程序使用不同数量的RAM,它们的内存访问模式也不同。另外,假设这些应用程序在不同的核心中运行。
让我们说所有这些程序运行5秒钟。
我想找到的东西 -
在特定时刻使用最大内存的这些应用程序中的哪些功能?我需要前2-3个函数的名称,它们占用了最大的内存资源。
如果多个功能在同一时刻需要大量内存(超过阈值限制),那么它们的名称是什么以及它们需要多长的内存。
我需要一些帮助 - 实际上不能理解如何继续。使用perf工具帮助缓存未命中计算?我是linux新手,请写一点解释。提前谢谢。
答案 0 :(得分:2)
您可以使用分析器,堆分析工具来获取每种方法的cpu和memory util。
Profilers 是一些工具,它们会将一些记录器/调试语句/自定义代码添加到您的应用程序代码中,并告诉您应用程序中每个方法,查询所花费的时间。这解决了你的第一个问题,即你想要通过哪种方法获取大部分cpu。运行时间最长的进程最有可能利用大多数cpu。 Profiler将向您展示这些流程。之后,您可以通过调试调试语句和记录器来自行分析方法。
程序正在使用内存来保存对象和变量。通过仅查看内存快照,您可以找出哪个方法/对象占用大量内存。您可以获得 heapdump或内存快照(我不确定c,c ++代码,但可能有工具,命令可用)。一旦获得这些快照,就可以分析占用最大内存块的对象/方法。
找到这些罪魁祸首后,尝试使用更好的hw,sw,库,性能等来改善它们。
我希望你现在明白了:)
答案 1 :(得分:1)
您可以使用ps
(可能使用watch
)或top
或htop
来查看进程的内存消耗情况。例如,如果您有三个processes的pid 1234,2345和3456(您可以使用ps|grep programname
或pidof
或pgrep
等找到这些pid ...)可能会运行
watch ps -F 1234 2345 3456
在这些应用程序中哪些功能在特定时刻使用最大内存?
如果多个功能需要大量内存
我猜你在谈论代码中的C(或C ++)函数。然后,上述两个问题都没有任何意义:内存消耗是程序的全局属性。当(并经常发生这种情况)时,一个函数(调用malloc
)分配一个内存区域,填充另一个函数,然后在另一个函数中释放(调用free
)它没有意义哪个函数拥有该数据或消耗该内存。
您可以使用valgrind(至少检查一下您是否泄漏内存)。
另请注意,如果您的程序正确调用malloc
然后调用free
,则释放的内存并不总是返回给操作系统:大多数malloc
实现会尝试"保持& #34; free
- 可以在将来调用malloc
时立即重复使用内存
阅读garbage collection,memory leak和memory 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