tal*_*eDa 2 linux benchmarking x86-64 amd-processor
我正在分析一个应用程序在运行 linux 的 x86-64 处理器上的执行时间。在开始对应用程序进行基准测试之前,我想确保禁用动态频率缩放和空闲状态。
$ cat /sys/devices/system/cpu/cpufreq/boost
0
Run Code Online (Sandbox Code Playgroud)
这告诉我频率缩放(Intel 的 Turbo Boost 或 AMD 的 Turbo Core)被禁用。事实上,我们将其设置为恒定的 2GHz,这在下一个练习中很明显。
$ cpupower --cpu 0-63 idle-info
CPUidle driver: none
CPUidle governor: menu
analyzing CPU 0:
CPU 0: No idle states
analyzing CPU 1:
CPU 1: No idle states
analyzing CPU 2:
CPU 2: No idle states
...
Run Code Online (Sandbox Code Playgroud)
因此,空闲状态被禁用。现在我确定可以干扰基准测试的两个“功能”都被禁用,我继续使用 cpupower 监视应用程序。
但是,当我运行我的应用程序来监控 C 状态时,我发现超过 99% 的时间都花在了 C0 状态,这应该是这种情况。但是,我也看到了一种称为 Cx 状态的东西,其中内核花费了 0.01 - 0.02% 的时间。
$ cpupower monitor -c ./my_app
./my_app took 32.28017 seconds and exited with status 0
|Mperf
CPU | C0 | Cx | Freq
0| 99.98| 0.02| 1998
32| 99.98| 0.02| 1998
1|100.00| 0.00| 1998
33| 99.99| 0.01| 1998
2|100.00| 0.00| 1998
34| 99.99| 0.01| 1998
3|100.00| 0.00| 1998
35| 99.99| 0.01| 1998
...
Run Code Online (Sandbox Code Playgroud)
所以,很高兴理解下面的内容。
奖金问题
CPUidle driver: none意思?编辑 1
对于基准测试期间关于其他问题的第二个问题,我最近发现用于调度目的的 CPU 内核上的本地定时器中断可能会使测量结果发生偏差,因此在 Linux 内核中启用了CONFIG_NO_HZ_FULL以启用无滴答模式
开源软件的美妙之处在于你可以随时去检查:)
cpupower monitor使用不同的监视器,mperf监视器定义了这个数组:
static cstate_t mperf_cstates[MPERF_CSTATE_COUNT] = {
{
.name = "C0",
.desc = N_("Processor Core not idle"),
.id = C0,
.range = RANGE_THREAD,
.get_count_percent = mperf_get_count_percent,
},
{
.name = "Cx",
.desc = N_("Processor Core in an idle state"),
.id = Cx,
.range = RANGE_THREAD,
.get_count_percent = mperf_get_count_percent,
},
{
.name = "Freq",
.desc = N_("Average Frequency (including boost) in MHz"),
.id = AVG_FREQ,
.range = RANGE_THREAD,
.get_count = mperf_get_count_freq,
},
};
Run Code Online (Sandbox Code Playgroud)
从逻辑上讲,Cx意味着任何 C 状态都不是C0,即任何空闲状态(请注意,这些状态不是 ACPI 状态,尽管更高的数字是更深的睡眠状态 - ACPI off 是 C6)。
注意如何Cx计算:
if (id == Cx)
*percent = 100.0 - *percent;
Run Code Online (Sandbox Code Playgroud)
Cx只是 的补充C0。
这是因为使用的IA32_M/APERF计数器在任何 C 状态下都不计数,但是C0:
C0 TSC 频率时钟计数
在逻辑处理器处于 C0 时以固定间隔(相对于 TSC 频率)递增。
IA32_APERF手册中有类似的定义。
进行基准测试时有很多事情需要考虑,可能不仅仅是作为次要答案列出的。
一般来说,稍后运行的测试代码会发现缓存中至少有一部分是热数据(TLB 和任何内部缓存都一样)。
根据基准程序,中断关联也是需要考虑的。
但是我想说,在禁用涡轮增压和缩放的情况下,您几乎可以进行测试了。
CPUIdle 驱动程序是内核的一个组件,用于控制进入和退出空闲状态的平台相关部分。
对于 Intel CPU(和 AMD CPU?),内核可以使用ACPI processor_idle驱动程序(如果启用)或intel_idle(使用mwait)。
| 归档时间: |
|
| 查看次数: |
1393 次 |
| 最近记录: |