最可靠、生产可用的方式是用cgroups v2的cpu.max文件;cgroups v1的cpu.cfs_quota_us+cpu.cfs_period_us仍可工作但权限混乱、易被systemd覆盖,不建议新系统使用。

Linux下C++无法直接设置CPU频率限制
你不能在C++代码里“设置CPU频率限制”。CPU频率(如 scaling governor、min/max freq)是系统级硬件调控策略,由内核 cpufreq 子系统管理,用户态程序无权直接写入 /sys/devices/system/cpu/cpu*/cpufreq/ 下的文件——除非以 root 权限调用系统调用或执行 shell 命令。C++ 程序本身不提供 set_cpu_frequency() 这类标准函数。
真正能做的:从C++触发系统级调控
如果你的目标是让某个 C++ 进程“跑得慢一点”或“别吃满 CPU”,实际要解决的是资源配额问题,不是频率。可行路径只有两条:
- 通过
system()或fork()+exec()调用cpupower frequency-set(影响整颗 CPU,非单进程,且需 root) - 更合理的方式:用 C++ 启动后,立即把自己加入 cgroups v2 控制组,写入
cpu.max—— 这才是真正限制该进程 CPU 时间带宽的正解
示例(需 root 权限):
mkdir -p /sys/fs/cgroup/mylimit echo "100000 100000" > /sys/fs/cgroup/mylimit/cpu.max # 10% 配额(100ms 周期内最多用 10ms) echo $$ > /sys/fs/cgroup/mylimit/cgroup.procs
注意:$$ 是当前 shell 的 PID;C++ 中可用 getpid() 获取自身 PID,再用 write() 写入 cgroup.procs。
为什么别碰 cpufreq + 单进程绑定
有人试图用 taskset -c 0 绑定到单核,再用 cpupower frequency-set -g powersave 降频,以为能限制某进程——这是误解:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
cpupower设置的是整个 CPU core 的运行频率策略,影响所有跑在该核上的进程 - 即使绑核,进程仍可占满该核 100% 时间,降频只降低单指令周期耗时,不改变调度时间片分配
- 现代 CPU 的 turbo boost 和 DVFS 动态调频会绕过你的静态设置
换句话说:降频 ≠ 限 CPU 使用率,它只是让“满载”时发热/功耗低一点,但 top 里照样显示 100%。
长期服务必须用 systemd CPUQuota
如果你的 C++ 程序是以 systemd service 方式部署的,最稳的方式是放弃在代码里做任何调控,直接改 unit 文件:
[Service] CPUQuota=30%
然后 sudo systemctl daemon-reload && sudo systemctl restart your-app.service。systemd 会在启动时自动创建 cgroups v2 控制组并设 cpu.max,比手动写路径可靠得多,且重启不丢失。
容易被忽略的一点:CPUQuota 限制的是 CPU 时间占比,不是频率;它不依赖 CPU 当前运行在哪档频率上,也不受 governor 影响——这才是生产环境该用的机制。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










