6

OSはRHEL6(2.6.32)です。コアを分離し、その上で計算集約型のスレッドを実行しています。/proc/{thread-id}/status は、毎秒 1 つの非自発的コンテキスト スイッチを示します。

問題のスレッドは SCHED_NORMAL スレッドであり、これを変更したくありません。

この自発的でないコンテキスト切り替えの回数を減らすにはどうすればよいですか? これは、/proc/sys/kernel のスケジュール パラメータに依存しますか?

編集: いくつかの応答は、別のアプローチを示唆しています。そのルートに進む前に、まず、何時間も実行しているにもかかわらず、1 秒あたり 1 回の非自発的コンテキスト スイッチが発生する理由を理解したいと思います。たとえば、これは CFS が原因ですか? もしそうなら、どのパラメータとどのように?

EDIT2 : さらなる明確化 - 私が答えたい最初の質問は次のとおりです。

4

3 に答える 3

12

これは推測ですが、知識に基づいたものです - 分離された CPU を使用するため、スケジューラは、1 つの例外を除いて、自分自身のタスク以外のタスクをスケジュールしません - カーネルの vmstat コードには、それぞれに単一の作業キュー項目をスケジュールするタイマーがありますCPU は 1 秒に 1 回、メモリ使用量の統計を計算します。これは、毎秒スケジュールされているものです。

ワーク キュー コードは、コアが 100% アイドル状態の場合はワーク キュー カーネル スレッドをスケジュールしないように十分にスマートですが、単一のタスクを実行している場合はそうではありません。

これはftraceを使用して確認できます。sched_switch トレーサーが、1 秒ごとに 1 回程度切り替えるエンティティを示している場合 (値は最も近い jiffie イベントに丸められ、CPU がアイドル状態のときはタイマーがカウントされないため、タイミングが歪む可能性があります) は events/CPU_NUMBER タスクです。 (または古いカーネルの場合は keventd )、その原因は実際にvmstat_update関数がタイマーを設定して、イベントカーネルスレッドが実行するワークキューアイテムを毎秒キューに入れることであることがほぼ 100% です。

vmstat がタイマーを設定するサイクルは構成可能であることに注意してください。vm.stat_interval sysctlノブを介して他の値に設定できます。この値を大きくすると、メモリ使用統計の精度が低下しますが、このような中断の発生率が低くなります。

私は、隔離された CPU 作業負荷に対する中断のすべての原因を含む wiki を維持しています。CPU 上の単一のタスクが動的メモリを使用しない場合など、1 つの vmstat ワーク キューの実行と次の実行の間に変更がない場合、vmstat がワーク キュー アイテムをスケジュールしないようにするためのパッチも準備中です。割り当て。ただし、それがあなたに役立つかどうかはわかりません-それはあなたの仕事量に依存します.

于 2013-01-02T19:27:03.607 に答える
0

コード自体を最適化して、CPU で実行しているときに最大限に活用することを強くお勧めします。
とにかく、これがうまくいくかどうかはわかりませんが、とにかく試してみて、私たちに知らせてください:

基本的に行うことは、スケジューリング ポリシーを FIFO に設定し、プロセスに可能な限りの優先度を与えることです。

#include<sched.h>
struct sched_param sp = sched_get_priority_max(SCHED_FIFO);
int ret;

ret = sched_setscheduler(0, SCHED_FIFO, &sp);
if (ret == -1) {
  perror("sched_setscheduler");
  return 1;
}

プロセスが行うブロッキング ステートメントは、スケジューラが CPU から解放される可能性が最も高いことに注意してください。

ソース
Man page
編集:申し訳ありませんが、タグ
に気付きました。pthreadこの概念は今でも保持されているので、このマニュアル ページをチェックしてください: http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_setschedparam.3.html

于 2012-12-26T08:13:44.030 に答える
0

専用 CPU で 1 秒あたり 1 回の割り込みが多すぎる場合は、通常のスケジューラをまったく使用しないでください。通常のプリエンプティブ メカニズムよりも確実にプロセスをスケジュールしたままにできる、リアルタイムおよびアイソクロナスの優先度レベルを提案してもよろしいですか?

于 2012-12-26T09:39:55.790 に答える