From ef2f327a4ca5cd765a7cf11836003fdce22dc90c Mon Sep 17 00:00:00 2001 From: Laura Caulfield Date: Tue, 21 Feb 2017 17:03:00 -0800 Subject: [PATCH] This changeset includes a few major changes to support testing multiple files on a device under test with a different workload running on each file. Such a workload is important for evaluating streaming and open channel SSDs. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The test operator passes the following command line to test disk 2 using a multi-target workload: $> StoreScore.cmd --target=2 --recipe=multitarget.rcp As with previous versions of StorScore, the command line defines the device under test, and the recipe file defines the workload. New with these changes, it also defines the number of files to create and test. For example: multitarget.rcp: test( description => "Multitarget Sample" target_count => 2, xml_profile => "sample.xml", initialize => 0, warmup_time => 5, run_time => 60, ); Unlike single-target tests, multi-target tests define the workload in a separate xml profile template. StorScore checks to make sure the recipe points to a profile file whenever the target count is greater than 1. During each test, StorScore wipes the disk, creates a partition and file system, and then divides the disk space evenly among the number of targets given by the recipe. It injects a few variables into the xml template, such as file names and run time, exports the xml document to the results directory and then points diskspd at this profile. (Diskspd.exe -Xmodified-sample.xml) NB: In the future, I would like to generate the xml document from scratch to reduce user error and frustration. The XML profiles can be tedious to generate, and they can easily get out of synch with the recipe. These changes also update the parsed data. Previously, the excel file printed one row for each test: Disk | Description | W Mix | IO Size | MB/s | Avg Latency ------------------------------------------------------------------------------------- PM953 | 4k Rand Read | 0 | 4k | 502.45 | 0.092 PM953 | 4k Rand Write | 100 | 4k | 235.45 | 1.201 PM953 | 8k Rand Read | 0 | 8k | 252.45 | 0.181 Now, each row shows either per-target workload and results or the aggregate workload and results: Disk | Description | Target | W Mix | IO Size | MB/s | Avg Latency ------------------------------------------------------------------------------------------------------ PM953 | 4k Rand Read | Total | 0 | 4k | 502.45 | 0.092 PM953 | Example Multi | Total | 50 | | 235.45 | 1.201 PM953 | Example Multi | E:\file1.dat | 0 | 4k | 285.12 | 0.181 PM953 | Example Multi | E:\file2.dat | 100 | 8k | 102.48 | 1.589 The outlier and score calculation is based only on the measurements listed in the aggregated rows. To support this output format, I added a level to the parser's main data structure: Before: stats = { “FW version” => “10010L00”, … “Read Mix” => 100, “QD” => 1, … “MB/s Read” => 1175, “IOs Read” => 20398, … } After: stats = { “FW version” => “10010L00”, … “Workloads” => { “Total” => { “Read Mix” => 50, “QD” => 129, … }, “E:\file1.dat” => { “Read Mix” => 100, “QD” => 1, … }, “E:\file2.dat” => { “Read Mix” => 0, “QD” => 128, … } }, “Measurements” => { “Total” => { “MB/s Read” => 285.12, “IOs Read” => 10128, … }, “E:\file1.dat” => { “MB/s Read” => 285.12, “IOs Read” => 10128, … }, “E:\file2.dat” => { “MB/s Read” => 0, “IOs Read” => 0, … } } } --- README.md | 10 +- StorScore.cmd | 2 +- StorScore.ver | 2 +- bin/DiskSpd.exe | Bin 173872 -> 194560 bytes lib/CommandLine.pm | 4 +- lib/DiskSpdParser.pm | 274 ++++- lib/DiskSpdRunner.pm | 147 ++- lib/Endurance.pm | 85 +- lib/LogmanParser.pm | 14 +- lib/Power.pm | 2 +- lib/PreconditionRunner.pm | 46 +- lib/Recipe.pm | 143 ++- lib/SmartCtlParser.pm | 6 +- lib/SqlioParser.pm | 3 +- lib/StorageToolParser.pm | 2 +- lib/Target.pm | 42 +- lib/Util.pm | 24 +- parse_results.cmd | 224 ++-- recipes/14hr_multitarget.rcp | 56 + recipes/xmlProfiles/1seq_63rand.xml | 1490 +++++++++++++++++++++++++++ recipes/xmlProfiles/63seq_1rand.xml | 1490 +++++++++++++++++++++++++++ recipes/xmlProfiles/64seq.xml | 1427 +++++++++++++++++++++++++ recipes/xmlProfiles/sample.xml | 65 ++ recipes/xml_sample.rcp | 46 + 24 files changed, 5330 insertions(+), 274 deletions(-) create mode 100644 recipes/14hr_multitarget.rcp create mode 100644 recipes/xmlProfiles/1seq_63rand.xml create mode 100644 recipes/xmlProfiles/63seq_1rand.xml create mode 100644 recipes/xmlProfiles/64seq.xml create mode 100644 recipes/xmlProfiles/sample.xml create mode 100644 recipes/xml_sample.rcp diff --git a/README.md b/README.md index 7d344e0..b9aa9df 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,14 @@ You must download and install the following or StorScore will not work: The Visual Studio 2015 C++ runtime libraries for x86 & x64: https://www.microsoft.com/en-us/download/details.aspx?id=48145 +StorScore requires libXML. Install it from the command line: + + For ActiveState perl installs: + $> ppm install XML::LibXML + + For Strawberry perl installs: + $> cpan XML::LibXML + StorScore will work without these components, but some features will be disabled: @@ -107,4 +115,4 @@ Open Source Code of Conduct This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) -or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \ No newline at end of file +or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. diff --git a/StorScore.cmd b/StorScore.cmd index 3d8e8a7..6c0e349 100644 --- a/StorScore.cmd +++ b/StorScore.cmd @@ -115,7 +115,7 @@ else "$prefix-" . strftime( "%Y-%m-%d_%H-%M-%S", localtime ); } -print "Targeting " . uc( $target->type ) . ": " . $target->model . "\n"; +print "\nTargeting " . uc( $target->type ) . ": " . $target->model . "\n\n"; my $recipe = Recipe->new( file_name => $recipe_file, diff --git a/StorScore.ver b/StorScore.ver index 546d892..ad12a2d 100644 --- a/StorScore.ver +++ b/StorScore.ver @@ -2,4 +2,4 @@ The results in this directory were generated from the version of storscore published on the date listed below. If there is no date, the results were generated from an unpublished & untracked version of code. -Tue 01/24/2017 9:00:53.83 +Tue 02/21/2017 16:48:27.05 diff --git a/bin/DiskSpd.exe b/bin/DiskSpd.exe index ff63ed59712bb7e48ee9669d808488dec3879986..c00c2446c34838619ea72e4683ad361230175cf8 100644 GIT binary patch literal 194560 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 literal 173872 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%0Dvce+hoIxr{UHF6?DSNg^ag=Q=aL!T}tFo9J z*s84B@4(=%POJ@9hg&+79t!;_>#=Uqkd@VaJDmA_r~BTZ@z-`2=Gg1y94mJ@$KrmW zg-TMXT>C@C_Q!N?`#bj;>#ww^J&6^{N_J2wJ1@{qwz0C9thRDhO^yz9m7OV~akZTq zpJ7PGeTKBuKqt8!C0e^$M4j z4v|A>yM=4u!|n8GA_(-0N=rlLq;wPAaHsD9hs`q?((w7qg?{)xuPk@;bO;QVgXG}A z5IHDlz;r|rco3DdvlT6EZ8mm$VbjgtiIUdCA|Y)~pq8xJBGG1!S+zhn+2xT<>ICQ- z=qbBDl4_kUTIVNs2I}0wgOc6tL95-UDRH(N0wWO zq+TlL_P@R_u;BRh74v7`OM3eYc^YN#RY%Es`H8~F!m%qO3?`FtNWXpw=_!35bgjPV zdHsyfCR1uZV>;GPB$zV#q0^(&prfOkqj$$rzwRRs>=QVsFY?JVtTeEPrKPnbsVB-4 zQe+&q$UFfi(WWbrvF1d{R_#M~z?jI)& zl#)L`i51>y_zV9g{c5*PZ_MtEZpHo__x5?!Eno zzaRO@cz>@r!`#Of1mAJ$vvc;g==+`Jqt?e~WPQK;-rUhy2P#I-jujvK$=Te=wa11|d2~L}laumUCBo*$an0&RxzA&s|fo4km2@jb{IO+^=f?oz3Ea z>6P!RoI|$;9X^-%`pv&J^&R)*Ovnu1v$~76&)A>SMmODhBVqY_U9J4a?FpHBdSI`E zuZ|gFvFM6x&v`Xn4Asm3?%nBnj{l;~#r?MYo}{^JtNG*8rqXr?t3N&UQlr=vIx1Sk@+%33Ob@goa+tY71Z5_9!>E8Yh2g6_K)Lgjb(2!Lp z2RL;ZefRf_f!}ZS{Pf4KZ@-tnHq`m#s71k}=Q_w+!Ygm=9sZ5~cPp!neP)ezbDd|rwJXJ8f zZ$qfMY|foXXEyi%`EV;)+S+;6#xxH-v;L^#~!b-L^51|$o zd}#Nlp}l3678xF%RuU=_3YM5&+UMVS>Xbh>e7bGkLUj`K#K`Zg?k@Wmc6lJdO=VH& zZtt2HkEMRPM~44LP9<%gr?P+J=aTFn4Uq2OY~dxAjgStZ%1P1*}KdJ$4M@` zSkB%mhnrJynrq$m_~iJ0|1C{T@{|^0#{S2%rO^7nDfiJUV_eVShQ+Y?(V@#$KKI9} zD!tb!ty{#m8aAh=2LZh#rv7TPU|oIFv{blTe3~x zt~JNQj;2~i7vD&J?A+xi_Rg=k|9ikjedMk~Gh}yAt;v(1iL|*?ow`6Xzi&V4KYtiVDzp!Io^3qct%PzgPsP_>6bBiavq5tf| z9Uoj@y*H!%2p5|RUtBt{aPHB0K94;UHb8&O*5fhVxv+J&_I&pE;hWcU{^;E=FbW6b z+uH&%mc>SY(Em=|SE@^1tFH~1xfrX zRg~|x*q;M)R3lJ$82-)3*{}Sca86LU{>!gkbdu%KM zAC4XPBZj{+5C4|g1-5H3vZy3?x!=Qr>cGxwzoo=H1y|e$OVl wHg-Sqc7fZX%YV*!e&7?j_dflqw!BYMe!<13PE0uW)^ESAKcLQfk^XxA551ndssI20 diff --git a/lib/CommandLine.pm b/lib/CommandLine.pm index f2df997..d0c9542 100644 --- a/lib/CommandLine.pm +++ b/lib/CommandLine.pm @@ -363,8 +363,8 @@ END if( $self->demo_mode ) { $self->_active_range( 1 ); - $self->_test_time_override( 5 ); - $self->_warmup_time_override( 0 ); + $self->_test_time_override( 10 ); # seconds + $self->_warmup_time_override( 5 ); # seconds } if( defined $self->test_time_override ) diff --git a/lib/DiskSpdParser.pm b/lib/DiskSpdParser.pm index 9149469..6ff8c2b 100644 --- a/lib/DiskSpdParser.pm +++ b/lib/DiskSpdParser.pm @@ -31,36 +31,166 @@ use warnings; use Moose; use Util; -sub parse_cmd_line($$) +sub parse_workload($$$) { my $self = shift; + my $dir = shift; my $cmd_line = shift; my $stats_ref = shift; + + $cmd_line =~ /.+-X(.+).xml/; + my $xml_profile_path = $1; + + if( $xml_profile_path ) + { + # NB: we can't use the filename as-is from the result file because + # the results directory probably moved from its original location + + $xml_profile_path =~ /.*(profile-.*)/; + my $xml_profile = $1; + + parse_cmd_xml($dir, "$xml_profile.xml", $stats_ref); + } + else + { + parse_cmd_flags($cmd_line, $stats_ref); + } +} + +sub parse_cmd_xml($$$) +{ + my $dir = shift; + my $profile_filename = shift; + my $stats_ref = shift; + + my %target_stats = (); + my $target_count = 0; + my $sum_of_write_mix = 0; + my $sum_of_QD = 0; + my $sum_of_entropy = 0; + + my $xml_parser = XML::LibXML->new(); + my $doc = $xml_parser->parse_file( "$dir\\$profile_filename" ); + + foreach my $target ( $doc->findnodes( '//Target' ) ) + { + $target_count++; + + my $path = $target->findvalue( './Path' ); + # + #cannot target multiple files when there is no filesystem + $target_stats{$path}{'Raw Disk'} = 0; + + my $write_ratio = $target->findvalue( './WriteRatio' ); + $target_stats{$path}{'W Mix'} = $write_ratio; + $target_stats{$path}{'R Mix'} = 100 - $write_ratio; + $sum_of_write_mix += $write_ratio; + + my $io_size_B = $target->findvalue( './BlockSize' ); + $target_stats{$path}{'Access Size'} = $io_size_B / BYTES_PER_KB_BASE2; + + my $alignment = $io_size_B; + if( $target->findvalue( './Random' ) ) + { + $target_stats{$path}{'Access Type'} = 'random'; + $alignment = $target->findvalue( './Random' ); + } + else + { + $target_stats{$path}{'Access Type'} = 'sequential'; + $alignment = $target->findvalue( './StrideSize' ); + } + $target_stats{$path}{'Alignment'} = $alignment / BYTES_PER_KB_BASE2; + + my $ios_per_thread = $target->findvalue( './RequestCount' ); + my $num_threads = $target->findvalue( './ThreadsPerFile' ); + $target_stats{$path}{'QD'} = $ios_per_thread * $num_threads; + $sum_of_QD += $target_stats{$path}{'QD'}; + + my $entropy_filename = $target->findvalue( './/FilePath' ); + + #search for the format of Storscore's pre-generated entropy files + if( $entropy_filename =~ /.?([^\\]*)_pct_comp\.bin/ ) + { + my $file_name = $1; + + $file_name =~ /(\d+)/; + + $target_stats{$path}{'Compressibility'} = $1; + $sum_of_entropy += $1; + } + else + { + #file name format is not recognized + $target_stats{$path}{'Compressibility'} = "unknown"; + $sum_of_entropy = "unknown"; + } + } + + # Issue review: the aggregate workload of multiple targets is random + # Is there anything more intersting we can call it? For example, if all the + # individual workloads are sequential, should we call it something like + # "streaming"? + + # This entry representing the aggregate workload + $target_stats{'Total'}{'Raw Disk'} = 0; + $target_stats{'Total'}{'Access Type'} = 'random'; + $target_stats{'Total'}{'W Mix'} = $sum_of_write_mix / $target_count; + $target_stats{'Total'}{'R Mix'} = 100 - $target_stats{'Total'}{'W Mix'}; + $target_stats{'Total'}{'QD'} = $sum_of_QD; + $target_stats{'Total'}{'Compressibility'} = $sum_of_entropy / $target_count; + + $stats_ref->{'Workloads'} = \%target_stats; +} +sub parse_cmd_flags($$) +{ + my $cmd_line = shift; + my $stats_ref = shift; + + my %target_stats = (); + + $cmd_line =~ /\s+(".*"|\S+)$/ or die; + my $target = $1; + + if( $target =~ /^\#\d+$/ ) + { + $target_stats{'Total'}{'Raw Disk'} = 1; + } + else + { + $target_stats{'Total'}{'Raw Disk'} = 0; + } if( $cmd_line =~ /-w(\d+)/ ) { - $stats_ref->{'W Mix'} = $1; - $stats_ref->{'R Mix'} = 100 - $stats_ref->{'W Mix'}; + $target_stats{'Total'}{'W Mix'} = $1; + $target_stats{'Total'}{'R Mix'} = 100 - $1; } else { - $stats_ref->{'W Mix'} = 0; - $stats_ref->{'R Mix'} = 100; + $target_stats{'Total'}{'W Mix'} = 0; + $target_stats{'Total'}{'R Mix'} = 100; } - if( $cmd_line =~ /-r/ ) + $cmd_line =~ /-b(\w+)/; + $target_stats{'Total'}{'Access Size'} = human_to_kilobytes( $1 ); + + $target_stats{'Total'}{'Alignment'} = human_to_kilobytes( $1 ); + if( $cmd_line =~ /-r(\d+.*)\s+/ or $cmd_line =~ /-si(\d+.*)\s+/ ) { - $stats_ref->{'Access Type'} = 'random'; + $target_stats{'Total'}{'Alignment'} = human_to_kilobytes( $1 ); + } + + if( $cmd_line =~ /-r\s+/ ) + { + $target_stats{'Total'}{'Access Type'} = 'random'; } else { - $stats_ref->{'Access Type'} = 'sequential'; + $target_stats{'Total'}{'Access Type'} = 'sequential'; } - $cmd_line =~ /-b(\w+)/; - $stats_ref->{'Access Size'} = human_to_kilobytes( $1 ); - my $num_threads = 1; if( $cmd_line =~ /-t(\d+)/ ) @@ -71,52 +201,31 @@ sub parse_cmd_line($$) $cmd_line =~ /-o(\d+)/; my $ios_per_thread = $1; - $stats_ref->{'QD'} = $ios_per_thread * $num_threads; + $target_stats{'Total'}{'QD'} = $ios_per_thread * $num_threads; - if( $cmd_line =~ /-Z.*?([^\\]*)\.bin/ ) + #search for the format of Storscore's pre-generated entropy files + if( $cmd_line =~ /-Z.*?([^\\]*)_pct_comp\.bin/ ) { my $file_name = $1; $file_name =~ /(\d+)/; - $stats_ref->{'Compressibility'} = $1; + $target_stats{'Total'}{'Compressibility'} = $1; } else { - $stats_ref->{'Compressibility'} = 0; + #file name format is not recognized + $target_stats{'Total'}{'Compressibility'} = "unknown"; } - $cmd_line =~ /\s+(".*"|\S+)$/ or die; - my $target = $1; + $stats_ref->{'Workloads'} = \%target_stats; - if( $target =~ /^\#\d+$/ ) - { - $stats_ref->{'Raw Disk'} = 1; - } - else - { - $stats_ref->{'Raw Disk'} = 0; - } } my $pct_table_pat = qr/\|\s+(.+)\s+\|\s+(.+)\s+\|\s+(.+)\s+/; my @extract_rules = ( - { - match => qr/.+alignment:\s+(\d+).+/, - store => - [ - 'Alignment' - ] - }, - { - match => qr/.+stride:\s+(\d+).+/, - store => - [ - 'Alignment' - ] - }, { match => qr/min $pct_table_pat/, store => @@ -236,7 +345,7 @@ my @extract_rules = }, ); -sub remove_na($@) +sub remove_na($) { my $stats_ref = shift; @@ -255,34 +364,103 @@ sub parse($$) my $LOG = shift; my $stats_ref = shift; - + + my %target_stats = (); + my $previous_line = ""; + my $target_count = 0; + while( my $line = <$LOG> ) { + + if( $line =~ /path:/ ) + { + $target_count++; + } + if( $line =~ /^(\w+) IO/ ) { my $io_type = $1; while( $line = <$LOG> ) { + # This line contains per-thread throughput information + if( $line =~ /\s(\d+.*B)/ and $target_count > 1 ) + { + $line =~ s/\s+//g; + my @values = split /\|/, $line; + + my $mb = $values[1] / BYTES_PER_MB_BASE2; + my $ios = $values[2]; + my $mb_s = $values[3]; + my $iops = $values[4]; + my $lat = $values[5]; + + my $target_with_size = $values[7]; + $target_with_size =~ /(.*)\(.*\)/; + my $target = $1; + + $target_stats{$target}{"IOs $io_type"} += $ios; + $target_stats{$target}{"MB/sec $io_type"} += $mb_s; + $target_stats{$target}{"IOPS $io_type"} += $iops; + $target_stats{$target}{"Avg Latency $io_type"} += $ios*$lat; + } + + # This line contains the throughput totals for this IO type if( $line =~ /total:/ ) { $line =~ s/\s+//g; my @values = split /\|/, $line; - - $stats_ref->{"IOs $io_type"} = $values[1]; - $stats_ref->{"MB/sec $io_type"} = $values[2]; - $stats_ref->{"IOPS $io_type"} = $values[3]; - $stats_ref->{"Avg Latency $io_type"} = $values[4]; + + $target_stats{"Total"}{"IOs $io_type"} = $values[1]; + $target_stats{"Total"}{"MB/sec $io_type"} = $values[2]; + $target_stats{"Total"}{"IOPS $io_type"} = $values[3]; + $target_stats{"Total"}{"Avg Latency $io_type"} = $values[4]; last; } } + + foreach my $path ( keys %target_stats ) + { + unless ( $path eq "Total" or + $target_stats{$path}{"IOs $io_type"} == 0 ) + { + $target_stats{$path}{"Avg Latency $io_type"} = + $target_stats{$path}{"Avg Latency $io_type"} / + $target_stats{$path}{"IOs $io_type"}; + } + } + } - do_simple_extract( $line, $stats_ref, \@extract_rules ); + + if( $line =~ /-ile/ ) + { + + my $target = "Total"; + $previous_line =~ s/\s+//g; + $target = $previous_line + unless ( $previous_line eq "total:" ) or + ( $previous_line eq "" ); + + while( $line = <$LOG> ) + { + do_simple_extract( $line, + $target_stats{$target}, + \@extract_rules ); + last if( $line =~ /max/ ); + } + } + + $previous_line = $line; + } + + foreach my $path ( keys %target_stats ) + { + remove_na( $target_stats{$path} ); } - remove_na( $stats_ref, \@extract_rules ); + $stats_ref->{"Measurements"} = \%target_stats; } no Moose; diff --git a/lib/DiskSpdRunner.pm b/lib/DiskSpdRunner.pm index 032bd99..0515e4c 100644 --- a/lib/DiskSpdRunner.pm +++ b/lib/DiskSpdRunner.pm @@ -66,10 +66,7 @@ if( hyperthreading_enabled() ) $affinity_string = join ',', ( @physical_cores, @logical_cores ); } -else -{ - # Do nothing, DiskSpd uses simple round-robin affinity by default -} +# Else do nothing, DiskSpd uses simple round-robin affinity by default sub run($$) { @@ -78,18 +75,130 @@ sub run($$) my $test_ref = shift; my $run_type = shift; + my $run_time = $test_ref->{'run_time'}; + + if( $run_type eq 'warmup' ) + { + $run_time = $test_ref->{'warmup_time'}; + } + elsif( $run_type eq 'precondition' ) + { + $run_time = '3600' + unless ( $pretend or $self->cmd_line->demo_mode ); + } + + my $cmd; + + if( $test_ref->{'target_count'} > 1 ) + { + $cmd = $self->get_xml_cmdline($test_ref, $run_time); + } + else + { + $cmd = $self->get_cmdline($test_ref, $run_time); + } + + my $out_file = $self->output_dir . + "\\$run_type-$test_ref->{'description'}.txt"; + + open( my $OUT, ">$out_file" ) + or die "could not open $out_file: $!"; + + # Save the command line as line 1 of the file + print $OUT "$cmd\n"; + + my ( $errorlevel, $stdout, $stderr ) = execute_task( $cmd ); + + print $OUT "$stdout\n"; + print $OUT "$stderr\n"; + + close( $OUT ); + + print STDERR "\n\tDiskSpd returned non-zero errorlevel" if $errorlevel; + +} + +sub get_xml_cmdline($$$) +{ + my $self = shift; + my $test_ref = shift; + my $run_time = shift; + + my $compressibility = $test_ref->{'compressibility'}; + my $profile_template = $recipes_dir . + "\\xmlProfiles\\$test_ref->{'xml_profile'}"; + + my $parser = XML::LibXML->new(); + my $doc = $parser->parse_file( $profile_template ); + + for my $timespan ( $doc->findnodes( '//TimeSpan' ) ) + { + my $duration_node = XML::LibXML::Element->new( 'Duration' ); + $duration_node->appendTextNode( "$run_time" ); + $timespan->addChild( $duration_node ); + } + + # Use default unless compressibility is specified by the test + my $entropy_file = + Compressibility::get_filename( + $compressibility // $self->cmd_line->compressibility + ); + + my $entropy_file_size = int Compressibility::FILE_SIZE; + + for my $data_source ( $doc->findnodes( '//RandomDataSource' ) ) + { + my $file_node = XML::LibXML::Element->new('FilePath'); + $file_node->appendTextNode( "$entropy_file" ); + $data_source->addChild( $file_node ); + + my $file_size_node = XML::LibXML::Element->new( 'SizeInBytes' ); + $file_size_node->appendTextNode( "$entropy_file_size" ); + $data_source->addChild( $file_size_node ); + } + + my $profile_target_nodes = $doc->findnodes( '//Target' ); + my $profile_target_count = $profile_target_nodes->size(); + my $recipe_target_count = $test_ref->{'target_count'}; + + my $msg = "Number of targets in recipe ($recipe_target_count)" . + "does not match profile ($profile_target_count)\n"; + die $msg unless( $profile_target_count == $recipe_target_count ); + + my $file_num = 0; + for my $target ( $profile_target_nodes->get_nodelist ) + { + $file_num++; + + my $path = $self->target->volume . "\\$TEST_FILE_STUB$file_num.dat"; + + my $path_node = XML::LibXML::Element->new( 'Path' ); + $path_node->appendTextNode( $path ); + $target->addChild( $path_node ); + } + + my $profile_file = $self->output_dir . + "\\profile-$test_ref->{'description'}.xml"; + + $doc->toFile($profile_file); + + my $cmd = "DiskSpd.exe -X$profile_file"; + + return $cmd; +} + +sub get_cmdline($$$) +{ + my $self = shift; + my $test_ref = shift; + my $run_time = shift; + my $write_percentage = $test_ref->{'write_percentage'}; my $access_pattern = $test_ref->{'access_pattern'}; my $block_size = $test_ref->{'block_size'}; my $queue_depth = $test_ref->{'queue_depth'}; - my $run_time = $test_ref->{'run_time'}; my $compressibility = $test_ref->{'compressibility'}; - if( $run_type eq 'warmup' ) - { - $run_time = $test_ref->{'warmup_time'}; - } - # Gradually increase the number of threads as queue_depth # increases in order to prevent CPU limitation. my $num_threads = 1; @@ -151,23 +260,7 @@ sub run($$) $cmd .= $self->target->file_name; } - my $out_file = $self->output_dir . - "\\$run_type-$test_ref->{'description'}.txt"; - - open( my $OUT, ">$out_file" ) - or die "could not open $out_file: $!"; - - # Save the command line as line 1 of the file - print $OUT "$cmd\n"; - - my ( $errorlevel, $stdout, $stderr ) = execute_task( $cmd ); - - print $OUT "$stdout\n"; - print $OUT "$stderr\n"; - - close( $OUT ); - - print STDERR "\n\tDiskSpd returned non-zero errorlevel" if $errorlevel; + return $cmd; } no Moose; diff --git a/lib/Endurance.pm b/lib/Endurance.pm index 893b5f5..87f2402 100644 --- a/lib/Endurance.pm +++ b/lib/Endurance.pm @@ -72,10 +72,10 @@ sub compute_host_writes($$) my $stats_ref = shift; my $ddb_ref = shift; - return unless exists $stats_ref->{'Host Writes Before'}; + return unless exists $stats_ref->{'Measurements'}{'Total'}{'Host Writes Before'}; - my $before = $stats_ref->{'Host Writes Before'}; - my $after = $stats_ref->{'Host Writes After'}; + my $before = $stats_ref->{'Measurements'}{'Total'}{'Host Writes Before'}; + my $after = $stats_ref->{'Measurements'}{'Total'}{'Host Writes After'}; my $diff = $after - $before; # if the device db doesn't define a unit, assume it's an NVMe drive with the default units @@ -87,7 +87,8 @@ sub compute_host_writes($$) $stats_ref->{'Notes'} .= "Host writes too small ($diff). WAF is wrong; " if $diff < 5; - $stats_ref->{'Host Writes'} = ( $after - $before ) * $units; + $stats_ref->{'Measurements'}{'Total'}{'Host Writes'} = + ( $after - $before ) * $units; } sub compute_controller_writes($$) @@ -95,10 +96,10 @@ sub compute_controller_writes($$) my $stats_ref = shift; my $ddb_ref = shift; - return unless exists $stats_ref->{'Controller Writes Before'}; + return unless exists $stats_ref->{'Measurements'}{'Total'}{'Controller Writes Before'}; - my $before = $stats_ref->{'Controller Writes Before'}; - my $after = $stats_ref->{'Controller Writes After'}; + my $before = $stats_ref->{'Measurements'}{'Total'}{'Controller Writes Before'}; + my $after = $stats_ref->{'Measurements'}{'Total'}{'Controller Writes After'}; my $diff = $after - $before; my $units = $ddb_ref->{'Controller Writes'}{'Unit'} // BYTES_PER_MB_BASE2; @@ -109,9 +110,11 @@ sub compute_controller_writes($$) $stats_ref->{'Notes'} .= "Ctlr writes too small ($diff). WAF is wrong; " if $diff < 5; - $stats_ref->{'Controller Writes'} = ( $after - $before ) * $units; + $stats_ref->{'Measurements'}{'Total'}{'Controller Writes'} = + ( $after - $before ) * $units; - $stats_ref->{'Controller Writes'} += $stats_ref->{'Host Writes'} + $stats_ref->{'Measurements'}{'Total'}{'Controller Writes'} += + $stats_ref->{'Measurements'}{'Total'}{'Host Writes'} if exists $ddb_ref->{'Controller Writes'}{'Additive'}; } @@ -120,13 +123,14 @@ sub compute_file_system_waf($$) my $stats_ref = shift; my $ddb_ref = shift; - return unless exists $stats_ref->{'Host Writes'}; + return unless exists $stats_ref->{'Measurements'}{'Total'}{'Host Writes'}; my $host_writes_in_GB = - $stats_ref->{'Host Writes'} / BYTES_PER_GB_BASE2; + $stats_ref->{'Measurements'}{'Total'}{'Host Writes'} / + BYTES_PER_GB_BASE2; - $stats_ref->{'Filesystem Write Amplification'} = - $host_writes_in_GB / $stats_ref->{'GB Write'}; + $stats_ref->{'Measurements'}{'Total'}{'Filesystem Write Amplification'} = + $host_writes_in_GB / $stats_ref->{'Measurements'}{'Total'}{'GB Write'}; } sub compute_drive_waf($$) @@ -135,13 +139,14 @@ sub compute_drive_waf($$) my $ddb_ref = shift; return unless - exists $stats_ref->{'Host Writes'} and - exists $stats_ref->{'Controller Writes'}; + exists $stats_ref->{'Measurements'}{'Total'}{'Host Writes'} and + exists $stats_ref->{'Measurements'}{'Total'}{'Controller Writes'}; - my $ctrl_writes = $stats_ref->{'Controller Writes'}; - my $host_writes = $stats_ref->{'Host Writes'}; + my $ctrl_writes = $stats_ref->{'Measurements'}{'Total'}{'Controller Writes'}; + my $host_writes = $stats_ref->{'Measurements'}{'Total'}{'Host Writes'}; - $stats_ref->{'Drive Write Amplification'} = $ctrl_writes / $host_writes + $stats_ref->{'Measurements'}{'Total'}{'Drive Write Amplification'} = + $ctrl_writes / $host_writes unless $host_writes == 0; } @@ -150,13 +155,15 @@ sub compute_total_waf($$) my $stats_ref = shift; my $ddb_ref = shift; - return unless exists $stats_ref->{'Controller Writes'}; + return + unless exists $stats_ref->{'Measurements'}{'Total'}{'Controller Writes'}; my $ctrl_writes_in_GB = - $stats_ref->{'Controller Writes'} / BYTES_PER_GB_BASE2; + $stats_ref->{'Measurements'}{'Total'}{'Controller Writes'} / + BYTES_PER_GB_BASE2; - $stats_ref->{'Total Write Amplification'} = - $ctrl_writes_in_GB / $stats_ref->{'GB Write'}; + $stats_ref->{'Measurements'}{'Total'}{'Total Write Amplification'} = + $ctrl_writes_in_GB / $stats_ref->{'Measurements'}{'Total'}{'GB Write'}; } sub compute_nand_metrics($$) @@ -164,16 +171,22 @@ sub compute_nand_metrics($$) my $stats_ref = shift; my $ddb_ref = shift; - return unless exists $stats_ref->{'Drive Write Amplification'}; + return unless exists + $stats_ref->{'Measurements'}{'Total'}{'Drive Write Amplification'}; - my $drive_waf = $stats_ref->{'Drive Write Amplification'}; - my $app_write_bw = $stats_ref->{'MB/sec Write'}; - my $app_gb_written = $stats_ref->{'GB Write'}; + my $drive_waf = + $stats_ref->{'Measurements'}{'Total'}{'Drive Write Amplification'}; + my $app_write_bw = + $stats_ref->{'Measurements'}{'Total'}{'MB/sec Write'}; + my $app_gb_written = + $stats_ref->{'Measurements'}{'Total'}{'GB Write'}; - $stats_ref->{'NAND Writes (GB)'} = $app_gb_written * $drive_waf; + $stats_ref->{'Measurements'}{'Total'}{'NAND Writes (GB)'} = + $app_gb_written * $drive_waf; - $stats_ref->{'NAND Write BW (MB/sec)'} = $app_write_bw * $drive_waf - if exists $stats_ref->{'MB/sec Write'}; + $stats_ref->{'Measurements'}{'Total'}{'NAND Write BW (MB/sec)'} = + $app_write_bw * $drive_waf + if exists $stats_ref->{'Measurements'}{'Total'}{'MB/sec Write'}; } sub compute_dwpd($$) @@ -183,10 +196,10 @@ sub compute_dwpd($$) return unless exists $ddb_ref->{'Rated PE Cycles'} and - exists $stats_ref->{'Drive Write Amplification'}; + exists $stats_ref->{'Measurements'}{'Total'}{'Drive Write Amplification'}; my $rated_cycles = $ddb_ref->{'Rated PE Cycles'}; - my $waf = $stats_ref->{'Drive Write Amplification'}; + my $waf = $stats_ref->{'Measurements'}{'Total'}{'Drive Write Amplification'}; return unless $waf > 0; @@ -213,8 +226,10 @@ sub compute_dwpd($$) my $adjusted_cycles = $rated_cycles * ( $total_nand_bytes / $mapped_bytes ); - $stats_ref->{'DWPD 3yr'} = $adjusted_cycles / ( $waf * 3 * 365 ); - $stats_ref->{'DWPD 5yr'} = $adjusted_cycles / ( $waf * 5 * 365 ); + $stats_ref->{'Measurements'}{'Total'}{'DWPD 3yr'} = + $adjusted_cycles / ( $waf * 3 * 365 ); + $stats_ref->{'Measurements'}{'Total'}{'DWPD 5yr'} = + $adjusted_cycles / ( $waf * 5 * 365 ); } sub test_contains_writes($) @@ -222,9 +237,9 @@ sub test_contains_writes($) my $stats_ref = shift; die "Writes Mix is not defined\n" - unless exists $stats_ref->{'W Mix'}; + unless exists $stats_ref->{'Workloads'}{'Total'}{'W Mix'}; - return $stats_ref->{'W Mix'} > 0; + return $stats_ref->{'Workloads'}{'Total'}{'W Mix'} > 0; } 1; diff --git a/lib/LogmanParser.pm b/lib/LogmanParser.pm index 842a0d4..5214fc4 100644 --- a/lib/LogmanParser.pm +++ b/lib/LogmanParser.pm @@ -80,18 +80,20 @@ sub parse($$) if( $counter_name =~ /Processor Time/ ) { - $stats_ref->{'CPU Util'} = $average / 100; + $stats_ref->{'Measurements'}{'Total'}{'CPU Util'} = $average / 100; $cpu_seen = 1; } elsif( $counter_name =~ /Disk Queue Length/ ) { - $stats_ref->{'Measured QD'} = $average; + $stats_ref->{'Measurements'}{'Total'}{'Measured QD'} = $average; $qd_seen = 1; # Raise a warning if the percentage difference between # actual QD and measured QD exceeds 90% - my $target_qd = $stats_ref->{'QD'}; - my $measured_qd = $stats_ref->{'Measured QD'}; + my $target_qd = + $stats_ref->{'Workloads'}{'Total'}{'QD'}; + my $measured_qd = + $stats_ref->{'Measurements'}{'Total'}{'Measured QD'}; my $qd_threshold = 90; my $qd_diff = abs($target_qd - $measured_qd) / $target_qd * 100; @@ -105,11 +107,11 @@ sub parse($$) } elsif( $counter_name =~ /System Driver Total Bytes/ ) { - $stats_ref->{'Driver Memory (MB)'} = $average / ( 1024 * 1024 ); + $stats_ref->{'Measurements'}{'Total'}{'Driver Memory (MB)'} = $average / ( 1024 * 1024 ); } elsif( $counter_name =~ /System Driver Resident Bytes/ ) { - $stats_ref->{'Driver Resident Memory (MB)'} = $average / ( 1024 * 1024 ); + $stats_ref->{'Measurements'}{'Total'}{'Driver Resident Memory (MB)'} = $average / ( 1024 * 1024 ); } else { diff --git a/lib/Power.pm b/lib/Power.pm index 362d76c..15dc841 100644 --- a/lib/Power.pm +++ b/lib/Power.pm @@ -122,7 +122,7 @@ sub parse() $average = $sum / $count; } - $stats_ref->{'System Power (W)'} = $average; + $stats_ref->{'Measurements'}{'Total'}{'System Power (W)'} = $average; return 1; } diff --git a/lib/PreconditionRunner.pm b/lib/PreconditionRunner.pm index b3b9d11..abf6ae8 100644 --- a/lib/PreconditionRunner.pm +++ b/lib/PreconditionRunner.pm @@ -30,6 +30,7 @@ use strict; use warnings; use Moose; use Util; +use DiskSpdRunner; has 'target' => ( is => 'ro', @@ -95,12 +96,53 @@ sub write_num_passes sub run_to_steady_state($) { my $self = shift; - my %args = @_; my $msg_prefix = $args{'msg_prefix'}; - my $output_dir = $args{'output_dir'}; my $test_ref = $args{'test_ref'}; + my $output_dir = $args{'output_dir'}; + + # preconditioner.exe does not support multiple files + # Future work: implement preconditioning in diskspd + # and consolidate this + if( $test_ref->{'target_count'} > 1 ) + { + $self->run_with_diskspd( $msg_prefix, $test_ref, $output_dir ); + } + else + { + $self->run_with_preconditioner( $msg_prefix, $test_ref, $output_dir ); + } +} + +sub run_with_diskspd($$$) +{ + my $self = shift; + my $msg_prefix = shift; + my $test_ref = shift; + my $output_dir = shift; + + my $run_time = '3600'; + $run_time = '10' if ( $self->cmd_line->demo_mode ); + $run_time = '0' if ( $pretend ); + + print $msg_prefix . "static-length ($run_time sec)\n"; + + my $iogen = DiskSpdRunner->new( + target => $self->target, + cmd_line => $self->cmd_line, + output_dir => $output_dir + ); + + $iogen->run( $test_ref, 'precondition' ); +} + +sub run_with_preconditioner($$$) +{ + my $self = shift; + my $msg_prefix = shift; + my $test_ref = shift; + my $output_dir = shift; my $write_percentage = $test_ref->{'write_percentage'} // die; my $access_pattern = $test_ref->{'access_pattern'} // die; diff --git a/lib/Recipe.pm b/lib/Recipe.pm index 66a3232..7bb8c90 100644 --- a/lib/Recipe.pm +++ b/lib/Recipe.pm @@ -147,7 +147,13 @@ sub try_legalize_arguments } } - # N.B.: You can return zero here to skip this test + # skip multitarget tests that are ill-defined + if( $step_ref->{'target_count'} > 1 ) + { + return 0 unless $step_ref->{'xml_profile'}; + return 0 unless $self->cmd_line->io_generator eq 'diskspd'; + return 0 if $self->cmd_line->raw_disk; + } return 1; } @@ -183,6 +189,37 @@ sub warn_illegal_args warn "$msg\n\n"; } } + + # warn about poorly-defined multitarget tests + if( $step_ref->{'target_count'} > 1 ) + { + unless( $step_ref->{'xml_profile'} ) + { + my $msg = "\tWarning!\n"; + $msg .= "\tRecipe defines multiple targets and no xml profile.\n"; + $msg .= "\tSkipping step ". $self->current_step . "."; + + warn "$msg\n\n"; + } + + unless( $self->cmd_line->io_generator eq 'diskspd' ) + { + my $msg = "\tWarning!\n"; + $msg .= "\tMultitarget tests must use Diskspd.\n"; + $msg .= "\tSkipping step ". $self->current_step . "."; + + warn "$msg\n\n"; + } + + if( $self->cmd_line->raw_disk ) + { + my $msg = "\tWarning!\n"; + $msg .= "\tMultitarget tests cannot run without a file system.\n"; + $msg .= "\tSkipping step ". $self->current_step . "."; + + warn "$msg\n\n"; + } + } } sub canonicalize_step @@ -194,12 +231,16 @@ sub canonicalize_step return unless $kind ~~ [qw( test precondition )]; + $step_ref->{'target_count'} = $step_ref->{'target_count'} // 1; + # create read_percentage from write_percentage $step_ref->{'read_percentage'} = - 100 - $step_ref->{'write_percentage'}; + 100 - $step_ref->{'write_percentage'} + unless $step_ref->{'target_count'} > 1; # ensure description can be used as a unique filename - $step_ref->{'description'} = make_legal_filename( $step_ref->{'description'}); + $step_ref->{'description'} = + make_legal_filename( $step_ref->{'description'}); } sub apply_overrides @@ -210,13 +251,15 @@ sub apply_overrides my $kind = $step_ref->{'kind'}; - return unless $kind eq 'test'; + return unless $kind eq 'test' or 'precondition'; if( defined $self->cmd_line->test_time_override ) { $step_ref->{'run_time'} = $self->cmd_line->test_time_override; } + return unless $kind eq 'test'; + if( defined $self->cmd_line->warmup_time_override ) { $step_ref->{'warmup_time'} = $self->cmd_line->warmup_time_override; @@ -258,7 +301,7 @@ sub handle_step my $step_number = $self->current_step; my %step = make_step( $kind, $step_number, @step_args ); - + canonicalize_step( \%step ); $self->apply_overrides( \%step ); $self->warn_illegal_args( \%step ) if $do_warnings; @@ -283,17 +326,18 @@ sub handle_step $self->advance_current_step(); } - + return $scalar_retval if $context eq 'scalar'; return @list_retval if $context eq 'list'; } -sub generate_header($$$$) +sub generate_header($$$$$) { my $file_name = shift; my $package = shift; my $be_permissive = shift; - my $be_quiet = shift; + my $quiet_stderr = shift; + my $quiet_stdout = shift; my $header = <<"HEADER"; package $package; @@ -322,12 +366,15 @@ HEADER $header .= "no warnings 'uninitialized';\n"; } - if( $be_quiet ) + # Replace STDOUT and STDERR with NUL + if( $quiet_stderr ) { - # Replace STDOUT and STDERR with NUL - $header .= "local *STDOUT; open STDOUT, '>NUL';\n"; $header .= "local *STDERR; open STDERR, '>NUL';\n"; } + if( $quiet_stdout ) + { + $header .= "local *STDOUT; open STDOUT, '>NUL';\n"; + } # Improve the quality of diagnostic messages $header .= qq(\n# line 1 "$file_name"\n); @@ -354,7 +401,8 @@ sub execute_recipe my $recipe_warnings = $args{'recipe_warnings'} // 0; my $permissive_perl = $args{'permissive_perl'} // 0; - my $quiet_stdio = $args{'quiet_stdio'} // 0; + my $quiet_stderr = $args{'quiet_stderr'} // 0; + my $quiet_stdout = $args{'quiet_stdout'} // 0; state $eval_count = 0; @@ -414,7 +462,8 @@ sub execute_recipe $file_name, $package, $permissive_perl, - $quiet_stdio + $quiet_stderr, + $quiet_stdout ); $eval_string .= $recipe_str; @@ -445,7 +494,8 @@ sub execute_recipe $self->file_name, $package, $permissive_perl, - $quiet_stdio + $quiet_stderr, + $quiet_stdout ); $eval_string .= $self->recipe_string; @@ -466,22 +516,22 @@ sub execute_recipe sub check_unique_test_descriptions { - my $self = shift; + my $self = shift; - my %desc_hash = (); + my %desc_hash = (); - foreach my $step (@{$self->steps}) - { - - my $desc = $step->{'description'}; - if ( $desc && $step->{'kind'} eq "test" ) - { - die "Test description '$desc' is not unique" - if ( $desc_hash{ $desc } ); - $desc_hash{ $desc } = 1; - } - } + foreach my $step (@{$self->steps}) + { + + my $desc = $step->{'description'}; + if ( $desc && $step->{'kind'} eq "test" ) + { + die "Test description '$desc' is not unique" + if ( $desc_hash{ $desc } ); + $desc_hash{ $desc } = 1; + } + } } sub get_num_steps @@ -583,7 +633,7 @@ sub get_test_macro_string $str .= q( purge() if $args{'purge'} // 1; ) if $self->target->do_purge; - $str .= q( initialize() if $args{'initialize'} // 1; ) + $str .= q( initialize( %args ) if $args{'initialize'} // 1; ) if $self->target->do_initialize; $str .= q( precondition( %args ) if $args{'precondition'} // 1; ) @@ -641,7 +691,8 @@ sub BUILD $self->execute_recipe( recipe_warnings => 1, permissive_perl => 1, - quiet_stdio => 1, + quiet_stderr => 0, + quiet_stdout => 1, callback => sub { push @{$self->steps}, {@_}; } ); } @@ -687,20 +738,29 @@ sub get_announcement_message my $step_ref = shift; my $msg; - my $command = $step_ref->{'command'}; + my $command = $step_ref->{'command'}; if( $step_ref->{'kind'} eq 'test' ) { - my $short_pattern = - $step_ref->{'access_pattern'} eq "random" ? "rnd" : "seq"; - - $msg = sprintf( " %4s, %3s, %3d%% read, %3d%% wri, QD=%3d", - $step_ref->{'block_size'}, - $short_pattern, - $step_ref->{'read_percentage'}, - $step_ref->{'write_percentage'}, - $step_ref->{'queue_depth'} - ); + if( $step_ref->{'target_count'} > 1 ) + { + $msg = $step_ref->{'target_count'} . + "-target test using profile " . + $step_ref->{'xml_profile'}; + } + else + { + my $short_pattern = + $step_ref->{'access_pattern'} eq "random" ? "rnd" : "seq"; + + $msg = sprintf( " %4s, %3s, %3d%% read, %3d%% wri, QD=%3d", + $step_ref->{'block_size'}, + $short_pattern, + $step_ref->{'read_percentage'}, + $step_ref->{'write_percentage'}, + $step_ref->{'queue_depth'} + ); + } } elsif( $step_ref->{'kind'} eq 'idle' ) { @@ -788,6 +848,7 @@ sub run_step { $self->target->initialize( msg_prefix => $progress, + test_ref => $step_ref ); } elsif( $kind eq 'precondition' ) @@ -800,7 +861,7 @@ sub run_step } elsif( $kind eq 'test' ) { - $self->target->prepare() + $self->target->prepare( $step_ref ) unless $self->target->is_prepared(); unless( $pretend or $self->cmd_line->raw_disk ) diff --git a/lib/SmartCtlParser.pm b/lib/SmartCtlParser.pm index b767a2f..7a83184 100644 --- a/lib/SmartCtlParser.pm +++ b/lib/SmartCtlParser.pm @@ -148,15 +148,15 @@ sub parse_attributes($$$) if( $attribute_id == $host_writes ) { - $stats_ref->{"Host Writes$suffix"} = $raw_value; + $stats_ref->{'Measurements'}{'Total'}{"Host Writes$suffix"} = $raw_value; } elsif( $attribute_id == $ctrl_writes ) { - $stats_ref->{"Controller Writes$suffix"} = $raw_value; + $stats_ref->{'Measurements'}{'Total'}{"Controller Writes$suffix"} = $raw_value; } elsif( $attribute_id == $wear_range ) { - $stats_ref->{"Wear Range$suffix"} = $raw_value; + $stats_ref->{'Measurements'}{'Total'}{"Wear Range$suffix"} = $raw_value; } } diff --git a/lib/SqlioParser.pm b/lib/SqlioParser.pm index ff65836..aadf842 100644 --- a/lib/SqlioParser.pm +++ b/lib/SqlioParser.pm @@ -182,10 +182,11 @@ sub parse($$) process_percentiles( $stats_ref ); } -sub parse_cmd_line($$) +sub parse_workload($$$) { my $self = shift; + my $dir = shift; my $cmd_line = shift; my $stats_ref = shift; diff --git a/lib/StorageToolParser.pm b/lib/StorageToolParser.pm index 8b7f2da..8f6da50 100644 --- a/lib/StorageToolParser.pm +++ b/lib/StorageToolParser.pm @@ -162,7 +162,7 @@ sub parse_attributes($$$) { do_simple_extract( $line, - $stats_ref, + $stats_ref->{'Measurements'}{'Total'}, \@extract_rules_log_entries, suffix => $suffix ); } diff --git a/lib/Target.pm b/lib/Target.pm index f9d076d..80dbf24 100644 --- a/lib/Target.pm +++ b/lib/Target.pm @@ -369,6 +369,7 @@ sub purge sub prepare { my $self = shift; + my $test_ref = shift; return if $self->is_prepared; @@ -397,21 +398,30 @@ sub prepare # Support testing less then 100% of the disk $size = int( $size * $self->cmd_line->active_range / 100 ); - # Round to an even increment of 2MB. - # Idea is to ensure the file size is an even multiple - # of pretty much any block size we might test. - $size = int( $size / BYTES_IN_2MB ) * BYTES_IN_2MB; + my $file_count = $test_ref->{'target_count'} // 1; - $self->_file_name( $self->volume . "\\$TEST_FILE_NAME" ); + # Divide active range evenly among all files + $size = int( $size / $file_count ); - if( -e $self->file_name and not $pretend ) + for my $file_num ( 1 .. $file_count ) { - die "Error: target file " . $self->file_name . " exists!\n"; + # Round to an even increment of 2MB. + # Idea is to ensure the file size is an even multiple + # of pretty much any block size we might test. + $size = int( $size / BYTES_IN_2MB ) * BYTES_IN_2MB; + + my $file_name = $self->volume . "\\$TEST_FILE_STUB$file_num.dat"; + $self->_file_name( $file_name ); + + if( -e $self->file_name and not $pretend ) + { + die "Error: target file " . $self->file_name . " exists!\n"; + } + + fast_create_file( $self->file_name, $size ) + or die "Couldn't create $size byte file: " . + $self->file_name . "\n"; } - - fast_create_file( $self->file_name, $size ) - or die "Couldn't create $size byte file: " . - $self->file_name . "\n"; } if( defined $self->volume ) @@ -476,7 +486,7 @@ sub initialize if( defined $test_ref ) { # Future work: allow for custom init pattern - ... + # ... } unless( $self->do_initialize ) @@ -497,7 +507,7 @@ sub initialize return; } - $self->prepare() unless $self->is_prepared(); + $self->prepare( $test_ref ) unless $self->is_prepared(); $self->precondition_runner->write_num_passes( msg_prefix => $msg_prefix . "Initializing: ", @@ -515,7 +525,7 @@ sub precondition my $msg_prefix = $args{'msg_prefix'} // die; my $output_dir = $args{'output_dir'} // die; my $test_ref = $args{'test_ref'} // die; - + unless( $self->do_precondition ) { my $skip_requested = @@ -534,8 +544,8 @@ sub precondition return; } - $self->prepare() unless $self->is_prepared(); - + $self->prepare( $test_ref ) unless $self->is_prepared(); + $self->precondition_runner->run_to_steady_state( msg_prefix => $msg_prefix . "Preconditioning: ", output_dir => $output_dir, diff --git a/lib/Util.pm b/lib/Util.pm index 0520246..e7790cd 100644 --- a/lib/Util.pm +++ b/lib/Util.pm @@ -43,6 +43,22 @@ use Win32::API; use Win32::Process; use Encode; +use Module::Load::Conditional 'check_install'; + +if( check_install( module => 'XML::LibXML' ) ) +{ + # require runs at execution time, whereas use runs at compile time + require XML::LibXML; +} +else +{ + warn "The XML::LibXML package from CPAN is required and not installed.\n"; + warn "Please install it via command line:\n"; + warn "\t\$> ppm install XML::LibXML \\\\ for ActiveState perl installs\n"; + warn "\t\$> cpan XML::LibXML \\\\ for Strawberry perl installs\n"; + exit( -1 ); +} + no if $PERL_VERSION >= 5.017011, warnings => 'experimental::smartmatch'; @@ -59,7 +75,7 @@ use vars qw(@ISA @EXPORT); BYTES_PER_KB_BASE10 BYTES_PER_SECTOR BYTES_IN_2MB - $TEST_FILE_NAME + $TEST_FILE_STUB $script_name $script_dir $recipes_dir @@ -135,7 +151,7 @@ use constant BYTES_PER_KB_BASE10 => 1000; use constant BYTES_PER_SECTOR => 512; use constant BYTES_IN_2MB => 1024 * 1024 * 2; -our $TEST_FILE_NAME = 'testfile.dat'; +our $TEST_FILE_STUB = 'testfile'; our $script_name = basename( $PROGRAM_NAME, ".cmd" ); our $script_dir = dirname( $PROGRAM_NAME ); @@ -333,7 +349,7 @@ sub human_to_bytes($) return ( $human << 10 ) if $human =~ s/(\d+)\s*KB?$/$1/i; return $human if $human =~ s/(\d+)\s*B?$/$1/i; - die "Cannot parse the human-readable value"; + die "Cannot parse the human-readable value, \"$human\""; } sub human_to_kilobytes($) @@ -500,7 +516,7 @@ sub detect_scep_and_warn() You have the following options: - Run on a machine without SCEP - Disable SCEP real-time protection - - Exclude $TEST_FILE_NAME from SCEP scan. + - Exclude $TEST_FILE_STUB n.dat from SCEP scan. WARNING } diff --git a/parse_results.cmd b/parse_results.cmd index e1459ad..9528f7a 100644 --- a/parse_results.cmd +++ b/parse_results.cmd @@ -129,8 +129,9 @@ EXAMPLES END_USAGE } -sub parse_warmup_file($$) +sub parse_warmup_file($$$) { + my $dir = shift; my $file_name = shift; my $stats_ref = shift; @@ -138,7 +139,7 @@ sub parse_warmup_file($$) my %warmup_stats; - parse_test_file( $file_name, \%warmup_stats ); + parse_test_file( $dir, $file_name, \%warmup_stats ); # Inject into the main stats hash with "Warmup" prefix foreach my $key ( keys %warmup_stats ) @@ -179,8 +180,9 @@ sub parse_background_file($$) close $LOG; } -sub parse_test_file($$) +sub parse_test_file($$$) { + my $dir = shift; my $file_name = shift; my $stats_ref = shift; @@ -208,57 +210,64 @@ sub parse_test_file($$) die "Unknown IO generator\n"; } - $iogen->parse_cmd_line( $cmd_line, $stats_ref ); + $iogen->parse_workload( $dir, $cmd_line, $stats_ref ); $iogen->parse( $LOG, $stats_ref ); close $LOG; } -sub compute_rw_amounts($) +sub compute_rw_amounts($$) { - my $stats_ref = shift; + my $workload_stats = shift; + my $measurement_stats = shift; - my $total_IOs = $stats_ref->{'IOs Total'} // 0; - my $total_GB = $total_IOs * $stats_ref->{'Access Size'} / KB_PER_GB; - $stats_ref->{'GB Total'} = $total_GB; - - my $read_frac = $stats_ref->{'R Mix'} / 100; - my $write_frac = $stats_ref->{'W Mix'} / 100; + # aggregate data from multitarget test does not have one IO size + my $total_IOs = $measurement_stats->{'IOs Total'} // 0; + my $io_size = $workload_stats->{'Access Size'} // 0; + my $total_GB = $total_IOs * $io_size / KB_PER_GB; + + $measurement_stats->{'GB Total'} = $total_GB; + + my $read_frac = $workload_stats->{'R Mix'} / 100; + my $write_frac = $workload_stats->{'W Mix'} / 100; # The following are *estimates* (not measured) # If the workload generator measures this directly, do not overwrite - unless( exists $stats_ref->{'IOs Read'} ) + unless( exists $measurement_stats->{'IOs Read'} ) { - $stats_ref->{'IOs Read'} = $total_IOs * $read_frac; - $stats_ref->{'Notes'} .= "IOs Read is an estimate; "; + $measurement_stats->{'IOs Read'} = $total_IOs * $read_frac; + $measurement_stats->{'Notes'} .= "IOs Read is an estimate; "; } - unless( exists $stats_ref->{'IOs Write'} ) + unless( exists $measurement_stats->{'IOs Write'} ) { - $stats_ref->{'IOs Write'} = $total_IOs * $write_frac; - $stats_ref->{'Notes'} .= "IOs Write is an estimate; "; + $measurement_stats->{'IOs Write'} = $total_IOs * $write_frac; + $measurement_stats->{'Notes'} .= "IOs Write is an estimate; "; } - unless( exists $stats_ref->{'GB Read'} ) + unless( exists $measurement_stats->{'GB Read'} ) { - $stats_ref->{'GB Read'} = $total_GB * $read_frac; - $stats_ref->{'Notes'} .= "GB Read is an estimate; "; + $measurement_stats->{'GB Read'} = $total_GB * $read_frac; + $measurement_stats->{'Notes'} .= "GB Read is an estimate; "; } - unless( exists $stats_ref->{'GB Write'} ) + unless( exists $measurement_stats->{'GB Write'} ) { - $stats_ref->{'GB Write'} = $total_GB * $write_frac; - $stats_ref->{'Notes'} .= "GB Write is an estimate; "; + $measurement_stats->{'GB Write'} = $total_GB * $write_frac; + $measurement_stats->{'Notes'} .= "GB Write is an estimate; "; } + } -sub compute_steady_state_error_and_warn($) +sub compute_steady_state_error_and_warn($$$) { my $stats_ref = shift; + my $warmup_stats = shift; + my $measurement_stats = shift; - my $warmup_IOPS = $stats_ref->{'Warmup IOPS Total'}; - my $test_IOPS = $stats_ref->{'IOPS Total'}; + my $warmup_IOPS = $warmup_stats->{'IOPS Total'}; + my $test_IOPS = $measurement_stats->{'IOPS Total'}; return unless defined $warmup_IOPS; @@ -278,7 +287,7 @@ sub compute_steady_state_error_and_warn($) $stats_ref->{'Notes'} .= "No steady-state?; "; } - $stats_ref->{'Steady-State Error'} = $rel_diff; + $measurement_stats->{'Steady-State Error'} = $rel_diff; } sub get_timestamp_from_smart_file($) @@ -338,7 +347,9 @@ my @cols = { name => 'Display Name'}, { name => 'User Capacity (GB)' }, { name => 'Partition Size (GB)' }, + { name => 'Raw Disk' }, { name => 'Test Description' }, + { name => 'Target' }, { name => 'Timestamp', format => 'mm/dd/yyyy HH:mm:ss', @@ -365,6 +376,7 @@ my @cols = }, { name => 'Alignment', + type => 'io_pattern' }, { name => 'Access Type', @@ -684,6 +696,7 @@ sub parse_directories(@) generate_timestamp( $base_name, \%file_stats ); parse_warmup_file( + $dir, "warmup-$base_name.txt", \%file_stats ); @@ -694,13 +707,25 @@ sub parse_directories(@) ); parse_test_file( + $dir, $test_file_name, \%file_stats ); - compute_rw_amounts( \%file_stats ); - - compute_steady_state_error_and_warn( \%file_stats ); + foreach my $workload ( keys $file_stats{'Workloads'} ) + { + compute_rw_amounts( + $file_stats{'Workloads'}{$workload}, + $file_stats{'Measurements'}{$workload} + ); + + compute_steady_state_error_and_warn( + \%file_stats, + $file_stats{'Warmup Measurements'}{$workload}, + $file_stats{'Measurements'}{$workload} + ); + + } if( $try_precondition ) { @@ -780,11 +805,11 @@ sub parse_directories(@) } # When extracting, we store a statistic's value directly in a hash. -# Later, we might want to track other information related to that +# Later, we track other information related to that # statistic. For example, outlier status, or formatting rules. To # make this possible, but still enable straight-forward extraction, # we run this helper function post-extraction to create a 'value' -# namespace, making room for other things. +# namespace and to make room for other things. sub inject_value_namespace($) { # BEFORE: @@ -803,10 +828,26 @@ sub inject_value_namespace($) foreach my $key ( keys %$stats_ref ) { - my $value = $stats_ref->{$key}; - delete $stats_ref->{$key}; + if( $key =~ /Measurements/ or $key =~ /Workloads/ ) + { + foreach my $target ( keys $stats_ref->{$key} ) + { + foreach my $sub_key ( keys $stats_ref->{$key}{$target} ) + { + my $value = $stats_ref->{$key}{$target}{$sub_key}; + delete $stats_ref->{$key}{$target}{$sub_key}; - $stats_ref->{$key}{'value'} = $value; + $stats_ref->{$key}{$target}{$sub_key}{'value'} = $value; + } + } + } + else + { + my $value = $stats_ref->{$key}; + delete $stats_ref->{$key}; + + $stats_ref->{$key}{'value'} = $value; + } } } @@ -831,7 +872,7 @@ sub build_test_description_to_io_pattern_hash(@) next if defined $test_description_to_io_pattern{$test_desc}; my %fields = - map { $_ => $stats_ref->{$_} } get_io_pattern_cols(); + map { $_ => $stats_ref->{'Workloads'}{'Total'}{$_} } get_io_pattern_cols(); $test_description_to_io_pattern{$test_desc} = \%fields } @@ -859,11 +900,11 @@ sub inject_default_compressibility(@) foreach my $stats_ref ( @all_stats ) { my $directory = $stats_ref->{'Directory'}; - my $compress = $stats_ref->{'Compressibility'}; + my $compress = $stats_ref->{'Workloads'}{'Total'}{'Compressibility'}; $all_compress{$directory}{$compress}++; } - + my %default_compress; foreach my $directory ( keys %all_compress ) @@ -1203,7 +1244,7 @@ sub get_matching_values($$\@) return grep { defined $_ } # prune undefined vals - map { $_->{ $col_name }{'value'} } @matching; + map { $_->{'Measurements'}{'Total'}{ $col_name }{'value'} } @matching; } sub is_good_outlier($$$$) @@ -1234,9 +1275,8 @@ sub is_bad_outlier($$$$) ); } -sub find_outliers($\@) +sub find_outliers(\@) { - my $workbook = shift; my @all_stats = @{+shift}; my %outliers; @@ -1261,7 +1301,7 @@ sub find_outliers($\@) foreach my $test_stats ( filter_by_test_description( $test_desc, @all_stats ) ) { - my $val = $test_stats->{$col_name}{'value'}; + my $val = $test_stats->{'Measurements'}{'Total'}{$col_name}{'value'}; next unless defined $val; @@ -1368,46 +1408,60 @@ sub generate_raw_data_sheet($\@) foreach my $test_stats ( @all_stats ) { - my $col_num = 0; - - foreach my $col ( @cols ) + foreach my $target ( keys $test_stats->{'Workloads'} ) { - my $col_name = $col->{'name'}; - my $format_str = $col->{'format'}; - - my $value = $test_stats->{$col_name}{'value'}; - - if( defined $col->{'protect'} ) - { - $value = protect_excel_string( $value ); - } + my $col_num = 0; - # Convert Time::Piece object to Excel date format - if( ref $value eq 'Time::Piece' ) + foreach my $col ( @cols ) { - $value = unix_date_to_excel_date( $value->epoch ) - } + my $col_name = $col->{'name'}; + my $format_str = $col->{'format'}; + + my $value = $test_stats->{$col_name}{'value'}; + + # special-case entries + $value = $target if $col_name eq 'Target'; + $value = $test_stats->{'Warmup Measurements'}{$target}{'MB/sec Total'}{'value'} + if $col_name eq 'Warmup MB/sec Total'; + + # entries in the workload and measurement sub-arrays + $value = $test_stats->{'Workloads'}{$target}{$col_name}{'value'} + if exists $test_stats->{'Workloads'}{$target}{$col_name}; + $value = $test_stats->{'Measurements'}{$target}{$col_name}{'value'} + if exists $test_stats->{'Measurements'}{$target}{$col_name}; + + if( defined $col->{'protect'} ) + { + $value = protect_excel_string( $value ); + } - my $format_obj; + # Convert Time::Piece object to Excel date format + if( ref $value eq 'Time::Piece' ) + { + $value = unix_date_to_excel_date( $value->epoch ) + } - if( defined $format_str ) - { - $format_obj = - get_format_obj( $workbook, $test_stats, $col_name ); + my $format_obj; - $format_obj->set_num_format( $format_str ); - - # Our percentages are 0 to 100. Excel prefers 0.0 to 1.0. - $value /= 100 if defined $value and $format_str =~ /%/; + if( defined $format_str ) + { + $format_obj = + get_format_obj( $workbook, $test_stats, $col_name ); - } + $format_obj->set_num_format( $format_str ); + + # Our percentages are 0 to 100. Excel prefers 0.0 to 1.0. + $value /= 100 if defined $value and $format_str =~ /%/; - $raw_sheet->write( $row_num, $col_num, $value, $format_obj ); + } - $col_num++; - } + $raw_sheet->write( $row_num, $col_num, $value, $format_obj ); + + $col_num++; + } - $row_num++; + $row_num++; + } } $raw_sheet->autofilter( 0, 0, 0, $#cols ); @@ -1467,7 +1521,7 @@ sub extract_raw_scores(\@) my $metric = $col->{'name'}; - my $value = $test_stats->{$metric}{'value'}; + my $value = $test_stats->{'Measurements'}{'Total'}{$metric}{'value'}; # Every metric doesn't make sense for every test $raw_scores{$test_desc}{$metric}{$device_id} = $value @@ -1642,7 +1696,7 @@ sub compute_weights_as_fractions(\%) foreach my $test_desc ( @unique_test_descriptions ) { my %io_pattern = %{$test_description_to_io_pattern{$test_desc}}; - + foreach my $metric ( @metrics ) { $total_weight += $weight_func->( $metric, %io_pattern ); @@ -2013,15 +2067,21 @@ die "Nothing to do\n" unless scalar @all_stats > 0; post_process_stats( @all_stats ); +generate_raw_data_sheet( $workbook, @all_stats ); + +# process the data for outliers and scores print "Detecting outliers...\n"; -my %outliers = find_outliers( $workbook, @all_stats ); +my %outliers = find_outliers( @all_stats ); -print "Computing scores...\n"; +print "Writing XLSX file...\n"; +hilight_outliers( $workbook, %outliers, @all_stats ); -my $scores_invalid = 0; +print "Computing scores...\n"; my %raw_scores = extract_raw_scores( @all_stats ); +my $scores_invalid = 0; + unless( scores_hash_is_valid( %raw_scores ) ) { warn "Error while generating raw scores\n"; @@ -2045,8 +2105,6 @@ unless( scores_hash_is_valid( %normalized_scores ) ) warn "Error while generating normalized scores\n"; $scores_invalid = 1; } - -warn "Scores sheets will not be generated\n" if $scores_invalid; # Scoring policies compute a weight with arbitrary range. # Here we convert to a fractional weight between 0 and 1. @@ -2061,10 +2119,6 @@ my %final_scores = combine_scores( %weighted_score_components ); keys %final_scores == $num_input_dirs or warn "Warning: could not generate score for 1+ directories.\n"; -print "Writing XLSX file...\n"; -hilight_outliers( $workbook, %outliers, @all_stats ); -generate_raw_data_sheet( $workbook, @all_stats ); - generate_scores_sheets( $workbook, %raw_scores, @@ -2076,6 +2130,8 @@ generate_scores_sheets( ) unless $scores_invalid; +warn "Scores sheets will not be generated\n" if $scores_invalid; + $workbook->close() or die "Error closing workbook $outfile: $!\n"; print_sanitization_decoder_ring() if $sanitize; diff --git a/recipes/14hr_multitarget.rcp b/recipes/14hr_multitarget.rcp new file mode 100644 index 0000000..4586757 --- /dev/null +++ b/recipes/14hr_multitarget.rcp @@ -0,0 +1,56 @@ +# vim: set filetype=perl: + +# StorScore +# +# Copyright (c) Microsoft Corporation +# +# All rights reserved. +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +#include 'four_corners.rcp'; + +test( + description => "All Sequential Streams", + target_count => 64, + xml_profile => "64seq.xml", + initialize => 0, + warmup_time => 60, + run_time => 3600, +); + +test( + description => "Single Random Stream", + target_count => 64, + xml_profile => "63seq_1rand.xml", + initialize => 0, + warmup_time => 60, + run_time => 3600, +); + +test( + description => "Single Sequential Stream", + target_count => 64, + xml_profile => "1seq_63rand.xml", + initialize => 0, + warmup_time => 60, + run_time => 3600, +); diff --git a/recipes/xmlProfiles/1seq_63rand.xml b/recipes/xmlProfiles/1seq_63rand.xml new file mode 100644 index 0000000..688e6a7 --- /dev/null +++ b/recipes/xmlProfiles/1seq_63rand.xml @@ -0,0 +1,1490 @@ + + 0 + text + false + + + false + true + false + false + 0 + 0 + 1000 + 0 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + + + diff --git a/recipes/xmlProfiles/63seq_1rand.xml b/recipes/xmlProfiles/63seq_1rand.xml new file mode 100644 index 0000000..688e6a7 --- /dev/null +++ b/recipes/xmlProfiles/63seq_1rand.xml @@ -0,0 +1,1490 @@ + + 0 + text + false + + + false + true + false + false + 0 + 0 + 1000 + 0 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + + + diff --git a/recipes/xmlProfiles/64seq.xml b/recipes/xmlProfiles/64seq.xml new file mode 100644 index 0000000..50edf82 --- /dev/null +++ b/recipes/xmlProfiles/64seq.xml @@ -0,0 +1,1427 @@ + + 0 + text + false + + + false + true + false + false + 0 + 0 + 1000 + 0 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + 4096 + 100 + 1 + 1 + 0 + false + false + false + false + true + true + + random + + + false + 0 + 0 + 0 + 3 + + + + + diff --git a/recipes/xmlProfiles/sample.xml b/recipes/xmlProfiles/sample.xml new file mode 100644 index 0000000..484ab25 --- /dev/null +++ b/recipes/xmlProfiles/sample.xml @@ -0,0 +1,65 @@ + + 0 + text + false + + + false + true + false + false + 0 + 0 + 1000 + 0 + + + 4096 + 0 + false + false + false + false + true + true + + random + + + false + 4096 + 0 + 0 + 1 + 0 + 0 + 2 + 3 + + + 4096 + 0 + false + false + false + false + true + true + + random + + + false + 4096 + 0 + 0 + 1 + 0 + 0 + 2 + 3 + + + + + diff --git a/recipes/xml_sample.rcp b/recipes/xml_sample.rcp new file mode 100644 index 0000000..1352739 --- /dev/null +++ b/recipes/xml_sample.rcp @@ -0,0 +1,46 @@ +# vim: set filetype=perl: + +# StorScore +# +# Copyright (c) Microsoft Corporation +# +# All rights reserved. +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +test( + description => "Multitarget Sample" + target_count => 2, + xml_profile => "sample.xml", + initialize => 0, + warmup_time => 5, + run_time => 60, +); + +test( + description => "4k Random Reads", + write_percentage => 0, + access_pattern => 'random', + block_size => '4K', + queue_depth => 1, + warmup_time => 10, + run_time => 60, +);