前言
上次研究了下cyclictest的源码以及它的基本应用,地址如下:
http://blog.csdn.net/sakaue/article/details/17843761
结果虽然出来了,但是观察数字终究不够直观,GNUplot可以配合cyclictest提供图形化表示,对评估rt-linux的性能很有意义
正文
安装:
sudo apt-get install gnuplot
进入3.2.0-23-generic内核,执行:
sudo cyclictest -p 90 - m -c 0 -i 200 -n -h 100 -q -l 1000000 | tee ~/nor-version
进入3.4.72-rt89内核,同样执行上述命令,保存结果名为rt-version
sudo cyclictest -p 90 - m -c 0 -i 200 -n -h 100 -q -l 1000000 | tee ~/rt-version
case 'h': case OPT_HISTOGRAM: histogram = atoi(optarg); break;
我们设置histogram,就是设置一个可接受的最高误差值,每个线程的迭代中如果获取的误差值小于这个histogram,那么就计入数组stat->hist_array(Line:913-921),而下标就是误差值diff,值是这个误差值出现的次数(diff -> 该diff出现的次数):
if (histogram) { if (diff >= histogram) { stat->hist_overflow++; if (stat->num_outliers < histogram) stat->outliers[stat->num_outliers++] = stat->cycles; } else stat->hist_array[diff]++; }
printf("# Histogram\n"); for (i = 0; i < histogram; i++) { //误差在histogram(此处100)以内的误差(0-histogram)柱状图 unsigned long long int allthreads = 0; printf("%06d ", i); for (j = 0; j < nthreads; j++) { unsigned long curr_latency=par[j]->stats->hist_array[i]; // printf("%06lu", curr_latency); if (j < nthreads - 1) printf("\t"); log_entries[j] += curr_latency; allthreads += curr_latency; } if (histofall && nthreads > 1) { // histofall = 0 printf("\t%06llu", allthreads); log_entries[nthreads] += allthreads; } printf("\n"); }
原理大致介绍到此,现在我们有两个结果文件nor-version和rt-version,在终端下执行:
gnuplot
set ylabel "Times" #次数 set xlabel "latency(microseconds)" #误差数(微秒) set logscale y plot "/home/stewart/rt-version" with lines, "/home/stewart/nor-version" with lines
其中,X轴代表误差,Y轴代表相对应误差x的出现次数,可见,rt-linux的误差稳定于30以内,而一般的linux大误差的次数则不少,相比看shell结果,这样直观很多~!