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