Ubuntu下如何仅在CPU核心0运行基准测试并独占该核心?
在Ubuntu中仅在CPU核心0运行基准测试并确保指令数稳定的方法
1. 内核层面隔离核心0
通过内核启动参数将核心0从系统全局调度池中移除,避免普通进程自动调度到该核心:
- 编辑GRUB配置文件:
sudo nano /etc/default/grub - 修改
GRUB_CMDLINE_LINUX行,添加isolcpus=0 nohz_full=0 rcu_nocbs=0(保留原有参数):
参数说明:GRUB_CMDLINE_LINUX="isolcpus=0 nohz_full=0 rcu_nocbs=0 ...原有的其他参数..."isolcpus=0:将核心0从通用调度队列中隔离nohz_full=0:关闭核心0的周期性时钟中断,减少调度干扰rcu_nocbs=0:禁止RCU回调在核心0上执行,降低后台开销
- 更新GRUB并重启系统:
sudo update-grub sudo reboot
2. 清理核心0上的现有进程
重启后检查核心0上的进程,并将可移动的进程绑定到其他核心:
# 查看核心0上的进程 ps -eLo pid,psr,cmd | grep -E '^ *[0-9]+ +0 '
批量移动所有核心0上的进程到其他核心(需root权限):
sudo bash -c 'for pid in $(ps -eLo pid,psr | awk '\''$2 == 0 {print $1}'\''); do taskset -cp 1-$(nproc --ignore=1) $pid; done'
注:部分系统核心进程(如init)无法移动,但其开销极小,不会影响基准测试的指令数统计。
3. 屏蔽核心0的硬件中断
中断会干扰测试稳定性,需将所有硬件中断移出核心0:
- 停止并禁用irqbalance服务(它会自动分配中断):
sudo systemctl stop irqbalance sudo systemctl disable irqbalance - 遍历所有中断,设置亲和性为非0核心:
sudo bash -c 'for irq in /proc/irq/*; do if [ -f "$irq/smp_affinity_list" ]; then echo 1-$(nproc --ignore=1) | tee "$irq/smp_affinity_list" fi done'
4. 固定CPU频率为性能模式
CPU调频会导致指令执行时间波动,需将核心0(及所有核心)设置为性能模式:
# 安装cpupower工具(若未安装) sudo apt install linux-tools-common linux-tools-generic # 设置所有核心为performance模式 sudo cpupower frequency-set -g performance
5. 绑定基准测试到核心0并执行perf stat
用taskset将基准测试和perf stat绑定到核心0,同时通过重复运行确保指令数稳定:
# 以root权限绑定到核心0,重复运行5次取统计均值 sudo taskset -c 0 perf stat -r 5 -d <你的基准测试命令>
参数说明:
-r 5:重复运行5次,自动计算统计值的均值与方差,便于验证稳定性-d:显示更多硬件相关统计指标<你的基准测试命令>:替换为实际的基准测试程序(如./my_benchmark)
验证稳定性
运行后查看instructions指标的方差,若方差小于1%则说明指令数稳定。若仍有波动,可增加重复运行次数(如-r 10)或再次检查核心0上的进程/中断状态。
内容的提问来源于stack exchange,提问作者Zahra Heydari
相关产品推荐
相关产品推荐

