DPDKアプリ用アフィニティ設定API
PMD処理を行わせるための各種APIがDPDKには用意されている。 アフィニティ設定処理を隠蔽するための、便利APIもたくさん用意されていて、格好良いのだが、 「実際、コアをどう割り当てているの?」という疑問が残る。極端な例を上げると、
- 1つのコアで2つのPMDを1:2の割合で動かしたい(普通やらないけど)
などの変態動作をサポートできてない。
ということで、アフィニティ設定は自力でやることにした。以下がそのコード。すっきりした!
#define _GNU_SOURCE
void *affinity_thread(void *core){
//
// スレッドのアフィニティを設定して
cpu_set_t mask; // 実行可能なCPUをビットマスクで指定する
CPU_ZERO(&mask); // まずマスクを全部オフにして
CPU_SET(*(int*)core, &mask); // 実行するコア番号を指定
if(sched_setaffinity(0, sizeof(mask), &mask) == (-1)){ // アフィニティを設定
perror("setaffinity:");
exit(1);
}
// PMD処理を行う
int64_t i;
for(;;){
for(i = 1; i < 0x100000000; i++) ;
printf("zzz\n");
}
}
// 呼び出し側。PMDに#4のコアを割り当てた例
int core4 = 4;
ret = pthread_create(&thread1, NULL, affinity_thread, &core4);