为什么我的Linux应用每0.5秒就会停止一次?

我有一台闲置的16核
Linux机器.如果我运行一个简单的单线程C程序,它位于循环中,永远读取循环计数器(使用rdtsc指令),那么每0.5秒,我看到计时器值跳跃0.17 ms.换句话说,似乎每0.5秒我的应用程序停止0.17ms.我想了解为什么会发生这种情况以及我能做些什么.我知道Linux不是一个实时的操作系统.我只是想了解发生了什么,所以我可以充分利用Linux提供的功能.

我找到了别人用来测量这个问题的软件 – https://github.com/nokia/clocktick_jumps.它的结果与我自己的一致.

回答“告诉我们你要解决的具体问题”问题 – 我使用DPDK处理高速网络应用程序.每秒大约有6000万个数据包到达.我需要决定制作RX缓冲区的大小,并且有理由认为我选择的数字是合理的.这个问题的答案是这个难题的一部分.

我的代码看起来像这样:

// Build with gcc -O2 -Wall
#include <stdio.h>
#include <unistd.h>
#include <x86intrin.h>

int main() {
    // Bad way to learn frequency of cycle counter.
    unsigned long long t1 = __rdtsc();
    usleep(1000000);
    double millisecs_per_tick = 1e3 / (double)(__rdtsc() - t1);

    // Loop forever. Print message if any iteration takes unusually long.
    t1 = __rdtsc();
    while (1) {
        unsigned long long t2 = __rdtsc();
        double delta = t2 - t1;
        delta *= millisecs_per_tick;
        if (delta > 0.1) {
            printf("%4.2f - Delay of %.2f ms.\n", (double)t2 * millisecs_per_tick, delta);
        }
        t1 = t2;
    }

    return 0;
}

我正在使用Ubuntu 16.04,amd64.我的处理器是Intel Xeon X5672 @ 3.20GHz.

最佳答案 我希望你的系统正在安排另一个进程在同一个CPU上运行,你要么被替换,要么被移动到另一个核心,但会有一些时序损失.

您可以通过深入研究同时发生的内核事件来找到原因.例如systemtap或perf可以给你一些见解.我将从调度程序事件开始,首先消除该事件:https://github.com/jav/systemtap/blob/master/tapset/scheduler.stp

点赞