ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux 内核 intel_pstate 驱动详解:Intel CPU 性能缩放架构、sysfs 调参与内核命令行参数

Linux 内核 intel_pstate 驱动详解:Intel CPU 性能缩放架构、sysfs 调参与内核命令行参数 Linux 内核 intel_pstate 驱动详解Intel CPU 性能缩放架构、sysfs 调参与内核命令行参数【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux导读intel_pstate是 Linux 内核CPUFreqCPU 性能缩放子系统中的核心缩放驱动服务于 Sandy Bridge 及之后各代 Intel 处理器。它利用 Intel 硬件 P-state 接口在软件与硬件之间架起桥梁支持主动active与被动passive两种运行模式并针对 HWP硬件管理 P-state、Turbo 频段、混合处理器大小核做了专门设计。阅读本文后你将掌握intel_pstate的运行模式与算法选择逻辑、sysfs下全局属性与策略属性的完整含义与调参方法、intel_pstate各内核命令行参数的语义与适用场景以及通过 trace event 与 ftrace 进行诊断定位的实操手法。本文基于 Linux 内核源码树中 Documentation/admin-guide/pm/intel_pstate.rst 展开并结合驱动实现 drivers/cpufreq/intel_pstate.c 进行源码级印证。若对CPUFreq子系统本身尚不熟悉建议先阅读 Documentation/admin-guide/pm/cpufreq.rst。intel_pstate 在 CPUFreq 中的定位intel_pstate是CPUFreq性能缩放子系统详见 cpufreq.rst的一部分其核心特征如下服务范围Sandy Bridge 及之后各代 Intel 处理器部分型号可能不受支持。P-state 表示驱动内部遵循硬件规范Intel Software Developers Manual来表示 P-state同时将其无歧义地映射为频率供CPUFreq核心与用户空间接口使用。由于可用频率表可能过于庞大驱动并不向核心提供完整频率表这限制了核心的部分功能。以逻辑 CPU 为粒度硬件 P-state 选择接口存在于逻辑 CPU 级别因此每个CPUFreq策略对象policy只对应一个逻辑 CPU策略与 CPU 等价CPU 下线时策略随之失效重新上线时需要重新初始化。不可卸载intel_pstate不是模块无法 unload早期配置只能通过内核命令行传入但多数运行期配置可通过sysfs调整某些配置下还可通过sysfs注销驱动以便加载其他缩放驱动详见下文status属性。从源码看驱动入口通过early_param(intel_pstate, intel_pstate_setup)注册intel_pstate_setup() 解析intel_pstate前缀的命令行参数驱动的描述信息MODULE_DESCRIPTION明确其为 P state driver Intel Core processors。两种运行模式Operation Modesintel_pstate可在两种模式下运行主动模式active与被动模式passive具体生效哪种取决于内核命令行选项与处理器能力。主动模式Active Mode这是支持 HWP 的处理器的默认运行模式。此时sysfs中所有策略的scaling_driver属性值为intel_pstate。该模式下驱动绕过通用缩放调度器层提供自己的 P-state 选择算法可像通用 governor 一样通过scaling_governor策略属性应用到策略上可为不同策略选择不同算法但不推荐。需特别注意这些算法名称与通用 governor 相同但行为并不一致。例如intel_pstate的powersave算法并非通用powersavegovernor 的对等物大致对应schedutil与ondemand。主动模式提供两种 P-state 选择算法powersave与performance。默认选择哪个由CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE内核配置决定置位时默认用performance否则默认用powersave。带 HWP 的主动模式若处理器支持 HWP初始化期间即会启用且之后无法关闭可通过intel_pstateno_hwp命令行参数避免启用。HWP 启用后P-state 选择由处理器自动完成驱动仅向处理器内部逻辑提供提示取决于所应用的算法。此模式下驱动仍向 CPU 调度器注册利用率更新回调但仅用于周期性刷新scaling_cur_freq不参与 P-state 选择。HWP performance驱动向处理器的 Energy-Performance PreferenceEPP旋钮若不支持则用 EPBEnergy-Performance Bias写入 0使内部逻辑完全聚焦性能。这会覆盖来自sysfs的 EPP/EPB 设置且此配置下任何通过sysfs将 EPP/EPB 改为非 0performance的尝试都会被拒绝。同时可用 P-state 范围被限制在上边界驱动允许的最大 P-state。源码中 intel_pstate_set_energy_pref_index() 即实现了当策略为CPUFREQ_POLICY_PERFORMANCE且 epp 0 时返回-EBUSY的拒绝逻辑。HWP powersave驱动将 EPP/EPB 设置为之前通过sysfs设置的值或平台固件设定的默认值通常使内部逻辑更少偏向性能。不带 HWP 的主动模式对于不支持 HWP 的处理器或传递了intel_pstateno_hwp时该模式为可选需在命令行显式传递intel_pstateactive。此模式下驱动可能拒绝不认识的处理器注意对任何启用 HWP 的处理器驱动都不会拒绝。驱动注册利用率更新回调来运行powersave或performance算法并同时周期性刷新scaling_cur_freq。performance无 HWP与处理器型号和平台配置无关每次驱动配置更新例如通过sysfs时选择允许的最大 P-state。若CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE置位则为其默认算法。powersave无 HWP与通用schedutil类似但利用率指标基于 CPU 反馈寄存器APERF/MPERF的数据通常选择与当前 CPU 利用率成比例的 P-state。算法由驱动的利用率更新回调运行频率不超过每 10 ms 一次——源码中INTEL_PSTATE_SAMPLING_INTERVAL (10 * NSEC_PER_MSEC)intel_pstate.c即采样间隔常量回调中亦有delta_ns INTEL_PSTATE_SAMPLING_INTERVAL的节流判断。若新 P-state 与当前相同则不触碰硬件配置。若CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE未置位则为其默认算法。被动模式Passive Mode这是不支持 HWP 的处理器的默认运行模式显式传递intel_pstatepassive则无论是否支持 HWP 都使用被动模式intel_pstateno_hwp若不与intel_pstateactive组合也会使驱动以被动模式启动。此模式下scaling_driver属性值为intel_cpufreq驱动行为与普通缩放驱动一致由通用 governor 按需调用以修改 CPU P-stateschedutil可从调度器上下文直接调用。可与scaling_available_governors列出的所有通用 governor搭配使用前述 P-state 选择算法不再生效。驱动向核心提供准确的最高/最低运行频率含 turbo 频段即整个可用 P-state 范围全部暴露给CPUFreq核心。此模式不注册利用率更新回调scaling_cur_freq来自核心即当前 governor 最近选择的频率。Turbo P-states 支持多数情况下可用 P-state 范围可按turbo 阈值分为两个子区间turbo 区间阈值之上的 P-state。对应 Intel Turbo Boost 技术——多核处理器在功率与热封套允许时机会性地将一个或多个核提升到更高 P-state。turbo P-state 不可持续无法保证 CPU 能无限停留在这些状态功耗分布可能变化或热封套可能被超出。非 turbo 区间阈值之下的 P-state 通常是可持续的软件设定后处理器不会主动降级除非热应力或功率限制违规或同一封装内其他 CPU 同时设定了更高 P-state。跨代行为差异Sandy Bridge 代处理器绝不会使用软件最后一次设定的 P-state 之上的任何 P-state即使它在 turbo 区间内而之后各代处理器会把设置任意 turbo 区间 P-state当作许可可自行在 turbo 区间内使用直至最高支持的 P-state。多核并发限制部分处理器允许多核同时处于 turbo P-state但可设定的最大 P-state 通常随并发核数递减3 核 2 核 1 核单核最大 turbo P-state 即整体最大支持值。最高 turbo P-state、turbo 阈值最高非 turbo P-state与最低 P-state 均为处理器型号特性可通过 MSR 读取部分处理器支持 Configurable TDP此时 turbo 阈值成为可由固件配置的值。与 ACPI 的区别与 ACPI 表中的_PSS对象不同intel_pstate始终向CPUFreq核心被动模式下也向通用 governor暴露包含整个 turbo 区间的完整 P-state 范围因此使用intel_pstate时 turbo P-state 会被更频繁地设置。同时由于驱动始终知道真实 turbo 阈值即使启用了 Configurable TDP其no_turbo属性在所有情况下都能按预期工作。处理器支持与混合处理器大小核驱动需要针对每个处理器掌握最低 P-state、最高非 turbo P-state、是否支持 turbo、最高单核 turbo P-state若支持、以及内部 P-state 表示与频率互转的换算公式。这些信息通常可从处理器自身MSR获得个别情况需查阅硬件手册。因此驱动维护受支持处理器列表若检测到的处理器不在列表中且不支持 HWP初始化将失败所有支持 HWP 的处理器使用同一套信息获取接口故都能工作。混合处理器Hybrid Processors含两种或更多类型核心最大 turbo P-state、性能/功耗特性、缓存大小等不同的处理器。支持混合处理器要求启用 HWP并假设所有 CPU 的 HWP 性能单位一致使同一 HWP 性能级别在所有核心类型上代表大致相同的物理性能。带 SMT超线程驱动为 CPU 分配基于性能的优先级反映其最高 HWP 性能级别调度器因此更偏好高性能 CPU性能较低的 CPU 只在其他 CPU 满载时被使用SMT 兄弟线程优先级相同。该策略多数情况下最大化性能但在视频播放等场景会带来过高能耗。无 SMT 的 CAS 支持默认启用容量感知调度CAS调度器在 CPU 有足够剩余容量时才放任务容量不足的任务会被迁移。驱动以CPU 最高 HWP 性能级别 × 1024 / 系统最强 CPU 最高 HWP 性能级别表示每个 CPU 的容量并调整频率不变性计算以纳入容量。CAS 让任务在大小核间更对称分布平均降低高性能核利用率使能耗更均衡。EAS 支持若配置了CONFIG_ENERGY_MODEL且在无 SMT 的混合处理器上运行驱动在启用 CAS 之外还会注册人为构造的 Energy Model基于抽象成本值无真实功耗数字使 EAS 在被动模式 schedutil下可用。其设计使小核运行任务总是显得更便宜同型核中当前利用率更高的显得更贵从而既保证高利用率任务迁移到容量足够的核又让低利用率任务倾向落在更便宜的核上。可通过debugfs通常挂载于/sys/kernel/debug/下的energy_model目录查看该 Energy Model。sysfs 用户空间接口全局属性Global Attributes位于/sys/devices/system/cpu/intel_pstate/目录作用于所有 CPU。部分属性在传递intel_pstateper_cpu_perf_limits时不出现。属性读写含义max_perf_pct读写驱动允许设定的最大 P-state以最高支持turbo性能级别的百分比表示。per_cpu_perf_limits时不暴露。min_perf_pct读写驱动允许设定的最小 P-state 百分比同上基准。per_cpu_perf_limits时不暴露。num_pstates只读处理器支持的 P-state 数量0–255含 turbo 与非 turbo。仅当所有 CPU 值相同时出现不受no_turbo影响。turbo_pct只读turbo 区间大小占整个 P-state 范围的百分比。仅当所有 CPU 值相同时出现。no_turbo读写置 1 禁止使用 turbo P-state置 0默认允许。intel_pstate不支持通用boost属性以本属性替代。不影响上报给核心的最大频率但影响 per-policy 限制的最大可能值。hwp_dynamic_boost读写仅 HWP 主动模式下存在。置 1 时每当之前等待 I/O 的任务被调度到某逻辑 CPU 上运行最小 P-state 限制会被短暂动态提高用于改善性能。对最小限制已直接设为最高非 turbo P-state 或以上的逻辑 CPU 无效。status读写驱动运行模式active/passive/off。可写入以切换模式或注销驱动写off。模式切换实际是注销再注册一组不同回调故所有全局与 per-policy 设置会重置为默认值。energy_efficiency读写仅存在于 Kaby Lake / Coffee Lake 桌面 CPU 型号平台。这些型号在 HWP 启用时默认关闭节能优化置 1 启用可能限制最大运行频率HWP 下仅在 turbo 频段内优化无 HWP 时在整个频段内优化置 0 关闭。源码印证global_params结构体注释明确了no_turbo、min_perf_pct、max_perf_pct的语义intel_pstate.cstore_no_turbo()会同步收缩min_perf_pctintel_pstate.cstore_max_perf_pct将输入clamp到[global.min_perf_pct, 100]intel_pstate.c这些属性通过define_one_global_rw/ro与属性数组在 intel_pstate.c 注册其中max_perf_pct/min_perf_pct在per_cpu_limits时不创建intel_pstate.c。策略属性Policy Attributes的解释intel_pstate作为当前缩放驱动时部分CPUFreq策略属性见 cpufreq.rst的解释比较特殊且依赖运行模式cpuinfo_max_freq、cpuinfo_min_freq、scaling_cur_freq的值由处理器特定的乘数施加于内部 P-state 表示产生scaling_max_freq与scaling_min_freq被驱动允许的最大 P-state 对应频率封顶。设置no_turbo后scaling_max_freq/scaling_min_freq的最大值被限制到最高非 turbo P-state 频率若此前高于该值则被下调。取消no_turbo后恢复旧值除非设置期间这两个属性被写过。未设置no_turbo时两属性的最大可能值对应最高 turbo P-state也与cpuinfo_max_freq一致。主动模式下的特殊含义scaling_available_governors列出驱动提供的 P-state 选择算法scaling_governor为当前使用的算法scaling_cur_freq为两次利用率回调之间 CPU 平均 P-state 的频率。HWP 启用时还出现base_frequency属性显示 CPU 基础频率高于它的频率即处于 turbo 频段。被动模式下这些属性含义与普通缩放驱动相同scaling_driver属性为intel_pstate主动或intel_cpufreq被动。P-state 限制的协调Coordination of P-State Limits限制可通过全局max_perf_pct/min_perf_pct或策略属性scaling_max_freq/scaling_min_freq两种方式设置协调规则与运行模式无关全局限制作用于所有 CPU任何 CPU 都不能被请求运行快于全局最大值或慢于全局最小值。每个 CPU 受自身 per-policy 限制约束不能快于自身最大值、慢于自身最小值。实际性能取决于平台是否支持 per-core P-state、超线程是否启用及其他 CPU 当前的性能请求——平台不支持 per-core P-state 时若其他 CPU 正在请求更高性能某 CPU 的实际性能可能超过其策略限制即使支持 per-core P-state启用超线程时若兄弟线程请求更高性能其余兄弟线程也会获得高于其策略限制的性能。全局与 per-policy 限制可独立设置。HWP 主动模式下限制变化时会立即写入硬件寄存器请求内部逻辑始终在限制内选 P-state否则限制由 governor被动模式和驱动在每次设置新 P-state 前纳入考虑。若传入intel_pstateper_cpu_perf_limitsmax_perf_pct/min_perf_pct完全不暴露只能用策略属性设置限制。能量 vs 性能提示Energy vs Performance HintsHWP 启用时每个策略目录下出现两个额外属性energy_performance_preference当前能量/性能提示值可写入修改。energy_performance_available_preferences可写入的字符串列表default表示平台固件设定的默认值。字符串会被内部翻译为整数写入 EPP若支持或 EPB 旋钮。若存在 EPP 特性还可直接写 0–255 的整数无 EPP 时不支持写整数用户应使用/sys/devices/system/cpu/cpu*/power/energy_perf_bias接口。源码中可用字符串定义在 energy_perf_strings[]default、performance、balance_performance、balance_power、power对应枚举EPP_INDEX_DEFAULT至EPP_INDEX_POWERSAVEintel_pstate.cstore_energy_performance_preference()支持字符串匹配与 0–255 整数两种写入不匹配字符串且无X86_FEATURE_HWP_EPP时返回错误有 EPP 时用kstrtouint解析并校验epp 255拒绝intel_pstate.c。注意调度器的负载均衡可能把任务从一核迁到另一核若不同核设置了不同提示可能导致不良结果。建议所有 CPU 设置相同提示或将敏感任务固定到特定 CPU。intel_pstate 与 acpi-cpufreq 的对比在多数受支持系统上ACPI 表中的_PSS对象提供了可用于性能缩放的信息acpi-cpufreq驱动即依赖_PSS。关键差异_PSS返回的 P-state 列表基本是intel_pstate可用范围在同一系统上的子集唯一例外是整个 turbo 区间在_PSS中只用一个条目最顶端表示。按惯例该条目返回的频率比最高非 turbo P-state 高 1 MHz但其 P-state 表示匹配最高 turbo P-state或特殊值 255意为尽量高。因此acpi-cpufreq上报的最大频率比最高非 turbo P-state 高 1 MHz。对按负载比例选频的 governor除powersave/performance外而言turbo 区间只占频率带的一小部分1 MHz vs 1 GHz 以上它们倾向于在acpi-cpufreq下选择非 turbo P-state只有最高负载才进入 turbo 区间而 50% 以上可能受益于 turbo 的负载只能得到非 turbo P-state。支持 Configurable TDP 且与_PSS协调不佳时_PSS列表中可能出现多个 turbo 条目此时acpi-cpufreq单纯避开最顶端条目的做法不足以完全避免 turbo。除此之外acpi-cpufreq的工作方式与被动模式的intel_pstate类似只是可设 P-state 限于_PSS列出的范围。内核命令行选项intel_pstate 前缀所有早期配置参数均需加intel_pstate前缀解析实现在 intel_pstate_setup()选项行为disable即使处理器受支持也不注册intel_pstate为缩放驱动源码置no_load 1。active以主动模式注册驱动源码将default_driver指向intel_pstate。passive以被动模式注册驱动源码将default_driver指向intel_cpufreq。force即使系统更偏好acpi-cpufreq也强制注册intel_pstate。谨慎使用可能使依赖 ACPI P-state 信息的平台特性热控制、功率封顶失效对驱动不支持的处理器及使用pcc-cpufreq的平台无效源码置force_load 1。no_hwp即使处理器支持也不启用 HWP源码置no_hwp 1。hwp_only仅当处理器支持 HWP 时才注册驱动源码置hwp_only 1intel_pstate_cpu_Init中!hwp_active hwp_only时跳过。support_acpi_ppc考虑 ACPI_PPC性能限制。若 FADT 中首选电源管理配置文件为 Enterprise Server 或 Performance Server_PPC限制默认启用本选项无效果源码acpi_ppc true。per_cpu_perf_limits使用按逻辑 CPU 的 P-state 限制源码置per_cpu_limits true。no_cas在无 SMT 的混合系统上默认启用容量感知调度本选项禁用它源码置no_cas true。诊断与调优Trace Events两个静态 trace event 可用于诊断均仅在主动模式下由驱动触发通用cpu_frequencyCPUFreq使用与intel_pstate专属的pstate_sample定义于 include/trace/events/power.h。启用与查看示例需内核支持事件追踪cd /sys/kernel/tracing/ echo 1 events/power/pstate_sample/enable echo 1 events/power/cpu_frequency/enable cat trace输出示例gnome-terminal--4510 [001] ..s. 1177.680733: pstate_sample: core_busy107 scaled94 from26 to26 mperf1143818 aperf1230607 tsc29838618 freq2474476 cat-5235 [002] ..s. 1177.681723: cpu_frequency: state2900000 cpu_id2pstate_sample中的core_busy、scaled、from/to前后 P-state、mperf/aperf/tsc反馈寄存器与时间戳计数差值对应源码中struct sample的字段与freq提供了单次采样周期内的性能细节。被动模式下cpu_frequency由schedutil对附加了它的策略或CPUFreq核心其他 governor触发。ftrace 低级诊断用ftrace过滤函数可检查 P-state 设置频率。例如追踪intel_pstate_set_pstatecd /sys/kernel/tracing/ cat available_filter_functions | grep -i pstate echo intel_pstate_set_pstate set_ftrace_filter echo function current_tracer cat trace | head -15输出示例# tracer: function # # entries-in-buffer/entries-written: 80/80 #P:4 # # _----- irqs-off # / _---- need-resched # | / _--- hardirq/softirq # || / _-- preempt-depth # ||| / delay # TASK-PID CPU# |||| TIMESTAMP FUNCTION # | | | |||| | | Xorg-3129 [000] ..s. 2537.644844: intel_pstate_set_pstate -intel_pstate_timer_func gnome-terminal--4510 [002] ..s. 2537.649844: intel_pstate_set_pstate -intel_pstate_timer_func gnome-shell-3409 [001] ..s. 2537.650850: intel_pstate_set_pstate -intel_pstate_timer_func idle-0 [000] ..s. 2537.654843: intel_pstate_set_pstate -intel_pstate_timer_func从调用者-intel_pstate_timer_func可见主动模式无 HWP下 P-state 的更新由驱动注册到调度器的回调周期驱动且输出显示每约 5 ms 触发一次与INTEL_PSTATE_SAMPLING_INTERVAL的 10 ms 节流上限相印证。总结与实践建议默认行为速查支持 HWP 的处理器默认主动模式scaling_driverintel_pstate不支持的默认被动模式scaling_driverintel_cpufreq。调参入口全局层面用/sys/devices/system/cpu/intel_pstate/下的no_turbo、max_perf_pct、min_perf_pct、hwp_dynamic_boost、energy_efficiency、status策略层面用scaling_governor、scaling_max_freq/scaling_min_freqHWP 下还有energy_performance_preference与base_frequency。限制协调全局与 per-policy 限制独立设置、共同生效需要按核精细控制时用intel_pstateper_cpu_perf_limits关闭全局百分比属性。命令行优先由于驱动不可卸载intel_pstateno_hwp、active、passive、force、hwp_only、no_cas等早期行为必须在引导时决定。诊断工具链主动模式下优先用pstate_sample/cpu_frequencytrace event 观察采样细节用 ftrace 追踪intel_pstate_set_pstate确认调用频率与来源。相关参考原文档引用的 Kristen Accardi 演讲、Intel Software Developers Manual 与 ACPI 规范见 intel_pstate.rst 末尾 References以及驱动实现 drivers/cpufreq/intel_pstate.c 与 trace 定义 include/trace/events/power.h。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表