什么是cpupower监视器中的C状态Cx

问题描述 投票:2回答:1

我正在运行linux的x86-64处理器上分析执行时间的应用程序。在开始对应用程序进行基准测试之前,我想确保禁用动态频率调整和空闲状态。

Check on Frequency scaling

$ cat /sys/devices/system/cpu/cpufreq/boost
0

这告诉我频率缩放(英特尔的Turbo Boost或AMD的Turbo Core)被禁用。实际上,我们将它设置为恒定的2GHz,这在下一个练习中很明显。

Check on CPU idling

$ 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
...

因此,空闲状态被禁用。现在我确信禁用了可以插入基准测试的“功能”,我继续使用cpupower监控应用程序。

但是,当我运行我的应用程序监视C状态时,我发现在C0状态下花费了99%以上的时间,应该是这种情况。但是,我也看到了一种称为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
  ...

所以,很高兴了解下面的内容。

  1. 什么是Cx状态?我是否应该少看这么低的数字呢?
  2. 除了频率缩放和CPU闲置之外还有其他任何我应该关注的功能(从工作台标记的角度来看)吗?

奖金问题

  1. CPUidle driver: none是什么意思?

编辑1

关于基准测试期间的其他问题的第二个问题,我最近发现CPU核心上的本地定时器中断用于调度目的可能会使测量结果偏差,因此在Linux内核中启用了CONFIG_NO_HZ_FULL以启用无空闲模式

linux x86-64 benchmarking amd-processor
1个回答
4
投票

开源软件的美妙之处在于你总能去检查:) cpupower monitor使用不同的显示器,mperf monitor defines this array

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,
    },
};

在逻辑上,Cx意味着任何C状态而不是C0,即任何空闲状态(注意这些状态不是ACPI状态,尽管更高的数字是更深的睡眠状态 - 对于ACPI关闭是C6)。

请注意Cx is computed

if (id == Cx)
    *percent = 100.0 - *percent;

Cx只是C0的补充。 这是因为使用的IA32_M/APERF计数器不计入任何C状态,但C0

C0 TSC频率时钟计数 当逻辑处理器处于C0时,以固定间隔(相对于TSC频率)递增。

IA32_APERF的类似定义出现在手册中。


在进行基准测试时需要考虑很多事情,可能会将其列为次要答案。 通常,测试代码的后续运行将在缓存中找到至少部分数据(对于TLB和任何内部缓存都是相同的)。

根据基准程序,中断关联性也是需要考虑的因素。

但是我会说,随着涡轮增压和缩放功能被禁用,你已经准备好进行测试了。


CPUIdle驱动程序是内核的一个组件,它控制进入和退出空闲状态的平台相关部分。 对于Intel CPU(和AMD的?),内核可以使用ACPI processor_idle驱动程序(如果enabled)或intel_idle(使用mwait)。

© www.soinside.com 2019 - 2024. All rights reserved.