【问题标题】:Is it possible to eliminate jitter from a Linux machine when running a simple single-threaded C++ program?运行简单的单线程 C++ 程序时,是否可以消除 Linux 机器的抖动?
【发布时间】:2015-09-22 03:20:43
【问题描述】:

我正在使用运行内核 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.
}

【问题讨论】:

    标签: c++ performance optimization real-time benchmarking


    【解决方案1】:

    简短的回答是否定的。您将不得不抛弃内核提供的所有其他内容,以确保您的代码获得 100% 的占空比。

    如果您想要保证垄断 CPU,您需要使用实时操作系统来禁用所有中断。类似于 FreeRTOS 或 VXWorks。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-28
      • 2013-11-22
      • 2014-06-01
      • 1970-01-01
      • 2010-10-10
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多