【问题标题】:What is the most efficient way to monitor the number of context switches in linux kernel?监视linux内核中上下文切换次数的最有效方法是什么?
【发布时间】:2013-01-10 10:26:08
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 如果您在更高的层次上解释您想要做什么,我们可能会为您提供更多帮助...
  • 我想设置一个定期函数将与定时器一起调度,其中两个顺序执行之间的增量是机器 IPS 的函数(数学),发生中断和软中断和上下文切换的次数谢谢@thkala
  • 您希望达到什么样的区间精度?因为在调度操作时,即使是高精度的计时器也没有预期的那么精确......
  • 我希望准确度至少是 CPU 执行 10k 汇编指令(在 ARM 上)@thkala 所花费的时间
  • @0x90:对于您的硬件来说,实时单位需要多长时间?一些 ARM 处理器(例如 ARM-Cortex A9)每个周期可以执行两条指令,对于 1GHz 处理器,这归结为 5us。我怀疑你能否获得具有这种准确性的调度计时器,除非你愿意使用某种忙等待循环。

标签: c linux-kernel profiling arm embedded-linux


【解决方案1】:

使用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

【讨论】:

  • 我想在内核源代码中做。但谢谢它也很有帮助:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    您可以使用$ vmstat 1 监控您想要的信息,您可以查看 vmstat 的来源,以了解他们是如何从/prochttp://procps.sourceforge.net. 读取信息的

    【讨论】:

      【解决方案4】:

      也许您应该考虑编写一个 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 之类的功能,当然,您可以直接访问(无需上下文切换)任何系统调用(读、写...)

      【讨论】:

      • 呃,现代 Linux 内核通常并不完全拥有定时器中断——至少不是传统意义上的中断。即使他们这样做了,它的周期至少为 1 毫秒 - 比 OP 所需的精度长约 3 个数量级。
      • 你是对的。但是,依附于它并不是正确的方法。我已经相应地编辑了帖子。
      • 我不是拒绝投票的人,但老实说,我不相信这篇文章回答了这个问题。您实际上是在告诉 OP 从头开始​​创建自己的基于内核的分析器,并且您没有提供有关分析本身的任何详细信息...
      • 嗯。非常正确。我为课堂制作了一个小模块,并没有造成太大的伤害。我应该删除这个答案吗?
      猜你喜欢
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多