Guest User

Untitled

a guest
Jul 25th, 2016
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.37 KB | None | 0 0
  1. #!/usr/bin/perl
  2. #########################################################
  3. # multitest, by Marcus Sorensen, BetterServers Inc #
  4. # Licensed under the Open Software License version 3.0 #
  5. # http://opensource.org/licenses/OSL-3.0 #
  6. #########################################################
  7. use strict;
  8.  
  9. $| = 1;
  10. my $colors = { red => "\e[1;31m", def => "\e[0m", green => "\e[1;32m", cyan => "\e[1;36m" };
  11. my $restbetweentests = 15;
  12.  
  13. unless ( `which fio 2>/dev/null`) {
  14. print "No executable 'fio' found in path, exiting\n";
  15. exit;
  16. }
  17.  
  18. print <<EOF;
  19. $colors->{red}
  20. Multiple IO Tester$colors->{def}
  21.  
  22. This application emulates a busy server in several states by launching multiple
  23. threads that do various types of IO. This allows us to see what the consequences
  24. are of running in a multitasking environment. This test uses direct IO and
  25. invalidates caches between tests, testing the disk, not the memory.
  26.  
  27. $colors->{red}NOTE:$colors->{def} You need at least 3GB of free space in your current working directory.
  28.  
  29. The following tests currently consist of:
  30.  
  31. 8 sequential readers
  32. 8 sequential writers
  33. 8 mixed seqential readers/writers (random choice per IO)
  34. 8 random readers
  35. 8 random writers
  36. 8 mixed random readers/writers (random choice per IO)
  37.  
  38. Feel free to modify the script to meet your needs. Enjoy!
  39.  
  40. The test should take less than 2 minutes. Press <ENTER> to begin...
  41. EOF
  42. <STDIN>;
  43.  
  44. my $tests = { 'read' => { 'order' => 1,
  45. 'block' => '1024k',
  46. 'output' => { 'multiiotester'=>'4', '2'=>'5', '3'=>'6' },
  47. 'name' => 'sequential read' },
  48. 'write' => { 'order' => 2,
  49. 'block' => '1024k',
  50. 'output' => { 'multiiotester'=>'20', '2'=>'25', '3'=>'47' },
  51. 'name' => 'sequential write' },
  52. 'rw' => { 'order' => 3,
  53. 'block' => '1024k',
  54. 'output' => { 'multiiotester'=>'4,20', '2'=>'5,25', '3'=>'6,47' },
  55. 'name' => 'seq read/seq write' },
  56. 'randread' => { 'order' => 4,
  57. 'block' => '4k',
  58. 'output' => { 'multiiotester'=>'4', '2'=>'5', '3'=>'6' },
  59. 'name' => 'random read' },
  60. 'randwrite' => { 'order' => 5,
  61. 'block' => '4k',
  62. 'output' => { 'multiiotester'=>'20', '2'=>'25', '3'=>'47' },
  63. 'name' => 'random write' } ,
  64. 'randrw' => { 'order' => 6,
  65. 'block' => '4k',
  66. 'output' => { 'multiiotester'=>'4,20', '2'=>'5,25', '3'=>'6,47' },
  67. 'name' => 'rand read/rand write' }
  68. };
  69.  
  70. #mkdir('./multiiotester') or die "unable to create test directory: $^E";
  71. mkdir('./multiiotester') if ! -d './multiiotester';
  72. chdir('./multiiotester') or die "unable to chdir to test directory: $^E";
  73.  
  74.  
  75. foreach my $t ( sort{$tests->{$a}->{order} cmp $tests->{$b}->{order}} keys %{$tests} ) {
  76. print "$colors->{cyan} running IO \"$tests->{$t}->{name}\" test... $colors->{def}\n";
  77.  
  78. my $cmd = "fio --direct=1 --invalidate=1 --ioengine=libaio --iodepth=8 --thread --time_based --runtime=10 --rw=$t --bs=$tests->{$t}->{block} --size=300M --numjobs=8 --name=multiiotester --minimal | grep ';'";
  79.  
  80. my @output = `$cmd`;
  81. $output[0] =~ /^(.*?);/;
  82. my $version = $1;
  83. my $data;
  84.  
  85. foreach my $d (@output){
  86. next unless $d =~ /;/;
  87. my $field = $tests->{$t}->{output}->{$version};
  88. my @items = split(";",$d);
  89. if ($field =~ /(\d+),(\d+)/) {
  90. $data .= "$items[$1];$items[$2]\n";
  91. } else {
  92. $data .= "$items[$field]\n";
  93. }
  94. }
  95.  
  96. my @results = split(/;/,combinejobs($data));
  97. my @iops = map { toiops($_,$tests->{$t}->{block}) } @results;
  98. @results = map { convert($_) } @results;
  99.  
  100. if( $t =~ /^rand/ ) {
  101. print "\tresult is $colors->{green}" . join("/", @results) . "$colors->{def} per second\n";
  102. print "\tequals $colors->{green}" . join("$colors->{def}/$colors->{green}", @iops) . "$colors->{def} IOs per second\n\n";
  103. }
  104. else {
  105. print "\tresult is $colors->{green}" . join("$colors->{def}/$colors->{green}", @results) . "$colors->{def} per second\n\n";
  106. }
  107.  
  108. sleep $restbetweentests;
  109. }
  110.  
  111. #print "cleaning up files..\n";
  112.  
  113. #unlink glob "multiiotester*";
  114. #chdir("..");
  115. #rmdir("multiiotester") or print "unable to delete directory 'multiiotester'\n";
  116.  
  117. ###########################
  118. ####### subroutines #######
  119. ###########################
  120.  
  121. sub convert {
  122. my $val = shift;
  123. my @units = ('KB','MB','GB');
  124. my $i = 0;
  125.  
  126. $val =~ /^\d+/;
  127. while (length($&) > 3 ) {
  128. $val = sprintf("%.2f",$val / 1024);
  129. $i++;
  130. $val =~ /^\d+/;
  131. }
  132. return $val . $units[$i];
  133. }
  134.  
  135. sub toiops {
  136. my $val = shift;
  137. my $blocksize = shift;
  138.  
  139. $blocksize =~ s/k//;
  140. my $io = sprintf("%.1f",$val/$blocksize);
  141.  
  142. return $io;
  143. }
  144.  
  145. sub combinejobs {
  146. my $input = shift;
  147.  
  148. my @lines = split(/\n/,$input);
  149. my @output = ();
  150.  
  151. foreach my $l (0..$#lines) {
  152. my @temp = split(/;/,$lines[$l]);
  153. foreach my $t (0..$#temp){
  154. $output[$t] += $temp[$t];
  155. }
  156. }
  157.  
  158. return join(";",@output);
  159. }
Add Comment
Please, Sign In to add comment