gpt4 book ai didi

performance - "1.234 CPUs used"在 perf 输出中意味着什么?

转载 作者:行者123 更新时间:2023-12-05 02:07:55 25 4
gpt4 key购买 nike

当您使用命令运行 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 内核上执行的时间的一小部分”吗?

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

最佳答案

我会一一解释你的猜测。

案例二

使用 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反射(reflect)出 pid = -1 ,这意味着与命令关联的 pid ls没有被测量。这些是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 的值反射(reflect)上一次采样值和当前采样值之间的运行差异(以 jiffies 为单位)。要获得 CPU 使用率百分比,您可以除以 cpu-clock值由命令运行所用的挂钟时间决定。

命令运行所用的挂钟时间得到维护here .特别是,查看 t1 的计算和 t0 .

所以 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反射(reflect)出 pid=1833这是 pid与命令相关的进程 ls .但是,CPU = -1 的值意味着每当这个进程被调度时,不管它被调度到哪个 CPU,软件 hrtimer 计数 task-clock将会被更新。请注意,此计数现在将特定于进程以及仅与此进程关联的所有线程。

调度程序在函数的帮助下维护有关进程何时被安排进来和安排出去的信息 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 value 维护软件 hrtimer 到期时的时间戳,或者与此进程关联的事件被安排出去,或者事件被禁用。

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

关于performance - "1.234 CPUs used"在 perf 输出中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61442853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com