更精确地记录 Linux/Bash 中进程的用户/系统/实时

更精确地记录 Linux/Bash 中进程的用户/系统/实时

我正在寻找类似的东西/usr/bin/time,然而,这通常没有足够的精度。

我正在运行一个 C 程序(我可以编辑和重新编译),我需要监控用户/系统/实时、处理器使用情况、峰值内存等。

但是,正常运行时间超出了time命令的精度。time为您提供毫秒精度,但是,最好使用纳秒精度。十分之一毫秒可能有效,但我离题了。

我现在有一个简单的 bash 脚本,它以纳秒为单位记录开始时间,运行程序,然后以纳秒为单位记录结束时间,然后报告差异。这对于真实(挂钟)时间来说很棒,但对于执行时间来说不太好,因为这是一台多用户机器。

注意:我只能使用 Bash 作为 shell;机器运行的是 CentOS 6.4;我愿意接受不需要安装任何新软件的 C 语言解决方案。

答案1

您可以使用systemtap. 从其中一个例子在他们的网站上:

general/stopwatches.stp - 查看进程在不同状态下所花费的挂钟时间关键字:TIME

stopwatch.stp 脚本演示了如何使用多个秒表记录进程在内核和用户空间中花费的挂钟时间。退出时,脚本会打印出秒、毫秒、微秒和纳秒。请注意,此脚本的输出不能直接与 time 命令进行比较,因为 time 记录了进程在内核和用户空间中实际活动的时间。

# stap stopwatches.stp -c "sleep 1"

为了完整性,此处重现了该示例的代码:

#! /usr/bin/env stap
# Copyright (C) 2012 Red Hat, Inc.
# by William Cohen <[email protected]>
#
# exercise the stopwatch tapset

probe begin
{
  start_stopwatch("wall");
  /* The next two lines assumes that target is running and in user-space. */
  start_stopwatch("user");
  stop_stopwatch("system")
}

probe syscall.*
{
   if (pid() != target()) next
   stop_stopwatch("user")
   start_stopwatch("system")
}

probe syscall.*.return
{
   if (pid() != target()) next
   start_stopwatch("user")
   stop_stopwatch("system")
}

probe end
{
  stop_stopwatch("wall")
  stop_stopwatch("user")
  stop_stopwatch("system")

  w = read_stopwatch_us("wall")
  u = read_stopwatch_us("user")
  s = read_stopwatch_us("system")
  printf ("wall clock                 %12dus\n", w);
  printf ("wall clock in user-space   %12dus\n", u);
  printf ("wall clock in kernel-space %12dus\n", s);

   delete_stopwatch("wall")
   delete_stopwatch("user")
   delete_stopwatch("system")
 }

相关内容