Linux 应用程序分析
如何记录 Linux 机器上应用程序的性能?我不会有 IDE。
理想情况下,我需要一个应用程序,该应用程序将附加到进程并记录以下定期快照:
- 内存使用情况
- 线程数量
- CPU 使用情况
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何记录 Linux 机器上应用程序的性能?我不会有 IDE。
理想情况下,我需要一个应用程序,该应用程序将附加到进程并记录以下定期快照:
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(6)
那么,为了收集有关进程的此类信息,您实际上不需要 Linux 上的分析器。
您可以在批处理模式下使用
top
。它以批处理模式运行,直到被终止或完成 N 次迭代:或
你会得到这个:
您可以使用
ps
(例如在 shell 脚本中)<小时>
<块引用>
我需要一些方法来记录 Linux 计算机上应用程序的性能
如果您的 Linux 内核高于 2.6.32 或 perf 来执行此操作="noreferrer">OProfile(如果较旧)。这两个程序都不需要您来检测您的程序(例如 Gprof 需要)。但是,为了在
perf
中正确获取调用图,您需要使用 -fno-omit-frame-pointer 构建程序。例如:g++ -fno-omit-frame-pointer -O2 main.cpp
。对于Linux
perf
:记录性能数据:
或录制 10 秒:
或者用调用图()来记录
分析记录的数据
在 RHEL 6.3 上,允许读取 /boot/System.map-2.6.32 -279.el6.x86_64,所以我在做性能报告时通常会加上 --kallsyms=/boot/System.map-2.6.32-279.el6.x86_64:
<小时>
在这里我写了一些关于使用 Linux `perf` 的更多信息:
首先 - 这是有关使用 perf 进行 Linux 分析的教程
如果您的 Linux 内核高于 2.6.32,则可以使用 perf;如果较旧,则可以使用 OProfile。这两个程序都不需要您来检测您的程序(就像 Gprof 所要求的那样)。但是,为了在 perf 中正确获取调用图,您需要使用
-fno-omit-frame-pointer
构建程序。例如:g++ -fno-omit-frame-pointer -O2 main.cpp
。您可以使用perf top查看应用程序的“实时”分析:
:
或者,您可以记录正在运行的应用程序的性能数据,然后对其进行分析:
要记录性能数据:
或录制 10 秒:
或者用调用图()来记录
分析记录的数据
或者,您可以记录应用程序的性能数据,然后通过以这种方式启动应用程序并等待其退出来分析它们:
这是分析测试程序的示例。
测试程序位于文件 main.cpp 中(main.cpp 位于答案的底部):
我以这种方式编译它:
我使用 libmalloc_minimial.so 因为它是用 -fno-omit-frame-pointer 编译的,而 libc malloc 似乎是在没有此选项的情况下编译的。然后我运行我的测试程序:
然后我记录正在运行的进程的性能数据:
然后我分析每个模块的负载:
然后分析每个函数的负载:
然后分析调用链:
所以此时您知道您的程序在哪里花费了时间。
这是用于测试的 main.cpp 文件:
Well, in order to collect this type of information about your process, you don't actually need a profiler on Linux.
You can use
top
in batch mode. It runs in the batch mode either until it is killed or until N iterations is done:or
and you will get this:
You can use
ps
(for instance in a shell script)In order to do this you need to use
perf
if your Linux kernel is greater than 2.6.32 or OProfile if it is older. Both programs don't require from you to instrument your program (like Gprof requires). However, in order to get the call graph correctly inperf
you need to build you program with -fno-omit-frame-pointer. For example:g++ -fno-omit-frame-pointer -O2 main.cpp
.As for Linux
perf
:To record performance data:
or to record for 10 seconds:
or to record with a call graph ()
To analyze the recorded data
On RHEL 6.3 it is allowed to read /boot/System.map-2.6.32-279.el6.x86_64, so I usually add --kallsyms=/boot/System.map-2.6.32-279.el6.x86_64 when doing a performance report:
Here I wrote some more information on using Linux `perf`:
First of all - this is tutorial about Linux profiling with perf
You can use perf if your Linux Kernel is greater than 2.6.32 or OProfile if it is older. Both programs don't require from you to instrument your program (like Gprof requires). However, in order to get call graph correctly in perf you need to build you program with
-fno-omit-frame-pointer
. For example:g++ -fno-omit-frame-pointer -O2 main.cpp
.You can see a "live" analysis of your application with perf top:
Or you can record performance data of a running application and analyze them after that:
To record performance data:
or to record for 10 seconds:
or to record with a call graph ()
To analyze the recorded data
Or you can record performance data of an application and analyze them after that just by launching the application in this way and waiting for it to exit:
This is an example of profiling a test program.
The test program is in file main.cpp (main.cpp is at the bottom of the answer):
I compile it in this way:
I use libmalloc_minimial.so since it is compiled with -fno-omit-frame-pointer while libc malloc seems to be compiled without this option. Then I run my test program:
Then I record performance data of a running process:
Then I analyze the load per module:
Then load per function is analyzed:
Then call chains are analyzed:
So at this point you know where your program spends time.
And this is the main.cpp file for the test:
引用 Linus Torvalds 本人:
后来...
请参阅回复:[PATCH] grep:不要执行外部 grep跳过工作树条目 (2010-01-04)
Quoting Linus Torvalds himself:
And later ...
See Re: [PATCH] grep: do not do external grep on skip-worktree entries (2010-01-04)
如果您正在寻找可能加快程序速度的方法,您需要 堆栈截图。一个简单的方法是使用pstack实用程序,或者lsstack(如果可以的话)。
您可以比 Gprof 做得更好。如果您想使用官方分析工具,您需要能够对挂钟时间的调用堆栈进行采样并显示行级成本的工具,例如 OProfile 或 RotateRight Zoom。
If you are looking for things to do to possibly speed up the program, you need stackshots. A simple way to do this is to use the pstack utility, or lsstack if you can get it.
You can do better than Gprof. If you want to use an official profiling tool, you want something that samples the call stack on wall-clock time and presents line-level cost, such as OProfile or RotateRight Zoom.
您可以使用 Valgrind。它将数据记录在一个文件中,您可以稍后使用适当的 GUI 进行分析,例如 KCacheGrind 。
一个用法示例是:
它将生成一个名为
callgrind.out.xxx
的文件,其中 xxx 是 PID。与 Gprof 不同,Valgrind 适用于许多不同的语言,包括 Java、有一些限制。
You can use Valgrind. It records data in a file which you can analyse later using a proper GUI, like KCacheGrind.
A usage example would be:
It'll generate a file called
callgrind.out.xxx
where xxx is the PID of the program.Unlike Gprof, Valgrind works with many different languages, including Java, with some limitations.
查看Gprof。您需要使用 -pg 选项来编译代码,该选项会检测代码。之后,您可以运行该程序并使用Gprof查看结果。
Look into Gprof. You need to compile the code with the -pg option, which instruments the code. After that, you can run the program and use Gprof to see the results.
您还可以尝试 cpuprofiler.com。它获取您通常从 top 获取的信息 > 命令,甚至可以通过网络浏览器远程查看 CPU 使用率数据。
You can also try out cpuprofiler.com. It gets the information you would normally get from the top command, and the CPU usage data can be even viewed remotely from a web browser.