我想用perf工具解释一下程序的有趣行为。
一些背景信息
我的机器有4个NUMA节点,我的主应用程序正在机器上运行。使用cpusets我正在对机器进行分区,为应用程序提供3个节点,为系统提供1个节点。在同一台机器上运行unittest(用于记录改进)时,我会遇到意想不到的行为,我正在尝试使用perf工具进行调查。
意外行为是在运行应用程序的NUMA节点上(比如说node2),我的单位测试得到了更多的时间,大约是单元测试运行时的两倍。在具有系统的NUMA节点上(假设为node3)。它看起来像在node2的CPU上运行(一个没有自旋锁的cpu)我得到的结果比在另一个numa上运行更好。
我正在尝试改进我的日志记录系统,因此测试正在进行的工作也是由应用程序完成的,将一些日志消息写入队列以便以后转储到磁盘(不同的线程)。争用队列由自旋锁(CAS)控制。 unitest是一个写入线程,它有2个循环:100次,1000个日志写入队列,RDTSC(我的选择)用于测量每个内部循环,然后打印统计信息。队列足够大,我得到标准偏差,内存操作减少到最小(没有memcpy)。读者正在另一个线程上转储到磁盘上。
我尝试停止我的应用程序并再次运行测试。我在这种情况下看到,无论选择运行我的测试的NUMA节点,我得到的结果与在node3上运行的结果相似(慢),这意味着正在运行的应用程序正在加速我的测试,如果我在同一个numa上运行我的测试应用程序运行的节点。对我来说非常不直观。
使用以下perf工具命令获取一些数据
rm /tmp/a; rm /tmp/ats; for f in $(perf list | tr -s ' ' | cut -d' ' -f 2 ); do perf stat -o /tmp/ats --append -e $f taskset -c $(cat /sys/devices/system/node/node2/cpulist) ./bin/testCore >> /tmp/a 2>&1;perf stat -o /tmp/ats --append -e $f taskset -c $(cat /sys/devices/system/node/node3/cpulist) ./bin/testCore >> /tmp/a 2>&1;done
并使用命令进行分析
cat /tmp/ats | grep -v "#" | grep -v "^ *$" | grep -v "seconds time elapsed\|Performance\|supported" | grep -v " 0 " | tr -s ' ' | tr -d ',' | awk '{if(knownEvent[$2]){if(((knownEvent[$2]/$1)<0.95) || ((knownEvent[$2]/$1)>1.05)){printf "diff:%s %.2f(%d/%d)\n",$2,(knownEvent[$2]/$1),knownEvent[$2],$1}}else{knownEvent[$2]=$1}}'| more
diff:branch-misses 1.08(470184/435284)
diff:bus-cycles 0.70(25570333/36774093)
diff:cpu-clock 0.69(191/276)
diff:L1-dcache-prefetch-misses 1.05(624172/593780)
diff:LLC-loads 0.92(665199/720197)
diff:LLC-load-misses 1.16(217684/187823)
diff:LLC-prefetches 0.87(193398/222148)
diff:LLC-prefetch-misses 0.85(98653/115483)
diff:dTLB-load-misses 1.09(195668/180291)
diff:dTLB-store-misses 1.11(39755/35910)
diff:scsi:scsi_dispatch_cmd_start 1.38(11/8)
diff:block:block_rq_insert 0.58(36/62)
diff:block:block_rq_issue 1.50(12/8)
diff:block:block_bio_backmerge 1.05(683/650)
diff:block:block_getrq 0.57(36/63)
diff:block:block_plug 0.52(26/50)
diff:kmem:mm_pagevec_free 1.06(16853/15838)
diff:kmem:mm_kernel_pagefault 0.88(7/8)
diff:timer:timer_start 0.36(21/59)
diff:timer:timer_expire_entry 3.00(3/1)
diff:timer:timer_expire_exit 2.00(2/1)
diff:timer:timer_cancel 1.60(8/5)
diff:timer:hrtimer_start 0.93(1275/1368)
diff:timer:hrtimer_expire_entry 0.72(186/259)
diff:timer:hrtimer_expire_exit 0.69(182/264)
diff:timer:hrtimer_cancel 0.74(192/259)
diff:irq:softirq_entry 0.64(374/585)
diff:irq:softirq_exit 0.74(394/536)
diff:irq:softirq_raise 0.73(390/531)
diff:sched:sched_wakeup 0.75(3/4)
diff:sched:sched_stat_wait 0.50(1/2)
diff:sched:sched_stat_sleep 2.00(2/1)
diff:sched:sched_stat_runtime 0.93(1284/1379)
我提取了我看到的含有一些差异的那些。 不确定我是否应该怀疑sched-,LLC-,branch-,TLB,因为我不知道相对差异是否表明了我所看到的行为。
有什么建议可以更好地调查此事吗?