You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无中断无频率变化时,固定迭代寄存器递减循环为何出现抖动?

无内存访问的固定循环为何受同NUMA节点其他CPU任务干扰?

为了解硬件计数器(如Intel x86的rdtsc)的特性,我测试了一段理论上执行时间固定的代码。该测试代码采用固定次数的寄存器递减操作,具体如下:

unsigned long long cycles = 3600000000UL*duration;  // CPU基准频率为3.6GHz

tsc_start = tsc_now();
__asm__ __volatile__ (
        "mov %[cycles], %%rcx\n\t"
        "delay_loop:  dec %%rcx\n\t"
        "jnz delay_loop\n\t"
        : 
        : [cycles] "r" (cycles)
        : "rcx"
        );
tsc_end = tsc_now();

为减少干扰,程序运行在已关闭中断和任务调度的CPU核心上,该CPU以基准频率运行,且是对应NUMA节点上唯一运行的任务。

下表展示了循环迭代时长(duration)与测得时钟周期的关系。无干扰时抖动不超过数百时钟周期,我认为这源于前几次迭代的冷启动(分支预测与内存子系统影响):

duration (秒)cycles usedsleepdd
13600000070
10360000003343600006147636000114526
100360000000032360000083336360000121658

对比实验中,在同一NUMA节点的另一CPU上运行干扰程序,具体如下:

  • sleep:for i in {1..1000}; do (taskset -c $core sleep $((RANDOM % 10 + 1))&); done
  • dd:while true; do taskset -c 12 dd if=/dev/zero of=bigfile bs=10240000 count=100; done

即便无中断或任务调度,测试代码的执行时间仍受干扰程序显著影响,出现大幅抖动,最坏情况下延迟超121K时钟周期。

为何会出现这种情况?测试程序在迭代循环中未访问内存,理论上不应受其他任务影响。

环境配置

为让测试程序独占CPU运行,实现每CPU周期一次迭代,我对系统(2颗Intel第二代可扩展CPU)做了如下配置:

  1. BIOS Configuration:禁用Hyper-Threading、Turbo Boost及相关电源管理设置。
  2. Linux Kernel Boot Parameters:用nohz_full隔离专属NUMA节点的CPU,通过nowatchdog和mce=off禁用看门狗和机器检查异常(MCE)。
  3. System Configuration:设置echo -1 > /proc/sys/kernel/sched_rt_runtime_us禁用实时阈值,设置echo 2 > /sys/bus/event_source/devices/cpu/rdpmc允许用户空间使用rdpmc指令。
  4. Application Configuration:测试程序以SCHED_FIFO优先级运行,绑定到隔离NUMA节点的某CPU上,通过rdpmc在测试代码前后读取性能计数器(总指令数、中断数)。若使用5.4之前的Linux内核,还可通过cli和sti指令禁用和重新启用中断。

缓存相关实验

我设计了如下实验方案:测试程序运行时,同一NUMA节点的另一CPU上的干扰进程反复访问某一预分配内存段(持续约2-6秒),且干扰进程的内存段大小在每次迭代中不同。

抖动与内存大小的关系显示:当内存段接近L3缓存大小(33MB)时开始出现抖动,且抖动随内存增大而加剧。

这容易让人联想到L3缓存替换、硬件预取或类似DDIO的机制替换了L2/L3缓存,导致存放执行指令的L1i被逐出。但正如Peter Cordes指出的,测试所用CPU型号的L2/L3缓存并非包含式,这一点令人困惑。

此外,测试程序的执行代码非常短,仅占几行缓存行,理论上只有访问特定缓存路时才会出现抖动。

其他观察结果

  1. 其他CPU架构上也观察到类似问题。
  2. 运行在其他NUMA节点的干扰程序不会导致抖动,且并非同一NUMA节点内其他CPU上的所有程序都会引发抖动。
  3. 干扰程序即便不进入内核,仍可导致抖动。

测试代码的最简可运行示例可通过标准C编译环境编译运行。


内容的提问来源于stack exchange,提问作者foool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 03:50:55