比方说,linux中运行着3-4个高度内存密集型的应用程序,例如,任何视频处理应用程序。这些应用程序使用不同数量的RAM,它们的内存访问模式也不同。另外,让我们说,这些应用程序运行在不同的核心。
假设所有这些程序运行5秒。
我想找的是-
在这方面我需要一些帮助-坎特其实知道怎么继续。使用perf工具进行缓存丢失计算会有帮助吗?我是linux的新手,请给我一点解释。提前谢谢你。
发布于 2015-02-13 10:42:37
您可以使用分析器、堆分析工具来获取每个方法的cpu和内存利用率。
分析器是将一些记录器/调试语句/自定义代码添加到应用程序代码中的工具,并将告诉您每个方法在应用程序中查询所花费的时间。这解决了您的第一个问题,即您希望使用哪种方法占用大部分cpu。运行时间最长的进程最有可能使用大多数cpu。分析器将向您展示这些过程。在此之后,您可以通过将调试语句和记录器向下钻取来分析方法。
程序使用内存来保存对象、变量。只需查看内存快照,就可以了解哪种方法/对象占用了较高的内存。您可以获得堆转储或内存快照(我不确定c、c++代码,但可能有可用的工具和命令)。获得这些快照后,分析它们是否占用了最大内存块的对象/方法。
在找到这些罪魁祸首后,尝试使用更好的hw、sw、库、perf调谐器等对其进行改进。
我希望你现在明白了:)
发布于 2015-02-13 06:17:52
您可以使用ps
(可能与watch
一起使用)、top
或htop
来查看进程的内存消耗。例如,如果您有三个pid 1234、2345和3456的进程 (您可以使用ps|grep programname
、pidof
或pgrep
等方法找到这些pids )。你可能会跑
watch ps -F 1234 2345 3456
在特定时刻使用最大内存的应用程序中有哪些功能? 如果多个函数需要大量内存
我猜您在代码中提到的是C(或C++)函数。那么上面的两个问题都没有任何意义:内存消耗是程序的一个全局属性。当(经常发生这种情况)一个内存区域被分配到一个函数(调用malloc
)中,填充另一个函数,然后在另一个函数中释放(调用free
)时,它没有意义地说哪个函数拥有该数据或正在使用该内存。
您可以使用缬磨 (至少检查没有泄漏内存)。
还请注意,如果程序正确地调用了malloc
,那么释放的内存并不总是返回给操作系统:大多数malloc
实现都会尝试“保持”free
-d内存,以便在以后调用malloc
时立即重用。
阅读垃圾收集、内存泄漏和内存管理上的wikipage,特别是在C动态内存分配上。RTFM malloc(3) & mmap(2) (因为mmap
被malloc
使用)和proc(5) (因为/proc/
可以用来查询内存映射和状态,使用cat /proc/$(pidof yourprogram)/maps
等.)和极限(2) (它允许您限制bash
的ulimit
内置内存)& ps(1)和C34&
pgrep(1)
和C 36。还读
高级Linux编程
https://stackoverflow.com/questions/28493613
复制相似问题