cpufreq và pstate driver: từ điều khiển tần số trực tiếp đến "hợp đồng hiệu năng" với phần cứng¶
Khái niệm, cấu trúc, ý nghĩa và ứng dụng của cơ chế điều chỉnh tần số CPU trong nhân Linux.
Tóm tắt
Bài viết thảo luận subsystem cpufreq của Linux và lớp driver thường gọi là "pstate driver". Chúng tôi phân tích kiến trúc ba lớp (core, governor, scaling driver), sự dịch chuyển từ mô hình kernel chọn tần số (target) sang mô hình kernel chỉ đặt ràng buộc và gợi ý (setpolicy) dựa trên HWP và ACPI CPPC, rồi so sánh hiện thực trên x86 (Intel, AMD) và ARM (NXP LX2160A, Ampere, Marvell CN106, Fujitsu MONAKA). Bản vá EPP boost cho amd-pstate được dùng làm ví dụ để thảo luận cách phân chia trách nhiệm giữa kernel và firmware.
Từ khóa: cpufreq, DVFS, P-state, HWP, CPPC, EPP, amd-pstate, cppc_cpufreq.
1. Giới thiệu¶
Công suất động của mạch CMOS tỉ lệ với C·V²·f, nên điều chỉnh đồng thời điện áp và tần số (DVFS) là đòn bẩy chính để cân bằng hiệu năng và điện năng. Trong Linux, DVFS cho CPU được hiện thực trong drivers/cpufreq/. Qua hai thập kỷ, vai trò của kernel trong vòng điều khiển đã thu hẹp dần: từ chỗ chọn chính xác tần số cho từng nhóm core, kernel chuyển sang chỉ khai báo khoảng cho phép và thiên hướng năng lượng, còn quyết định cuối cùng thuộc về phần cứng hoặc firmware. Nhóm driver theo mô hình mới này được gọi chung là pstate driver.
2. Kiến trúc subsystem cpufreq¶
Subsystem gồm ba lớp (Hình 1). cpufreq core quản lý các policy, mỗi policy ứng với một miền clock dùng chung, giữ ràng buộc min/max và giao diện sysfs /sys/devices/system/cpu/cpuN/cpufreq/. Governor là thuật toán chọn mức hiệu năng; hiện nay schedutil là mặc định vì lấy trực tiếp tín hiệu utilization từ scheduler, bên cạnh performance, powersave, ondemand. Scaling driver đăng ký qua struct cpufreq_driver và là lớp duy nhất chạm vào phần cứng. Ngoài ra, thermal (cpufreq là một cooling device) và PM QoS áp giới hạn từ bên ngoài lên policy.
Có hai mô hình driver. Ở mô hình target, governor tính tần số đích và driver thực thi qua target_index() hoặc fast_switch() (chạy ngay trong ngữ cảnh scheduler, không ngủ). Ở mô hình setpolicy, kernel chỉ chuyển min/max và gợi ý xuống, phần cứng tự chọn điểm hoạt động.
Hình 1. Ba lớp của cpufreq. Ở mô hình target, governor quyết định tần số; ở mô hình setpolicy (pstate), kernel chỉ gửi ràng buộc và gợi ý, phần cứng tự chọn.
3. Pstate driver: khái niệm¶
Pstate driver không đặt MHz hay mV. Nó ghi cho từng core một "hợp đồng" bằng mức hiệu năng trừu tượng: min_perf (sàn), max_perf (trần, nơi hội tụ giới hạn từ policy, thermal, QoS), desired_perf (bằng 0 nghĩa là để phần cứng tự quyết) và EPP (Energy Performance Preference, 0 thiên về hiệu năng, 255 thiên về tiết kiệm). Hai chuẩn hiện thực là HWP của Intel (IA32_HWP_REQUEST) và ACPI CPPC, dùng trên AMD (MSR_AMD_CPPC_REQ) và ARM server (qua PCC). Driver đọc ngược khả năng của core (highest, nominal, lowest) và tần số hiệu dụng từ bộ đếm APERF/MPERF (x86) hoặc AMU (ARM). Các C-state, điện áp từng core và power gating nằm ngoài phạm vi driver.
Lý do của sự dịch chuyển này là phần cứng phản ứng ở thang micro giây, nhanh hơn vòng lặp governor (mili giây), và nắm thông tin kernel không thấy: nhiệt độ cục bộ, dòng điện, ngân sách công suất chung giữa CPU và GPU.
4. Hiện thực trên các kiến trúc¶
Bảng 1. Driver và mô hình điều khiển trên một số nền tảng.
| Nền tảng | Driver | Mô hình / ghi chú |
|---|---|---|
| Intel (Skylake+) | intel_pstate |
Active + HWP; passive dùng schedutil |
| AMD (Zen 2+) | amd-pstate |
Active (EPP), guided, passive; CPPC |
| NXP LX2160A | qoriq-cpufreq |
Target; đổi parent clock của CMUX |
| Ampere Altra/One | cppc_cpufreq |
CPPC qua PCC; boost tắt mặc định |
| Marvell CN106 | chưa có upstream | Có thể firmware đặt cố định* |
| Fujitsu MONAKA | chưa công bố | ACPI chuẩn, dự kiến CPPC* |
* Suy luận, chưa kiểm chứng trên phần cứng.
Trên x86, hai nhà sản xuất hội tụ về cùng một mô hình: kernel đặt hợp đồng, phần cứng thực thi. Trên ARM, bức tranh phân mảnh: SoC nhúng như LX2160A vẫn theo mô hình target với bảng tần số và clock driver riêng, trong khi ARM server dùng cppc_cpufreq. Đáng chú ý, các bản vá của Huawei và NVIDIA (2024 đến 2026) đã bổ sung chế độ autonomous và EPP cho cppc_cpufreq, kéo ARM server về cùng mô hình với amd-pstate-epp.
5. Ý nghĩa và ứng dụng¶
- Trung tâm dữ liệu: EPP và chính sách boost quyết định hiệu năng trên mỗi watt; trên Ampere Altra, phải bật boost thủ công mới đạt tần số danh định.
- Hệ thời gian thực và low-latency (5G RAN, DPDK): tính tự chủ của phần cứng là nguồn jitter, nên thường khóa governor
performancevà giới hạn boost để đổi lấy tính tất định. - Thiết bị cầm tay, nhúng: ngân sách công suất chung CPU/GPU khiến các quyết định cục bộ ảnh hưởng toàn hệ thống.
Ví dụ: EPP boost cho amd-pstate. D. Vernet (Meta) quan sát rằng ở chế độ active, thread game bận liên tục nhưng ngủ rất ngắn mỗi frame làm phần cứng hạ mức hiệu năng, nên core thức dậy ở xung thấp và gây stale frame. Hai cách hiển nhiên đều thất bại: ép EPP = performance toàn cục tốn điện, còn nâng min_perf làm nhiễu bộ quản lý boost chung CPU/GPU của SMU trên Steam Deck. Bản vá chọn cách nhẹ hơn: cứ mỗi 10 ms đo C0 residency (ΔMPERF/ΔTSC) của từng core; core bận từ 50% trở lên được đặt EPP = 0 và giữ cho tới khi 300 ms không còn bận. Kết quả trên Civilization VI: 1%-low FPS tăng 31,8%, p99 frame time cải thiện 4,1%.
6. Thảo luận¶
Ví dụ trên cho thấy câu hỏi trung tâm không còn là "chọn tần số nào" mà là ai biết gì. Phần cứng biết trạng thái vật lý; kernel và userspace biết ngữ cảnh workload, chẳng hạn thread nào nằm trên đường găng của frame. EPP là kênh truyền thông tin hẹp giữa hai bên. Việc reviewer đề nghị đưa heuristic từ driver lên tầng governor, và ý tưởng để Wine/Proton gửi thread hint, đều là cách mở rộng kênh này theo hướng tách cơ chế khỏi chính sách. Nếu thành công, một governor điều khiển EPP có thể dùng chung cho amd-pstate, intel_pstate và cppc_cpufreq.
Mô hình hợp đồng cũng có cái giá về khả năng quan sát: trên Ampere Altra từng có lỗi firmware khiến scaling_cur_freq báo sai, và cơ chế frequency invariance không bật khi thanh ghi CPPC nằm trong PCC. Với hệ RAN, điều này gợi ý nên đo trực tiếp bằng bộ đếm phần cứng thay vì tin vào giá trị sysfs.
7. Kết luận¶
cpufreq đã tiến hóa từ một bộ chọn tần số thành một lớp thương lượng giữa kernel và phần cứng. Hiểu mô hình hợp đồng (min, max, desired, EPP) là chìa khóa để vừa tối ưu năng lượng, vừa giữ được độ trễ trên cả x86 và ARM.
Tài liệu tham khảo¶
- D. Vernet, "EPP-boost: per-core util-based performance boosting in AMD p-state driver," LPC 2026, Prague. lpc.events
- RFC amd-pstate epp_boost, linux-pm, 28/7/2026. lore.kernel.org
- M. Larabel, Phoronix, 28/7 và 6/10/2026. bài 1, bài 2
- cpufreq: qoriq: add support for lx2160a, LKML, 4/2019. lkml.iu.edu
- L. Zheng; S. Gupta, cppc_cpufreq autonomous selection, LKML, 2025–2026. Huawei, NVIDIA
- Red Hat KB 6973572; Linaro known issue 6620 (Ampere Altra). Red Hat, Linaro