2016-04-13 6 views
9

希望の動作:isolcpusを使用して隔離されたコアのセットでマルチスレッドLinuxプログラムを実行します。私はコンパイルしていない孤立CPUを搭載したカーネルでこれを実行すると、スレッドは、私の4つのCPUに広がっているタスクセットを使用して、複数の独立したコアでマルチスレッドLinuxプログラムを実行すると、すべてのスレッドが1つのコアで実行されるのはなぜですか?

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

#define NTHR 16 
#define TIME 60 * 5 

void * 
do_stuff(void *arg) 
{ 
    int i = 0; 

    (void) arg; 
    while (1) { 
     i += i; 
     usleep(10000); /* dont dominate CPU */ 
    } 
} 

int 
main(void) 
{ 
    pthread_t threads[NTHR]; 
    int  rv, i; 

    for (i = 0; i < NTHR; i++) { 
     rv = pthread_create(&threads[i], NULL, do_stuff, NULL); 
     if (rv) { 
      perror("pthread_create"); 
      return (EXIT_FAILURE); 
     } 
    } 
    sleep(TIME); 
    exit(EXIT_SUCCESS); 
} 

:ここ

は、我々は一例マルチスレッドプログラムとして使用することができます小さなプログラムです。良い!デフォルトのアフィニティ・マスクは、現在のコア2と3を除くとタスクセットせずにプログラムを実行する

  • これが予想され、コア0と1上のスレッドを配布:今、私はカーネルコマンドラインと、再起動にisolcpus=2,3を追加する場合

  • taskset -c 0,1で実行しても同じ効果があります。良い。
  • taskset -c 2,3で実行すると、すべてのスレッドが同じコア(コア2またはコア3)に移動します。これは望ましくない。スレッドはコア2と3を介して配布する必要があります。右か?

This post(与えられた例では、遠くのpthread APIからであるが)、同様の問題が記載されています。 OPは、別のスケジューラを使用することでこれを回避することができました。私はこれが私のユースケースには理想的だとは確信していません。

デフォルトのスケジューラを使用して、分離されたコアにスレッドを分散させる方法はありますか?

報告する必要があるカーネルのバグですか?

EDIT

あなたはFIFOスケジューラのようなリアルタイムのスケジューラを使用している場合は、正しいことが確かに起こるん。詳細については、man schedおよびman chrtを参照してください。 Linuxのカーネル・パラメータのDocから

+0

個人的には、このような動作は期待できませんでした。 LKMLに電子メールを送って、デフォルトのスケジューラが 'taskset'によって割り当てられた独立したコア間で移行できない理由を確認してください。 – Claudio

答えて

3

このオプションは 一般的なSMP分散とスケジューリングアルゴリズムから隔離するために、1つの以上のCPUを指定するために使用することができます。

このオプションは、スケジューラが1つのコアから別のコアに移行するのを効果的に防止します(SMPバランシング)。典型的なisolcpusはpthreadアフィニティ制御とともに使用され、予測可能なパフォーマンスを得るためにCPUレイアウトの知識を持つスレッドをピン止めします。あなたが混乱している理由を

https://www.kernel.org/doc/Documentation/kernel-parameters.txt

--Edit--

は、[OK]を私は見ます。個人的には、私はこのオプションで一貫した振る舞いをとるでしょう。問題はselect_task_rq_fairとselect_task_rq_rtの2つの関数にあります。これは新しいrun_queueを選択する責任があります(基本的にはどのnext_cpuを実行するかを選択しています)。私は両方の関数の迅速なトレース(Systemtap)を行いました.CFSの場合、常にマスクの最初のコアが返されます。 RTでは、他のコアを返します。私は各選択アルゴリズムのロジックを調べる機会はありませんでしたが、Linux develメーリングリストのメンテナにEメールを送信して修正することができます。

+0

OKですが、孤立したコアに強制したときにスレッドが広がり、リアルタイムスケジューラ(たとえばfifo)がデフォルトスケジューラの代わりに使用される理由はわかりません。 –

+0

@EddBarrett Linuxカーネル内の正確な実装を得るために、デフォルトおよびRTスケジューラで 'isolcpus'パラメータがどのように解釈されるのかを追跡します。より最近のバージョンのLinuxカーネルでは 'sched.c'対' sched_rt.c'(旧バージョン用)、 'sched/core.c'と' sched/rt.c'となります。 – TheCodeArtist

+0

編集していただきありがとうございます。 –

関連する問題