Multithreading linux RT调度
我们的产品运行的是Linux2.6.32,并且我们有一些定期运行的用户空间进程——“保持活动状态”进程。我们不会对这些进程提出严格的要求——它们只需要在几秒钟内运行一次并刷新一些看门狗 我们给这些进程分配了一个具有最大优先级的RR或FIFO调度类,然而,我们看到了许多误报——它们似乎在几秒钟内都没有得到CPU。 我觉得这很奇怪,因为我知道Linux虽然不是RT操作系统,但仍然可以产生非常好的性能(我看到人们谈论的是几毫秒的顺序),而且我甚至不能让进程每5秒运行一次 Linux RT scheduler的逻辑似乎非常直截了当和简单,因此我怀疑这些进程会被其他东西阻塞—I/O争用、中断或内核线程占用的时间太长—但现在我不太确定: 我编写了一个非常基本的程序来模拟这样一个过程——它每1秒唤醒一次,并测量自上次完成运行以来所花费的时间。据我所知,时间度量不包括对任何I/O的阻塞,因此此进程打印的结果反映了调度程序的行为:Multithreading linux RT调度,multithreading,process,scheduler,rt,Multithreading,Process,Scheduler,Rt,我们的产品运行的是Linux2.6.32,并且我们有一些定期运行的用户空间进程——“保持活动状态”进程。我们不会对这些进程提出严格的要求——它们只需要在几秒钟内运行一次并刷新一些看门狗 我们给这些进程分配了一个具有最大优先级的RR或FIFO调度类,然而,我们看到了许多误报——它们似乎在几秒钟内都没有得到CPU。 我觉得这很奇怪,因为我知道Linux虽然不是RT操作系统,但仍然可以产生非常好的性能(我看到人们谈论的是几毫秒的顺序),而且我甚至不能让进程每5秒运行一次 Linux RT schedu
#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;
}
#包括
#包括
#包括
#包括
#包括
#定义微秒数纳秒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),我仍然看到了几秒钟的间隔,尽管我确保这个过程得到了优先权——我不知道为什么——从技术上讲,这个过程应该优先于任何其他正在运行的进程,那么,它怎么能等这么久才能运行呢
请注意:
谢谢 嗯,虽然时间测量可能不包括阻塞任何I/O,但文件操作会。您正在写入一个几乎已满的SSD?此外,即使您不写入任何内容,为什么还要打开和关闭日志文件?您好,感谢您的回复。我正在做文件操作,但它们不计入测量值。关于开始和结束-你当然是对的,只是最初有更多的代码在任何情况下做了一些事情(我删除了这些代码)。不,我没有使用SSD。