【问题标题】:What does "1.234 CPUs used" mean in perf output?perf 输出中的“1.234 CPUs used”是什么意思?
【发布时间】:2020-04-26 14:56:02
【问题描述】:

当您使用命令运行 perf 实用程序时,您获得的输出行之一如下所示:

          2.088031      task-clock (msec)         #    0.700 CPUs utilized

如果您使用perf stat --all-cpus --no-aggr,您会在每个 CPU 内核中获得这些行之一,例如:

CPU0             38.518960      cpu-clock (msec)          #    0.528 CPUs utilized
CPU1             38.564135      cpu-clock (msec)          #    0.529 CPUs utilized
CPU2             38.611806      cpu-clock (msec)          #    0.529 CPUs utilized

我不明白这到底是什么意思——在这两种情况下;我只有一个猜测:

  1. 在聚合情况下,它是“在进程启动和进程退出的挂钟时间之间运行此进程的线程的平均 CPU 数”吗?
  2. 在分解的情况下 - 它是“进程的某些线程在列出的 CPU 内核上执行的时间的一部分”吗?

但这些猜测充满了假设。在这两种情况下,这些数字的确切含义是什么?此外,它们如何计算进程线程在内核调用中花费的时间?它们如何解释在同一内核上工作的同一进程的多个线程?非常感谢您提供详尽的解释。

【问题讨论】:

  • 这实际上与 编程 无关,也许是超级用户?
  • @jonrsharpe:性能测量是软件开发的重要组成部分,网站上有261个关于perf的问题。
  • @einpoklum 你用的是什么perf和Linux内核版本?
  • @ArnabjyotiKalita:为什么这很重要?语义是否在某个时候发生了变化?
  • @einpoklum 语义,在整体上下文和意义中,可能没有改变。它为我提供了一个参考,我可以从中向您解释这些值的来源,并为您提供有关添加/删除的任何新选项的信息。

标签: performance performance-testing perf


【解决方案1】:

我会一一解释你的猜测。

案例 2

使用perf stat -all-cpus --no-aggr

./perf stat -vvv -all-cpus --no-aggr ls                                                                                                                   [957/1827]
Using CPUID GenuineIntel-6-4F                                                                                                                                                                               
intel_pt default config: tsc,pt,branch                                                                                                                                                                      
------------------------------------------------------------                                                                                                                                                
perf_event_attr:                                                                                                                                                                                            
  type                             1                                                                                                                                                                        
  size                             112                                                                                                                                                                      
  sample_type                      IDENTIFIER                                                                                                                                                               
  read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING                                                                                                                                    
  disabled                         1                                                                                                                                                                        
  inherit                          1                                                                                                                                                                        
  exclude_guest                    1                                                                                                                                                                        
------------------------------------------------------------                                                                                                                                                
sys_perf_event_open: pid -1  cpu 0  group_fd -1  flags 0x8 = 3
sys_perf_event_open: pid -1  cpu 1  group_fd -1  flags 0x8 = 4
sys_perf_event_open: pid -1  cpu 2  group_fd -1  flags 0x8 = 5
sys_perf_event_open: pid -1  cpu 3  group_fd -1  flags 0x8 = 7
sys_perf_event_open: pid -1  cpu 4  group_fd -1  flags 0x8 = 8
sys_perf_event_open: pid -1  cpu 5  group_fd -1  flags 0x8 = 9
sys_perf_event_open: pid -1  cpu 6  group_fd -1  flags 0x8 = 10
sys_perf_event_open: pid -1  cpu 7  group_fd -1  flags 0x8 = 11

---------------------------------------------------------------

CPU0              7.628452      cpu-clock (msec)          #    0.509 CPUs utilized
CPU1              7.622132      cpu-clock (msec)          #    0.509 CPUs utilized
CPU2              7.648510      cpu-clock (msec)          #    0.511 CPUs utilized
CPU3              7.644246      cpu-clock (msec)          #    0.510 CPUs utilized
CPU4              7.670066      cpu-clock (msec)          #    0.512 CPUs utilized
CPU5              7.689670      cpu-clock (msec)          #    0.513 CPUs utilized
CPU6              7.687918      cpu-clock (msec)          #    0.513 CPUs utilized
CPU7              7.715103      cpu-clock (msec)          #    0.515 CPUs utilized

sys_perf_event_open 的调用反映了pid = -1,这意味着与命令ls 关联的pid 未被测量。这些是per-CPU 测量的特征,这意味着事件cpu-clock 针对特定的CPU 而不是特定的任务。将监视在该特定 CPU 上运行的所有线程。每个 CPU 都将独立开始测量。这些测量只会持续到命令ls 执行。

cpu-clock事件(以及task-clock)事件使用软件hrtimer进行采样。在测量开始时,函数cpu_clock_event_start here 设置具有如下采样周期的hrtimer-

} else {
        period = max_t(u64, 10000, hwc->sample_period);
    }
    hrtimer_start(&hwc->hrtimer, ns_to_ktime(period),
              HRTIMER_MODE_REL_PINNED_HARD);
}

hrtimer 过期后,perf_swevent_hrtimer 函数将定期读取并更新cpu-clock 计数器值。 cpu-clock 的值反映了最后一个采样值和当前采样值之间的运行差异(以 jiffies 为单位)。要获得 % CPU 利用率,请将cpu-clock 值除以命令运行所用的挂钟时间。

该命令运行所用的挂钟时间保持在here。特别是看t1t0的计算。

所以 2) 应该是 --> 在分解的情况下,“它是在命令执行期间运行在该 CPU 上的所有线程使用的 CPU 的一部分。”

案例 1

使用perf stat <command>

./perf stat -vvv ls                                                                                                                                          
Using CPUID GenuineIntel-6-4F                                                                                                                                                                               
intel_pt default config: tsc,pt,branch                                                                                                                                                                      
------------------------------------------------------------                                                                                                                                                
perf_event_attr:                                                                                                                                                                                            
  type                             1                                                                                                                                                                        
  size                             112                                                                                                                                                                      
  config                           0x1                                                                                                                                                                      
  sample_type                      IDENTIFIER                                                                                                                                                               
  read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING                                                                                                                                    
  disabled                         1                                                                                                                                                                        
  inherit                          1                                                                                                                                                                        
  enable_on_exec                   1                                                                                                                                                                        
  exclude_guest                    1                                                                                                                                                                        
------------------------------------------------------------                                                                                                                                                
sys_perf_event_open: pid 1833  cpu -1  group_fd -1  flags 0x8 = 3 

------------------------------------------------------------

2.120763      task-clock (msec)         #    0.038 CPUs utilized                                                                                                                                           

现在对sys_perf_event_open 的调用反映了pid=1833,它是与命令ls 关联的进程的pid。然而,CPU = -1 的值意味着每当这个进程被调度时,不管它被调度到哪个 CPU,计数task-clock 的软件 hrtimer 都会被更新。请注意,此计数现在将特定于进程以及仅与此进程关联的所有线程。

调度程序在perf_event_task_sched_inperf_event_task_sched_out 函数的帮助下维护有关进程何时被调度和调度的信息。函数update_context_time 维护任务执行的总时间。

static void update_context_time(struct perf_event_context *ctx)
{
    u64 now = perf_clock();

    ctx->time += now - ctx->timestamp;
    ctx->timestamp = now;
}

ctx->time 维护任务在任何特定 CPU 上执行的总时间。 ctx->timestamp 值维护软件 hrtimer 过期的时间戳,或与此进程关联的事件被调度,或事件被禁用。

该比率的计算现在是进程在任何 CPU 上执行的总时间除以进程执行的挂钟时间。挂钟时间计算与案例 2 相同。

【讨论】:

    【解决方案2】:

    “评论”行(AFAIK)总是根据 行上的事件/计数器除以其他值计算得出。通常是每秒实时,因此您在指令行上获得指令/秒。但是时间/时间是无量纲的,在这种情况下是一个利用率。

    正常输出(对于单个进程)只是 (AFAIK)
    task-clock / wall-time = 平均使用的核心数。

    我认为对于每个 CPU 的情况,这也是同样的想法,
    cpu-clock / wall-time = 这个核心的平均利用率。

    【讨论】:

    • 1.你写的是“据我所知”,但是——你真的知道是这样吗? 2. 另外,你写的和我写的听起来一样,只是措辞不同。
    • @einpoklum:我的回答做出了可测试的预测:打印的利用率始终为cpu-clocktask-clock / wall-clock。根据我对perf 和其他事件计数器的经验,我很确定这是真的,但不,这不是我专门验证过的。但假设这是真的,听起来你的一些问题是 cpu-clocktask-clock 的实际含义。我假设内核的调度程序只记录它在给定内核上上下文切换到和离开任务(线程)的时间,并将整个过程的总和。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2014-10-05
    • 2019-10-05
    相关资源
    最近更新 更多