当运行一个简单的单线程C++程序时,是否可以消除Linux机器的抖动

Is it possible to eliminate jitter from a Linux machine when running a simple single-threaded C++ program?

本文关键字:是否 抖动 机器 Linux C++ 运行 一个 单线程 简单 程序      更新时间:2023-10-16

我正在用运行3.5.7内核的Ubuntu盒子进行各种实验。我将我的基准代码预热到1000万次迭代,然后继续计时9000万次迭代。我仍然看到以下抖动:

Average: 242 nanos | Min Time: 230 nanos | Max Time: 4717 nanos  
0.75 = avg: 240, max: 246  
0.9 = avg: 241, max: 247  
0.99 = avg: 242, max: 250  
0.999 = avg: 242, max: 251  
0.9999 = avg: 242, max: 517  
0.99999 = avg: 242, max: **2109** <===  
0.999999 = avg: 242, max: **3724** <===  
0.9999999 = avg: 242, max: **4424** <===

我在0.01%的迭代中看到了糟糕的时刻。有可能使Linux内核真正实时吗?内核中是否发生了我无法控制的其他事情?

for(int i = 0; i < iterations; i++) {
    long start = get_nano_ts(&ts);
    for(int j = 0; j < load; j++) {
        long p = (i % 8) * (i % 16);
        if (i % 2 == 0) {
            x += p;
        } else {
            x -= p;
        }
    }
    long end = get_nano_ts(&ts);
    int res = end - start;
    // store the results, calculate the percentiles, averages, min, max, etc.
}

简单的答案是否定的。你必须放弃内核提供的所有其他东西,以确保你的代码获得100%的工作周期。

如果你想保证对CPU的垄断,你需要使用一个可以禁用所有中断的实时操作系统。像FreeRTOS或VXWorks之类的东西。

tickless内核是为在空闲时节省功耗而设计的。它并不是为了完全禁用中断而设计的。所有IO设备都不断要求中断。如果您禁用了所有IO驱动程序并运行tickless并禁用了所有可能定期唤醒的服务,那么您可能会接近无抖动操作。但那样你就有一块砖了。