cpupower monitor中的C-state Cx是什么
What is C-state Cx in cpupower monitor
我正在分析应用程序在 x86-64 处理器 运行ning linux 上的执行时间。在开始对应用程序进行基准测试之前,我想确保禁用动态频率缩放和空闲状态。
检查频率缩放
$ cat /sys/devices/system/cpu/cpufreq/boost
0
这告诉我频率缩放(Intel 的 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
...
因此,空闲状态被禁用。
现在我确定可以干扰基准标记的 "features" 都被禁用了,我继续使用 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
...
所以,很高兴了解以下内容。
- 什么是Cx状态?看到这么少的数字我应该不那么在意吗?
- 除了频率缩放和 CPU 空闲之外,还有其他我应该关心的功能吗(从基准测试的角度来看)?
加分题
CPUidle driver: none
是什么意思?
编辑 1
关于基准测试期间额外关注的第二个问题,我最近发现 CPU 内核上的本地定时器中断用于调度目的可能会扭曲测量,因此 CONFIG_NO_HZ_FULL 在Linux 内核启用 tickless 模式
开源软件的美妙之处在于你可以随时去检查:)
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 Frequency Clock Count
Increments at fixed interval (relative to TSC freq.) when the logical processor is in C0.
A similar definition for IA32_APERF
is present in the manuals.
进行基准测试时需要考虑很多事情,可能比作为次要答案列出的要多。
通常,较晚的 运行 测试代码会发现缓存中至少有一部分数据是热数据(对于 TLB 和任何内部缓存也是如此)。
根据基准测试程序,中断亲和性也是需要考虑的因素。
但是我要说的是,在禁用涡轮增压和缩放功能的情况下,您已经准备好进行测试了。
CPUIdle 驱动程序是内核的一个组件,它控制进入和退出 to/from 空闲状态的 平台相关 部分。
对于 Intel CPU(和 AMD 的?),内核可以使用 ACPI processor_idle driver (if enabled) or the intel_idle (that uses mwait
).
我正在分析应用程序在 x86-64 处理器 运行ning linux 上的执行时间。在开始对应用程序进行基准测试之前,我想确保禁用动态频率缩放和空闲状态。
检查频率缩放
$ cat /sys/devices/system/cpu/cpufreq/boost
0
这告诉我频率缩放(Intel 的 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
...
因此,空闲状态被禁用。 现在我确定可以干扰基准标记的 "features" 都被禁用了,我继续使用 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
...
所以,很高兴了解以下内容。
- 什么是Cx状态?看到这么少的数字我应该不那么在意吗?
- 除了频率缩放和 CPU 空闲之外,还有其他我应该关心的功能吗(从基准测试的角度来看)?
加分题
CPUidle driver: none
是什么意思?
编辑 1
关于基准测试期间额外关注的第二个问题,我最近发现 CPU 内核上的本地定时器中断用于调度目的可能会扭曲测量,因此 CONFIG_NO_HZ_FULL 在Linux 内核启用 tickless 模式
开源软件的美妙之处在于你可以随时去检查:)
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 Frequency Clock Count
Increments at fixed interval (relative to TSC freq.) when the logical processor is in C0.A similar definition for
IA32_APERF
is present in the manuals.
进行基准测试时需要考虑很多事情,可能比作为次要答案列出的要多。
通常,较晚的 运行 测试代码会发现缓存中至少有一部分数据是热数据(对于 TLB 和任何内部缓存也是如此)。
根据基准测试程序,中断亲和性也是需要考虑的因素。
但是我要说的是,在禁用涡轮增压和缩放功能的情况下,您已经准备好进行测试了。
CPUIdle 驱动程序是内核的一个组件,它控制进入和退出 to/from 空闲状态的 平台相关 部分。
对于 Intel CPU(和 AMD 的?),内核可以使用 ACPI processor_idle driver (if enabled) or the intel_idle (that uses mwait
).