【问题标题】:What is C-state Cx in cpupower monitorcpupower 监视器中的 C-state Cx 是什么
【发布时间】:2019-01-30 10:30:43
【问题描述】:

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

检查频率缩放

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

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

检查 CPU 空闲

$ 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 状态时,我发现超过 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
  ...

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

  1. 什么是 Cx 状态?看到这么低的数字,我是否应该不那么烦恼?
  2. 除了频率缩放和 CPU 空闲之外,是否还有其他我应该关心的功能(从基准测试的角度来看)?

奖金问题

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

编辑 1

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

【问题讨论】:

  • Unix & Linux Stack Exchange 可能更合适。要避免在 Linux 上对您的软件进行基准测试,请查看 governor.sh。它将 CPU 设置为最大频率以进行稳定的性能基准测试。
  • 其他调优技巧说明here

标签: linux x86-64 benchmarking amd-processor


【解决方案1】:

开源软件的美妙之处在于您可以随时查看:)
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)。

【讨论】:

  • 欣赏源代码挖掘,对我来说就像大海捞针。关于中断亲和性,我们是pinning threads to cores。这是否也考虑了 IRQ 关联性?
  • @talekeDskobeDa 恐怕我不明白你的问题。应该注意什么 IRQ 亲和力?如果这是您所要求的,则无法使用线程亲和性来控制 IRQ 亲和性。
  • 对不起我的无知。现在,我了解到设置 smp_affinity 会使系统相关的中断由特定的 CPU 处理,并且线程亲和性对它们没有影响。所以,是的,为那些不运行基准测试程序的内核设置了 IRQ 亲和性。
猜你喜欢
  • 2011-03-22
  • 2010-09-29
  • 2023-03-23
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2020-05-31
  • 2010-10-09
  • 1970-01-01
相关资源
最近更新 更多