我们的产品运行的是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(¤t_time);
fprintf(fl,"\n (%s) - had a gap of %d [msec] instead of 1000\n", ctime(¤t_time), spent_time);
}
fclose(fl);
gettimeofday(&start, 0);
}
return 0;
}
我在几台机器上运行这个过程 - 包括那些不运行我们产品的机器(只是普通的Linux),我仍然看到几秒钟的差距 - 尽管我确保进程DID得到优先权 - 我可以弄清楚为什么 - 从技术上讲,这个过程应该预先安排任何其他正在运行的进程,那么它如何等待这么长时间才能运行?
一些注意事项:
我该怎么办?我觉得我在这里缺少一些非常基本的东西。
谢谢!