如何分析挂钟时间?

如何分析挂钟时间?

在我的程序中,实时持续时间有时高达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

以及这里:

https://strace.io/

答案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以记录回溯。

相关内容