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

时间:2018-08-28 09:45:19

标签: c linux

我有一台闲置的16核Linux机器。如果我运行一个普通的单线程C程序,该程序位于循环中(使用rdtsc指令)永远读取循环计数器,那么每0.5秒,我就会看到定时器值跳了0.17 ms。换句话说,似乎每隔0.5秒,我的应用程序就会停止运行0.17毫秒。我想了解为什么会发生这种情况以及对此我该怎么办。我了解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上运行。我的处理器是3.20GHz的Intel Xeon X5672。

1 个答案:

答案 0 :(得分:1)

我希望您的系统正在安排另一个进程在同一CPU上运行,并且您被替换或转移到另一个内核上,但要花一些时间。

您可以通过挖掘同时发生的内核事件来找到原因。例如,systemtapperf可以为您提供一些见识。我将首先从调度程序事件中消除该事件:https://github.com/jav/systemtap/blob/master/tapset/scheduler.stp