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);