当SCHED_OTHER线程增加时,RT线程运行得更慢

时间:2018-03-31 14:34:36

标签: linux linux-kernel real-time scheduler

我测试了一个程序,以计算a中的计算时间 机器有48个intel cpu核心。

1)运行./test时,输出如下:

MM: 324.039000 ms
MM: 324.052000 ms
MM: 324.079000 ms
MM: 324.042000 ms
MM: 324.060000 ms
MM: 324.052000 ms
MM: 324.026000 ms
MM: 324.040000 ms
MM: 324.075000 ms
MM: 324.011000 ms
MM: 324.072000 ms

2)运行其他程序,例如示例代码2

./aa &
./aa &
....
about 30 times

3)./ test输出更改:

MM: 354.601000 ms
MM: 322.289000 ms
MM: 322.250000 ms
MM: 322.348000 ms
MM: 354.700000 ms
MM: 322.556000 ms
MM: 354.834000 ms
MM: 354.816000 ms
MM: 354.777000 ms
MM: 354.812000 ms
MM: 322.451000 ms
MM: 322.507000 ms
MM: 322.473000 ms

4)为了减少计算成本时间,我尝试过:

  1. 将测试政策设为SCHED_RR / SCHED_FIFO,优先级为50/98 chrt -f -p 98 5911
  2. 将测试绑定到特定的cpu taskset -pc 4 5911
  3. 将流程限制为其他cpus for i in $(ps -ef |grep aa|awk '{print $2}'); do echo $i; taskset -pc 5-47 $i; done
  4. 它仍然不起作用,结果不好。

    MM: 322.316000 ms
    MM: 322.307000 ms
    MM: 326.739000 ms
    MM: 354.399000 ms
    MM: 354.662000 ms
    MM: 354.740000 ms
    MM: 322.275000 ms
    
    1. 但是当将一个进程限制为一个小的cpuset时,它可以正常工作for i in $(ps -ef |grep aa|awk '{print $2}'); do echo $i; taskset -pc 5-7 $i; done
    2. 结果:

      MM: 322.304000 ms
      MM: 322.335000 ms
      MM: 322.344000 ms
      MM: 322.319000 ms
      MM: 322.340000 ms
      MM: 322.328000 ms
      MM: 322.298000 ms
      MM: 322.318000 ms
      

      为什么这种低优先级进程会影响实时性,这真是太神奇了 过程,请帮帮我!

      示例测试代码1:

      #include <stdio.h>
      #include <sys/time.h>
      
      void calc() {
          int c, d, k;
          int m = 100000, q = 1, p = 1000;
          int sum;
          for (c = 0; c < m; c++) {
              for (d = 0; d < q; d++) {
                  for (k = 0; k < p; k++) {
                       sum = c * m * d * q * p * k;
                  }
              }
      
          }
      }
      
      int main() {
          struct timeval t1, t2;
          double elapsedTime;
      
          while(1) {
              gettimeofday(&t1, NULL);
              calc();
              gettimeofday(&t2, NULL);
              elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;      // sec to ms
              elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0;   // us to ms
              printf("MM: %lf ms\n", elapsedTime);
              sleep(1);
          }
      }
      

      示例代码2:

      #include <stdio.h>
      
      int main() {
          while(1) {
          }
      }
      

0 个答案:

没有答案