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