1

2 つの Linux カーネル バージョン間のスケジューリング レイテンシを比較したいと考えています。これが私がこれまでに試したことです:

  1. 両方のカーネルで構成された Ftrace
  2. トレースでスケジュールされたイベントをオンにしました。
  3. ウェイクアップ トレーサーを有効にしました。

ただし、ウェイクアップは、私のCプログラムではなく、最も優先度の高いプロセスの結果のみを示しています。nice を使ってトレースからキャプチャしてみました。それでも、他の同等に高いプロセスのログが表示されます。プロセスのログを取得するために、ここで他の手順が欠落していますか? プログラムの起動時に 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 カーネルのドキュメントを参照してください)。sched wakeup には「+」と sched witch の「!」のレイテンシがあるということですか。それぞれマイクロ秒?

Linux のスケジューリング レイテンシを比較する他の方法はありますか?

4

1 に答える 1

1
  • 優先順位の設定: setpriority() システムコールは、nice コマンドとほぼ同じことを行います。どちらの場合も、prio の増加はルートに対してのみ許可されます。
  • 測定に関しては、短いパイプ メッセージを互いに $1*1024 回送信する 2 つのプロセスを持つ次の簡単なプログラム (パブリック ドメイン、自己責任で使用) を作成しました。比較に便利だと思います。(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);
}
于 2016-07-23T10:26:56.353 に答える