mkgraphs.pl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:10k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #!/usr/bin/perl
  2. $stem = shift; # the base name of the trace files to use, right now its 'high-speed'
  3. print "$stem";
  4. $source = shift || 0;
  5. $numsources = $source;
  6. $source = "$source.0" unless $source =~ /./;
  7. ($type = $stem ) =~ s/^(.)/U$1u/; # hackery to label graphs
  8. #number of cross-traffic sources
  9. $numcsources = shift;
  10. print "numcsrouces = $numcsources";
  11. # protocol being used
  12. $tcp_type = shift;
  13. # These are the temporary files that will be generated to be read by gnuplot.
  14. # These files can all be deleted at the end of the script.
  15. # To delete use the unlink command at the end.
  16. $queue_data = "qd";
  17. $drop_data = "drop";
  18. $cwnd_data = "cwnd";
  19. $seqno_data = "seqno";
  20. $fairness_data = "fairness";
  21. $fair_alloc = "fairalloc";
  22. $util_data = "util";
  23. # Used to plot the link utilization graph
  24. $time_int = 1.0000;
  25. $bandwidth = 10000000;
  26. $pktsize = 1040;
  27. #for gnuplot
  28. $graphtype = "($numsources $tcp_type  sources, with $numcsources crosstraffic flows )";
  29. # Open the queue trace for reading and traces for writing queue length,
  30. # sequence number dequeued and dropped seqnos.  N. B. any of these failing will
  31. # terminate the script with an error message.
  32. #open(QT, "$stem.queue1") || die "Can't open $stem.queue1: $!n";
  33. #open(QD, ">$queue_data")  || die "can't open $queue_data :$!n";
  34. #open(DD, ">$drop_data")  || die "can't open $drop_data :$!n";
  35. #open(UT, ">$util_data") || die "cant open $util_data";
  36. # parse the trace file.  The regexp comments the names of the fields, which are
  37. # described in the everything.ps document.
  38. #while (<QT>) {
  39. #    chomp;
  40. #    /(.)s+ # operation
  41. #     ([\.d]+)s+ # time
  42. #     (d+)s+ # from node
  43. #     (d+)s+ # to node
  44. #     (w+)s+ # protocol
  45. #     (d+)s+ # size
  46. #     ([w+-]+)s+ # flags
  47. #     (d+)s+ # flow id
  48. #     (d+.d+)s+ # from addr (src.port)
  49. #     (d+.d+)s+ # to addr (src.port)
  50. #     (d+)s+ # seqno
  51. #     (d+) # ns id
  52. #     /x && do {
  53. # ($op, $t, $n1, $n2, $p, $sz, $fl, $fid, $src, $dst, $seqno, $nsid) =
  54. #     ($1, $2, $3, $4, $5, $6 ,$7, $8, $9, $10, $11, $12);
  55. # this keeps a running queue length in $q.  That length is output to
  56. # the $queue_data file on every dequeue or drop - note that this may
  57. # show drops occurring before undropped packets are dequeued.
  58. #
  59. # If the dequeue/drop is from source 0, a record is output to either
  60. # the sequence number or drop file.
  61. # if ($op eq '+' ) { $q ++; }
  62. # elsif ($op eq '-' ) { 
  63. #     $q--;
  64. #     print QD "$t $qn"; 
  65. #     #print SD "$t $seqnon" if $src eq $source;
  66. # }
  67. # elsif ($op eq 'd' ) { 
  68. #     $q--; 
  69. #     print QD "$t $qn";
  70. #     #print(DD "$t $seqnon") && $sawdrop++ if $src eq $source;
  71. #     print (DD "$t $seqnon") && $sawdrop++;
  72. # }
  73. #checks for packets send out. Used to calculate link utilization.
  74. # if ($op eq '-') { 
  75. # if($t <= $time_int) {
  76. # $packets_seen++;
  77. # }
  78. # else {
  79. # $temp = ($packets_seen) / ( ($bandwidth/(8*$pktsize)) );
  80. # $temp = $temp * 100;
  81. # print UT "$time_int $tempn";
  82. # $temp = 0;
  83. # $packets_seen = 1;
  84. # $time_int = $time_int + 1.0;
  85. # }
  86. #     }
  87. # next;
  88. #    };
  89.     # if the trace is corrupt or there's a valid value that the regexp doesn't
  90.     # catch, this error message will come out.
  91. #    printf STDERR "unmatched in line $.: $_n";
  92. #}
  93. # put a dummy drop out if no drops have been seen or gnuplot will fail.
  94. #print DD "0 0n" unless $sawdrop;
  95. # Close up these files.
  96. #close(QL);
  97. #close(QD);
  98. #close(DD);
  99. #close(UT);
  100. # CWND processing.  Same ideas, different file.
  101. print "Calculating cwnd and seqno for each sourcen";
  102. for ($i=1; $i <= $numsources ; $i++) {
  103. printf "Opening: $stem.tcp_trace.$in";
  104. open(CWND, "$stem.tcp_trace.$i") || die "Can't open $stem.tcp_trace.$i: $!n";
  105. printf "Opening: $cwnd_data$in";
  106. open(CD, ">$cwnd_data$i")  || die "can't open $cwnd_data$i :$!n";
  107. printf "Opening: $seqno_data$in";
  108. open(SD, ">$seqno_data$i")  || die "can't open $seqno_data$i :$!n";
  109. # This loop is more straightforward.  I ignore everything but the time and cwnd
  110. # and print them.
  111. while (<CWND>) {
  112.      chomp;
  113.      /(d*.d+)s+  # time
  114.       (d+)s+ # dontcare
  115.       (d+)s+ # dontcare
  116.       (d+)s+ # dontcare
  117.       (d+)s+ # dontcare
  118.       (w+)s+ # variable we are tracing (cwnd or seqno)
  119.       (d+) # value
  120.       /x && do {
  121. ($t, $n1, $n2, $p, $sz, $var, $value) =
  122.     ($1, $2, $3, $4, $5, $6, $7);
  123. if ($var eq 'cwnd_' ) {
  124.     print CD "$t $valuen";
  125. }
  126. if ($var eq 't_seqno_' ) {
  127.     print SD "$t $valuen";
  128. }
  129.      }
  130. }
  131. close(CWND);
  132. close(SD);
  133. close(CD);
  134. }
  135. ##################### THIS IS FOR PLOTTING FAIRNESS GRAPH
  136. # This says after what time should the calculation for Fairness should start
  137. $startTime = shift;
  138. print "starttime = $startTime n";
  139. # All seqno info is stored in files starting with seqno
  140. $seqno_data = "seqno";
  141. # This will have the number of packets send out in a perticular interval 
  142. # by a perticular flow
  143. $seqnoStart[0]=0;
  144. $seqnoEnd[0]=0;
  145. $noPackets[0]=0;
  146. $eachShare[0]=0;
  147. open(FR,">fairness");
  148. open(FA,">fairalloc");
  149. use IO::File;
  150. $i=1;
  151. while($i <= $numsources) {
  152. $filehandle[$i] = IO::File->new("$seqno_data$i") || die "cannot open";
  153. $i += 1;
  154. }
  155. # this for loop brings all file pointers to the same start position
  156. # with respect to time
  157. for($tmp=1; $tmp <= $numsources ; $tmp++) {
  158. $line = $filehandle[$tmp]->getline();
  159. chomp($line);
  160. ($t, $seqno) = split(/ /,$line);
  161. while($t<$startTime) {
  162. $line = $filehandle[$tmp]->getline();
  163. chomp($line);
  164. ($t, $seqno) = split(/ /, $line);
  165. }
  166. print "$t:$seqno:n";
  167. }
  168. for( $j = $startTime ; $exitFlag < 1 ; $j++){
  169. for( $k=1 ; $k <= $numsources ; $k++) {
  170. $noPackets[$k]=0;
  171. $line = $filehandle[$k]->getline();
  172. $noPackets[$k]++;
  173. chomp($line);
  174. ($t, $seqno) = split(/ /, $line);
  175. $seqnoStart[$k]=$seqno;
  176. while($t < ($j+1)){
  177. $line = $filehandle[$k]->getline();
  178. if ($line eq "") {
  179. if ($k == $numsources) {
  180. $exitFlag=1;
  181. last;
  182. }
  183. else {
  184. last;
  185. }
  186. }
  187. $noPackets[$k]++;
  188. chomp($line);
  189. ($t, $seqno) = split(/ /, $line);
  190. if($t >= ($j+1)) {
  191. $seqnoEnd[$k]=$seqno;
  192. last;
  193. }
  194. }
  195. print "startseqno = $seqnoStart[$k] endSeqno = $seqnoEnd[$k] packets= $noPackets[$k]n";
  196. }
  197. $totalPackets=0;
  198. for( $l=1 ; $l <= $numsources; $l++){
  199. $totalPackets += $noPackets[$l];
  200. open(FAa, ">>$fair_alloc$l")  || die "can't open $fair_alloc$i :$!n";
  201. print FAa "$j $noPackets[$l]n"; 
  202. close(FAa);
  203. }
  204. print "totalpackets for $j = $totalPackets n";
  205. $fairallocation = $totalPackets / $numsources;
  206. print FA "$j $fairallocationn";
  207. $denominator = 0;
  208. $numerator =0;
  209. for($l=1 ; $l <=$numsources; $l++) {
  210. $eachShare[$l] = ($noPackets[$l] / $fairallocation);
  211. print "each share $l = $eachShare[$l] n";
  212. $denominator += ($eachShare[$l] ** 2);
  213. $numerator += $eachShare[$l];
  214. }
  215. $numerator = $numerator ** 2;
  216. $denominator = $denominator * $numsources;
  217. $fair = $numerator / $denominator;
  218. print FR "$j $fairn";
  219. print "Fairness = $j $fairnn";
  220. }
  221. close(FR);
  222. close(FA);
  223. ####################### End Fairness Plot
  224. # Generate required strings for gnuplot. This shows my illetracy in Perl and gnuplot :(
  225. $numsourcesplusone = $numsources + 1;
  226. for($i=1; $i<=$numsources ; $i++){
  227. $plotstring_seqno = $plotstring_seqno . " "$seqno_data$i" title "flow$i" with points $i";
  228. if ($i != $numsources){
  229. $plotstring_seqno = $plotstring_seqno . ",";
  230. }
  231. }
  232. $plotstring_seqno = $plotstring_seqno . ",  "$drop_data" title "dropped" with points $numsourcesplusone";
  233. print $plotstring_seqno;
  234. for($i=1; $i<=$numsources ; $i++){
  235. $plotstring_cwnd = $plotstring_cwnd . " "$cwnd_data$i" title "flow$i" with points $i";
  236. if ($i != $numsources){
  237. $plotstring_cwnd = $plotstring_cwnd . ",";
  238. }
  239. }
  240. print $plotstring_cwnd;
  241. $plotstring_fairalloc = " "$fair_alloc" title "Fair_throughput",";
  242. for($i=1,$j=2; $i<=$numsources ; $i++,$j++){
  243. $plotstring_fairalloc = $plotstring_fairalloc . " "$fair_alloc$i" title "flow$i" ";
  244. if ($i != $numsources){
  245. $plotstring_fairalloc = $plotstring_fairalloc . ",";
  246. }
  247. }
  248. print $plotstring_fairalloc;
  249. # Start up a gnuplot process and send the commands up until the END marker to
  250. # it.  This puts out the plots.  To figure out what the commands do, the best
  251. # plan is to use gnuplots help command.  E.g. "help set terminal postscript"
  252. # from the gnuplot command line.
  253. open(GNUPLOT, "|gnuplot") || die "Can't exec gnuplot: $!n";
  254. print GNUPLOT <<END;
  255. set terminal postscript landscape color
  256. set output "$stem.ps"
  257. set key
  258. set data style points
  259. set title "Sequence number vs. time $graphtype"
  260. set xlabel "Time (s)"
  261. set ylabel "Sequence number (packets)"
  262. #plot "$seqno_data" title "forwarded" with points 1, "$drop_data"  title "dropped" with points 2
  263. #plot "$seqno_data1" title "flow1" with points 1, "$seqno_data2"  title "flow2" with points 2
  264. plot $plotstring_seqno
  265. set xrange[*:*]
  266. set data style points
  267. set title "Congestion Window vs. time $graphtype"
  268. set xlabel "Time (s)"
  269. set ylabel "Congestion Window (packets)"
  270. #plot "$cwnd_data1" title "flow1" with points 1, "$cwnd_data2"  title "flow2" with points 2
  271. set key
  272. plot $plotstring_cwnd
  273. set data style points
  274. set title "Queue Length vs. time $graphtype"
  275. set xlabel "Time (s)"
  276. set ylabel "Queue length (packets)"
  277. set nokey
  278. plot "$queue_data"
  279. set data style lines
  280. set title "Bottleneck link utilization vs. time $graphtype"
  281. set xlabel "Time (s)"
  282. set ylabel "Link Utilization (%)"
  283. plot "$util_data"
  284. set data style points 
  285. set title "Jain's Fairness Index Vs Time $graphtype"
  286. set xlabel "Time (s)"
  287. set ylabel "Jain's Fairness Index / Second"
  288. plot "$fairness_data"
  289. set data style lines 
  290. set title "Throughput Fairness Vs Time $graphtype"
  291. set xlabel "Time (s)"
  292. set ylabel "Throughput (packets/second)"
  293. set key
  294. plot $plotstring_fairalloc
  295. quit
  296. END
  297. close(GNUPLOT);
  298. # To Clean up temp files, Uncomment the unlink command
  299. #unlink($queue_data, $seqno_data, $drop_data, $cwnd_data);