利用GNUplot图形化显示cyclictest的数据

前言


上次研究了下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

这里主要有个-h参数。意思是在运行后转储一个直方图,指定了100的参数,这将改变程序中histogram变量的值:

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]++;
}

在所有的测试跑完后,会执行print_hist(Line:1593-1611),将直方数据打印出来:

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

进入gnuplot控制符,键入命令

set ylabel "Times"   #次数       
set xlabel  "latency(microseconds)"  #误差数(微秒)

set logscale y  
plot "/home/stewart/rt-version" with lines, "/home/stewart/nor-version" with lines

就会跳出结果:

利用GNUplot图形化显示cyclictest的数据_第1张图片

其中,X轴代表误差,Y轴代表相对应误差x的出现次数,可见,rt-linux的误差稳定于30以内,而一般的linux大误差的次数则不少,相比看shell结果,这样直观很多~!

你可能感兴趣的:(利用GNUplot图形化显示cyclictest的数据)