7

我想获得以下总统计数据:

  1. 发生了多少softirq
  2. 发生了多少interrupts
  3. 发生了多少context switches

我知道你可以使用pidstat,cat /proc/interrupts/cat/proc/softirqs. 但是使用它们的开销太大。

  • 如何在{1-3}不使用的情况下/proc以最快的方式获得底线值?

  • 我可以使用ftrace来帮助我跟踪事件吗?

我将使用高分辨率计时器来监控系统:

4

4 回答 4

6

使用perf,例如:

# perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes (512 MB) copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec (scaled from 66.58%)
          235,384 cache-references         #      0.246 M/sec (scaled from 66.56%)
        9,281,660 branch-misses            #      3.858 %     (scaled from 33.50%)
      240,609,766 branches                 #    251.559 M/sec (scaled from 33.66%)
    1,403,561,257 instructions             #      0.679 IPC   (scaled from 50.23%)
    2,066,201,729 cycles                   #   2160.227 M/sec (scaled from 66.67%)
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed
于 2013-01-27T12:48:51.323 回答
5

检查 Linux 的perf 子系统,这是您从 Linux 系统获得软或硬性能计数器所需的方式。

于 2013-01-26T21:18:51.157 回答
2

您可以通过某种程度的分辨率获取所有这些信息/proc,如果您需要更多 rez,您可以调整嵌入式系统的内核。

可以监视您想要的信息$ vmstat 1,您可以检查 vmstat 的源代码,以了解他们是如何从以下位置读取信息/prochttp://procps.sourceforge.net.

于 2013-01-27T00:28:03.123 回答
1

也许您应该考虑编写一个 Linux 内核模块 (LKM)。

这里有一个教程:http ://www.tldp.org/LDP/lkmpg/2.6/html/

如果您需要一个准确的分析系统,您可以将您的内核模块附加到某个中断或任何其他有效的入口点*,并保存(没有太多指令!)您需要考虑的内容。然后,在中断之后,定期收集和分析该数据。

您可以通过文件系统中的特殊文件(通过 mknode 在用户空间中创建或使用 MKDEV/register_chrdev 在初始化中创建)以与其他模块相同的方式导出信息。

上面的链接中有一些信息。

*例如,您可以将您的模块附加到 read 系统调用(用您的包装实际读取),或导出文件并捕获打开/关闭尝试。

后者的使用示例如下:

void f() {
  int fd_prof;
  fd_prof = open("/dev/profiler", O_RDONLY);
  /* Do whichever thing you want to profile */
  close(fd_prof);
  /* Read profiled data from /dev/profiled_data or wherever you want
   * to export it to */

请注意,在编译 LKM 时,您无法访问标准 C 库,因为内核空间中不存在 libc。

不用担心,您仍然可以在内核空间中实现 sprintf 之类的功能,当然,您可以直接访问(无需上下文切换)任何系统调用(读、写...)

于 2013-01-26T21:09:46.187 回答