在我的程序中,实时持续时间有时高达CPU时间的3倍。这是一个单线程应用程序,执行大量内存分配和 NFS 基础读/写操作。所以我怀疑是 mem-swap 或 NFS 读写导致速度变慢。例如,以下是以下输出/usr/bin/time a.out
2165.32user 64.93system 6036.33elapsed
有没有实时分析工具?我知道并使用过多种工具进行 cpu 时间分析,但不确定是否有任何东西可以帮助并指出 NFS / mem-swap 或任何其他挂钟速度减慢。
我的程序是用C++编写的
编辑:/usr/bin/time
最后给了我一个总结 - 我不是在寻找那个。我正在寻找一种方法来关联应用程序特定程序块期间的实时消耗。像collect/gprof这样的分析器可以告诉我类似的事情
- 由于等待而发生大多数上下文切换的区域。
- 发生 NFS 访问的特定功能。
由于我的系统是专用的,因此我不担心其他进程可能会影响这些配置文件。
答案1
不太确定..但看起来你可能需要 strace ...
例子:
在这里,假设我有一个进程 ID 为 1055 的进程,那么执行如下操作:
neo $ sudo strace -w -c -p1055
strace: Process 1055 attached
^Cstrace: Process 1055 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
77.38 5.738820 534 10730 read
5.35 0.396752 114 3480 clone
4.17 0.309514 10 30741 rt_sigprocmask
2.31 0.171203 13 12761 close
1.56 0.115981 16 6960 3480 wait4
1.47 0.108800 10 10441 rt_sigaction
1.43 0.106307 8 11890 fcntl
0.98 0.072344 19 3770 openat
0.86 0.063769 18 3480 write
0.85 0.062820 18 3480 pipe
0.84 0.062443 15 4060 dup2
0.67 0.049338 9 5220 lseek
0.57 0.042007 11 3770 3770 ioctl
0.49 0.036669 10 3480 rt_sigreturn
0.47 0.035150 10 3480 fchmod
0.29 0.021420 12 1740 unlink
0.25 0.018666 10 1740 getpid
0.06 0.004745 16 290 stat
请在此处阅读更多内容:
man strace
以及这里:
答案2
我怀疑你会发现perf timechart
很有用。默认情况下,它记录 CPU 和进程状态,并绘制图表显示该状态如何随时间变化:
这显示了顶部的 CPU 占用情况,以及下面的进程 - 蓝色表示“正在运行”,黄色表示该进程正在等待 CPU,红色表示该进程在 I/O 上被阻塞,灰色表示该进程正在睡眠。perf timechart
输出 SVG,可以缩放到您想要的任何细节级别。
它还可以跟踪 I/O(磁盘和网络)和分支。
perf
还有其他模块可以帮助检查细节;perf record
可以使用您感兴趣的任何事件(如果您的系统支持它们)来记录时间戳并显示基于时间的信息。
答案3
我不完全确定这是否是您所要求的,但这类似于/usr/bin/time
并且仅测量挂钟:
#!/bin/bash
start=$(date +%s%N)
"$@"
end=$(date +%s%N)
echo "$(($end - $start)) nanoseconds elapsed"
将其保存到wallclock
并运行它,例如
$ ./wallclock sleep 1
1006622540 nanoseconds elapsed
答案4
我也一直在寻找挂钟分析器。我发现最符合期望的工具是https://softwarerecs.stackexchange.com/a/55146/78636。它的原理非常简单:从GDB启动进程,然后以固定的时间间隔中断GDB以记录回溯。