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

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

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

总结

以上是内存溢出为你收集整理的为什么我的Linux应用每0.5秒就会停止一次?全部内容,希望文章能够帮你解决为什么我的Linux应用每0.5秒就会停止一次?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1017369.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存