linux RT调度

时间:2014-02-04 08:57:34

标签: multithreading process scheduler rt

我们的产品运行的是linux 2.6.32,我们有一些定期运行的用户空间进程 - “保持活动 - 就像”进程。我们不对这些过程提出硬性要求 - 它们只需要在几秒钟内运行一次并刷新一些看门狗。

我们为这些进程提供了一个具有最高优先级的RR或FIFO调度类,然而,我们看到许多误报 - 似乎他们没有得到CPU几秒钟。 我觉得这很奇怪,因为我知道Linux虽然不是RT操作系统,但仍然可以产生非常好的性能(我看到人们谈论几毫秒的命令) - 我甚至无法让这个过程在5中运行一次秒

Linux RT调度程序的逻辑看起来很简单,所以我怀疑这些进程被其他东西阻止了 - I / O争用,中断或内核线程耗时太长 - 但现在我不太确定: 我写了一个非常基本的程序来模拟这样一个过程 - 它每1秒唤醒一次并测量自上次运行完成以来所花费的时间。据我所知,时间测量不包括对任何I / O的阻塞,因此此过程打印的结果反映了调度程序的行为:

#include <sched.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/param.h>
#include <time.h>

#define MICROSECONDSINASEC 1000000
#define MILLISECONDSINASEC 1000

int main()
{
    struct sched_param schedParam;
    struct timeval now, start;
    int spent_time = 0;
    time_t current_time;

    schedParam.sched_priority = sched_get_priority_max(SCHED_RR);
    int retVal = sched_setscheduler(0, SCHED_RR, &schedParam);
    if (retVal != 0)
    {
        printf("failed setting RT sched");
        return 0;
    }

    gettimeofday(&start, 0);
    start.tv_sec -= 1;
    start.tv_usec += MICROSECONDSINASEC;

    while(1)
    {
        sleep(1);
        gettimeofday(&now, 0);
        now.tv_sec -= 1;
        now.tv_usec += MICROSECONDSINASEC;
        spent_time = MILLISECONDSINASEC * (now.tv_sec - start.tv_sec) + ((now.tv_usec -       start.tv_usec) / MILLISECONDSINASEC);

        FILE *fl = fopen("output_log.txt", "aw");

        if (spent_time > 1100)
        {
            time(&current_time);
            fprintf(fl,"\n (%s) - had a gap of %d [msec] instead of 1000\n",                       ctime(&current_time), spent_time);
        }

        fclose(fl);
        gettimeofday(&start, 0);
    }

    return 0;
}

我在几台机器上运行这个过程 - 包括那些不运行我们产品的机器(只是普通的Linux),我仍然看到几秒钟的差距 - 尽管我确保进程DID得到优先权 - 我可以弄清楚为什么 - 从技术上讲,这个过程应该预先安排任何其他正在运行的进程,那么它如何等待这么长时间才能运行?

一些注意事项:

  1. 我主要在虚拟机上运行这些进程 - 因此可能会有来自虚拟机管理程序的干预。但在过去,我也在物理机器上看到了这种行为。
  2. 使流程RT确实大大改善了结果,但并未完全阻止问题。
  3. 除了Linux迁移和监视程序进程(我认为不会导致我的进程出现饥饿)之外,计算机上没有运行其他RT进程。
  4. 我该怎么办?我觉得我在这里缺少一些非常基本的东西。

    谢谢!

0 个答案:

没有答案