Oh, nice packet

slankdevの報告

Thread Affinityによる性能実験

雑記状態なので、この記事もとても汚いことを了承してください。

DPDKはpthreadwを用いてスレッド操作を行っている。 内部でset affinityを行い、複数のCPUでスレッドを共有しないように固定している らしいが、実際に複数CPUで共有実行を行った場合と、単一CPUで動作をおこなった場合 どの程度性能に差がでるのかを検証してみた。

比較対象, 評価方法

比較対象

  • 単一CPUで固定して動作させるthread
  • 固定しないで動作させたthread

評価方法

  • thread遅延 (無限loopの一回の遅延[clock])

ソースコード

#include <slankdev/system.h>
#include <slankdev/cpuset.h>
#include <slankdev/thread.h>


uint64_t func(int loop_count, bool setaffinity_1core)
{
  if (setaffinity_1core) {
    slankdev::cpuset cpuset(0x2);
    slankdev::thread_self th;
    th.setaffinity_np(sizeof(cpu_set_t), cpuset.get_native());
  }

  uint64_t before = slankdev::rdtsc();
  for (size_t i=0; i<loop_count; i++) ;
  uint64_t latency = slankdev::rdtsc() - before;
  return latency;
}


int main()
{
  for (size_t i=0; i<10; i++) {
    printf("test%zd\n", i);
    uint64_t affinity_true  = func(1000000000, true);
    uint64_t affinity_false = func(1000000000, false);
    printf("+ affinity true : %lu \n", affinity_true );
    printf("+ affinity false: %lu \n", affinity_false);
  }
}

実験結果

以下に示す

test0
+ affinity true : 4681434790
+ affinity false: 4634806268
test1
+ affinity true : 4637598020
+ affinity false: 4663916764
test2
+ affinity true : 4591219566
+ affinity false: 4599745108
test3
+ affinity true : 4612664322
+ affinity false: 4619733254
test4
+ affinity true : 4570637696
+ affinity false: 4547641394
test5
+ affinity true : 4606940932
+ affinity false: 4582990918
test6
+ affinity true : 4576054526
+ affinity false: 4612506292
test7
+ affinity true : 4552900718
+ affinity false: 4551479516
test8
+ affinity true : 4559223794
+ affinity false: 4556642934
test9
+ affinity true : 4600009958
+ affinity false: 4597938462

空のループなので、とくに性能の変化は大きくは見えなかった。 メモリアクセスとかいろいろやったらもしかしたら変わるかもしれないので、 今後少しずつ結果を伸ばしていきたい.