我有一台闲置的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。
答案 0 :(得分:1)
我希望您的系统正在安排另一个进程在同一CPU上运行,并且您被替换或转移到另一个内核上,但要花一些时间。
您可以通过挖掘同时发生的内核事件来找到原因。例如,systemtap
或perf
可以为您提供一些见识。我将首先从调度程序事件中消除该事件:https://github.com/jav/systemtap/blob/master/tapset/scheduler.stp