2016-07-23 36 views
1

我想比較兩個linux內核版本之間的調度延遲。以下是我迄今爲止嘗試:如何測量Linux內核中的調度延遲?

  1. 配置的Ftrace在跟蹤打開了SCHED事件內核
  2. 兩者。
  3. 啓用喚醒示蹤器。

但是,喚醒只顯示最高優先級進程的結果,而不是我的c程序。我嘗試使用很好,並從跟蹤中捕獲它。它仍然顯示其他同樣高的過程的日誌。我是否錯過了其他一些步驟來捕獲我的過程日誌?有沒有更好的方法,通過修改我的程序的源代碼而不是在啓動時使用nice來將我的進程的優先級設置爲最高?

我試過的下一步是禁用喚醒跟蹤器並啓用sched事件。我得到的日誌看起來是這樣的

0 1dNh3 3us+: sched wakeup : task hald : 1952 [120] success=1 

−0 1d..3 7us! : sched switch : task swapper : 0 [140] (R) ==> 
hald : 1952 [120] 

+!顯示延遲(簡稱ftrace的內核文檔知道號碼)。這是否意味着調度喚醒的延遲時間爲'+',並且調度了女巫'!'微秒分別?

還有其他比較linux調度延遲的方法嗎?

回答

1
  • 設置優先級:setpriority()系統調用或多或少與nice命令相同;在這兩種情況下,只允許root用戶增加prio。
  • 至於測量,我寫了下面這個簡單的程序(公有領域,風險自負),它有兩個進程互相發送短管道信息$ 1 * 1024次。它不會給出「調度延遲「,但我認爲這是比較有用的。 (它打印1024 * $ 1只爲健全檢查15 * $ 1,用 「時間」 來衡量時間& CPU使用率運行。)

代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main2() { 
    int a; 
    while(1) { 
      if (read(0, &a, 4)!=4) exit(1); 
      if (a==-1) exit(0); 
      write(1,"01"+(!(a&63) && (a&1023)),1); 
    }} 

int main(int ac, char** av) { 
    int i,j,k = (ac>1 ? atoi(av[1]) : 10) << 10; 
    int pipe0[2], pipe1[2]; 
    pipe(pipe0); pipe(pipe1); 
    int pid = fork(); switch(pid) { 
      case -1: perror("fork"); return 1; 
      case 0: 
        close(0); dup2(pipe1[0], 0); 
        close(1); dup2(pipe0[1], 1); 
        return main2(); 
      default: break; 
    } 
    int sum = 0; char c; 
    for (i=0; i<k; i++) { 
      write(pipe1[1], &i, 4); 
      read(pipe0[0], &c, 1); sum += c&1; 
    } 
    i=-1; write(pipe1[1], &i, 4); 
    printf("%d %d\n", k, sum); 
}