Multithreading linux RT调度

Multithreading linux RT调度,multithreading,process,scheduler,rt,Multithreading,Process,Scheduler,Rt,我们的产品运行的是Linux2.6.32,并且我们有一些定期运行的用户空间进程——“保持活动状态”进程。我们不会对这些进程提出严格的要求——它们只需要在几秒钟内运行一次并刷新一些看门狗 我们给这些进程分配了一个具有最大优先级的RR或FIFO调度类,然而,我们看到了许多误报——它们似乎在几秒钟内都没有得到CPU。 我觉得这很奇怪,因为我知道Linux虽然不是RT操作系统,但仍然可以产生非常好的性能(我看到人们谈论的是几毫秒的顺序),而且我甚至不能让进程每5秒运行一次 Linux RT schedu

我们的产品运行的是Linux2.6.32,并且我们有一些定期运行的用户空间进程——“保持活动状态”进程。我们不会对这些进程提出严格的要求——它们只需要在几秒钟内运行一次并刷新一些看门狗

我们给这些进程分配了一个具有最大优先级的RR或FIFO调度类,然而,我们看到了许多误报——它们似乎在几秒钟内都没有得到CPU。 我觉得这很奇怪,因为我知道Linux虽然不是RT操作系统,但仍然可以产生非常好的性能(我看到人们谈论的是几毫秒的顺序),而且我甚至不能让进程每5秒运行一次

Linux RT scheduler的逻辑似乎非常直截了当和简单,因此我怀疑这些进程会被其他东西阻塞—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;
}
#包括
#包括
#包括
#包括
#包括
#定义微秒数纳秒1000000
#定义毫秒ASEC 1000
int main()
{
结构sched_参数schedParam;
struct timeval现在,开始;
int花费的时间=0;
时间t当前时间;
schedParam.sched_priority=sched_get_priority_max(sched_RR);
int retVal=sched_setscheduler(0、sched_RR和schedParam);
如果(返回值!=0)
{
printf(“设置RT sched失败”);
返回0;
}
gettimeofday(&start,0);
start.tv_sec-=1;
start.tv_usec+=微秒每秒;
而(1)
{
睡眠(1);
gettimeofday(&now,0);
now.tv_sec-=1;
now.tv_usec+=微秒纳秒;
花费的时间=毫秒sinasec*(now.tv_sec-start.tv_sec)+(now.tv_usec-start.tv_usec)/毫秒sinasec);
FILE*fl=fopen(“output_log.txt”、“aw”);
如果(花费的时间>1100)
{
时间(&当前时间);
fprintf(fl,“\n(%s)-间隙为%d[msec],而不是1000\n”,ctime(&当前时间),已用时间);
}
fclose(fl);
gettimeofday(&start,0);
}
返回0;
}
我在几台机器上运行了这个过程一夜,包括那些不运行我们产品的机器(只是普通Linux),我仍然看到了几秒钟的间隔,尽管我确保这个过程得到了优先权——我不知道为什么——从技术上讲,这个过程应该优先于任何其他正在运行的进程,那么,它怎么能等这么久才能运行呢

请注意:

  • 我主要在虚拟机上运行这些进程,因此可能会有来自虚拟机监控程序的干预。但在过去,我也在物理机器上看到过这种行为
  • 使过程RT确实大大改善了结果,但并没有完全防止问题的发生
  • 除了Linux迁移和看门狗进程(我不认为这会导致进程饥饿)之外,机器上没有其他RT进程运行
  • 我能做什么?我觉得我错过了一些基本的东西


    谢谢

    嗯,虽然时间测量可能不包括阻塞任何I/O,但文件操作会。您正在写入一个几乎已满的SSD?此外,即使您不写入任何内容,为什么还要打开和关闭日志文件?您好,感谢您的回复。我正在做文件操作,但它们不计入测量值。关于开始和结束-你当然是对的,只是最初有更多的代码在任何情况下做了一些事情(我删除了这些代码)。不,我没有使用SSD。