# # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # include $(SRC)/Makefile.master ROOTOPTPKG = $(ROOT)/opt/zfs-tests TARGETDIR = $(ROOTOPTPKG)/tests/perf include $(SRC)/test/zfs-tests/Makefile.com include $(SRC)/test/Makefile.com # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # include $(SRC)/Makefile.master ROOTOPTPKG = $(ROOT)/opt/zfs-tests TARGETDIR = $(ROOTOPTPKG)/tests/perf/fio include $(SRC)/test/zfs-tests/Makefile.com # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2016 by Delphix. All rights reserved. # [global] filename_format=file$jobnum group_reporting=1 fallocate=0 ioengine=psync bs=1024k rw=write thread=1 directory=${DIRECTORY} numjobs=${NUMJOBS} filesize=${FILE_SIZE} buffer_compress_percentage=66 buffer_compress_chunk=4096 [job] # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2016 by Delphix. All rights reserved. # [global] filename_format=file$jobnum group_reporting=1 fallocate=0 overwrite=0 thread=1 rw=randread time_based=1 directory=${DIRECTORY} runtime=${RUNTIME} bs=${BLOCKSIZE} ioengine=psync sync=${SYNC_TYPE} numjobs=${NUMJOBS} [job] # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # [global] filename_format=file$jobnum nrfiles=16 group_reporting=1 fallocate=0 overwrite=0 thread=1 rw=randrw rwmixread=80 time_based=1 directory=${DIRECTORY} runtime=${RUNTIME} bssplit=4k/50:8k/30:128k/10:1m/10 ioengine=psync sync=${SYNC_TYPE} numjobs=${NUMJOBS} buffer_compress_percentage=66 buffer_compress_chunk=4096 [job] # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2017 by Delphix. All rights reserved. # [global] filename_format=file$jobnum nrfiles=16 group_reporting=1 fallocate=0 overwrite=0 thread=1 rw=randrw rwmixread=70 time_based=1 directory=${DIRECTORY} runtime=${RUNTIME} bs=${BLOCKSIZE} ioengine=psync sync=${SYNC_TYPE} numjobs=${NUMJOBS} buffer_compress_percentage=66 buffer_compress_chunk=4096 [job] # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # [global] filename_format=file$jobnum group_reporting=1 fallocate=0 thread=1 rw=randwrite time_based=1 directory=${DIRECTORY} runtime=${RUNTIME} bs=${BLOCKSIZE} ioengine=psync sync=${SYNC_TYPE} numjobs=${NUMJOBS} filesize=${FILESIZE} buffer_compress_percentage=66 buffer_compress_chunk=4096 [job] # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2016 by Delphix. All rights reserved. # [global] filename_format=file$jobnum group_reporting=1 fallocate=0 overwrite=0 thread=1 rw=read time_based=1 directory=${DIRECTORY} runtime=${RUNTIME} bs=${BLOCKSIZE} ioengine=psync sync=${SYNC_TYPE} numjobs=${NUMJOBS} [job] # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # [global] filename_format=file$jobnum group_reporting=1 fallocate=0 thread=1 rw=write time_based=1 directory=${DIRECTORY} runtime=${RUNTIME} bs=${BLOCKSIZE} ioengine=psync sync=${SYNC_TYPE} numjobs=${NUMJOBS} filesize=${FILESIZE} buffer_compress_percentage=66 buffer_compress_chunk=4096 [job] # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # . $STF_SUITE/include/libtest.shlib # If neither is specified, do a nightly run. [[ -z $PERF_REGRESSION_WEEKLY ]] && export PERF_REGRESSION_NIGHTLY=1 # Default runtime for each type of test run. export PERF_RUNTIME_WEEKLY=$((30 * 60)) export PERF_RUNTIME_NIGHTLY=$((10 * 60)) # Default fs creation options export PERF_FS_OPTS=${PERF_FS_OPTS:-'-o recsize=8k -o compress=lz4' \ ' -o checksum=sha256 -o redundant_metadata=most'} function get_sync_str { typeset sync=$1 typeset sync_str='' [[ $sync -eq 0 ]] && sync_str='async' [[ $sync -eq 1 ]] && sync_str='sync' echo $sync_str } function get_suffix { typeset threads=$1 typeset sync=$2 typeset iosize=$3 typeset sync_str=$(get_sync_str $sync) typeset filesystems=$(get_nfilesystems) typeset suffix="$sync_str.$iosize-ios" suffix="$suffix.$threads-threads.$filesystems-filesystems" echo $suffix } function do_fio_run_impl { typeset script=$1 typeset do_recreate=$2 typeset clear_cache=$3 typeset threads=$4 typeset threads_per_fs=$5 typeset sync=$6 typeset iosize=$7 typeset sync_str=$(get_sync_str $sync) log_note "Running with $threads $sync_str threads, $iosize ios" if [[ -n $threads_per_fs && $threads_per_fs -ne 0 ]]; then log_must test $do_recreate verify_threads_per_fs $threads $threads_per_fs fi if $do_recreate; then recreate_perf_pool # # A value of zero for "threads_per_fs" is "special", and # means a single filesystem should be used, regardless # of the number of threads. # if [[ -n $threads_per_fs && $threads_per_fs -ne 0 ]]; then populate_perf_filesystems $((threads / threads_per_fs)) else populate_perf_filesystems 1 fi fi if $clear_cache; then # Clear the ARC zpool export $PERFPOOL zpool import $PERFPOOL fi if [[ -n $ZINJECT_DELAYS ]]; then apply_zinject_delays else log_note "No per-device commands to execute." fi # # Allow this to be overridden by the individual test case. This # can be used to run the FIO job against something other than # the default filesystem (e.g. against a clone). # export DIRECTORY=$(get_directory) log_note "DIRECTORY: " $DIRECTORY export RUNTIME=$PERF_RUNTIME export FILESIZE=$((TOTAL_SIZE / threads)) export NUMJOBS=$threads export SYNC_TYPE=$sync export BLOCKSIZE=$iosize sync # This will be part of the output filename. typeset suffix=$(get_suffix $threads $sync $iosize) # Start the data collection do_collect_scripts $suffix # Define output file typeset logbase="$(get_perf_output_dir)/$(basename \ $SUDO_COMMAND)" typeset outfile="$logbase.fio.$suffix" # Start the load log_must fio --output $outfile $FIO_SCRIPTS/$script } # # This function will run fio in a loop, according to the .fio file passed # in and a number of environment variables. The following variables can be # set before launching zfstest to override the defaults. # # PERF_RUNTIME: The time in seconds each fio invocation should run. # PERF_RUNTYPE: A human readable tag that appears in logs. The defaults are # nightly and weekly. # PERF_NTHREADS: A list of how many threads each fio invocation will use. # PERF_SYNC_TYPES: Whether to use (O_SYNC) or not. 1 is sync IO, 0 is async IO. # PERF_IOSIZES: A list of blocksizes in which each fio invocation will do IO. # PERF_COLLECT_SCRIPTS: A comma delimited list of 'command args, logfile_tag' # pairs that will be added to the scripts specified in each test. # function do_fio_run { typeset script=$1 typeset do_recreate=$2 typeset clear_cache=$3 typeset threads threads_per_fs sync iosize for threads in $PERF_NTHREADS; do for threads_per_fs in $PERF_NTHREADS_PER_FS; do for sync in $PERF_SYNC_TYPES; do for iosize in $PERF_IOSIZES; do do_fio_run_impl \ $script \ $do_recreate \ $clear_cache \ $threads \ $threads_per_fs \ $sync \ $iosize done done done done } # # This function iterates through the value pairs in $PERF_COLLECT_SCRIPTS. # The script at index N is launched in the background, with its output # redirected to a logfile containing the tag specified at index N + 1. # function do_collect_scripts { typeset suffix=$1 [[ -n $collect_scripts ]] || log_fail "No data collection scripts." [[ -n $PERF_RUNTIME ]] || log_fail "No runtime specified." # Add in user supplied scripts and logfiles, if any. typeset oIFS=$IFS IFS=',' for item in $PERF_COLLECT_SCRIPTS; do collect_scripts+=($(echo $item | sed 's/^ *//g')) done IFS=$oIFS typeset idx=0 while [[ $idx -lt "${#collect_scripts[@]}" ]]; do typeset logbase="$(get_perf_output_dir)/$(basename \ $SUDO_COMMAND)" typeset outfile="$logbase.${collect_scripts[$idx + 1]}.$suffix" timeout $PERF_RUNTIME ${collect_scripts[$idx]} >$outfile 2>&1 & ((idx += 2)) done # Need to explicitly return 0 because timeout(1) will kill # a child process and cause us to return non-zero. return 0 } # Find a place to deposit performance data collected while under load. function get_perf_output_dir { typeset dir="$(pwd)/perf_data" [[ -d $dir ]] || mkdir -p $dir echo $dir } function apply_zinject_delays { typeset idx=0 while [[ $idx -lt "${#ZINJECT_DELAYS[@]}" ]]; do [[ -n ${ZINJECT_DELAYS[$idx]} ]] || \ log_must "No zinject delay found at index: $idx" for disk in $DISKS; do log_must zinject \ -d $disk -D ${ZINJECT_DELAYS[$idx]} $PERFPOOL done ((idx += 1)) done } function clear_zinject_delays { log_must zinject -c all } # # Destroy and create the pool used for performance tests. # function recreate_perf_pool { [[ -n $PERFPOOL ]] || log_fail "The \$PERFPOOL variable isn't set." # # In case there's been some "leaked" zinject delays, or if the # performance test injected some delays itself, we clear all # delays before attempting to destroy the pool. Each delay # places a hold on the pool, so the destroy will fail if there # are any outstanding delays. # clear_zinject_delays # # This function handles the case where the pool already exists, # and will destroy the previous pool and recreate a new pool. # create_pool $PERFPOOL $DISKS } function verify_threads_per_fs { typeset threads=$1 typeset threads_per_fs=$2 log_must test -n $threads log_must test -n $threads_per_fs # # A value of "0" is treated as a "special value", and it is # interpreted to mean all threads will run using a single # filesystem. # [[ $threads_per_fs -eq 0 ]] && return # # The number of threads per filesystem must be a value greater # than or equal to zero; since we just verified the value isn't # 0 above, then it must be greater than zero here. # log_must test $threads_per_fs -ge 0 # # This restriction can be lifted later if needed, but for now, # we restrict the number of threads per filesystem to a value # that evenly divides the thread count. This way, the threads # will be evenly distributed over all the filesystems. # log_must test $((threads % threads_per_fs)) -eq 0 } function populate_perf_filesystems { typeset nfilesystems=${1:-1} export TESTFS="" for i in $(seq 1 $nfilesystems); do typeset dataset="$PERFPOOL/fs$i" create_dataset $dataset $PERF_FS_OPTS if [[ -z "$TESTFS" ]]; then TESTFS="$dataset" else TESTFS="$TESTFS $dataset" fi done } function get_nfilesystems { typeset filesystems=( $TESTFS ) echo ${#filesystems[@]} } function get_directory { typeset filesystems=( $TESTFS ) typeset directory= typeset idx=0 while [[ $idx -lt "${#filesystems[@]}" ]]; do mountpoint=$(get_prop mountpoint "${filesystems[$idx]}") if [[ -n $directory ]]; then directory=$directory:$mountpoint else directory=$mountpoint fi ((idx += 1)) done echo $directory } function get_max_arc_size { typeset -l max_arc_size=$(dtrace -qn 'BEGIN { printf("%u\n", `arc_stats.arcstat_c_max.value.ui64); exit(0); }') [[ $? -eq 0 ]] || log_fail "get_max_arc_size failed" echo $max_arc_size } function get_max_dbuf_cache_size { typeset -l max_dbuf_cache_size=$(dtrace -qn 'BEGIN { printf("%lu\n", `dbuf_cache_max_bytes); exit(0); }') [[ $? -eq 0 ]] || log_fail "get_max_dbuf_cache_size failed" echo $max_dbuf_cache_size } # Create a file with some information about how this system is configured. function get_system_config { typeset config=$PERF_DATA_DIR/$1 echo "{" >>$config dtrace -qn 'BEGIN{ printf(" \"ncpus\": %d,\n", `ncpus); printf(" \"physmem\": %u,\n", `physmem * `_pagesize); printf(" \"c_max\": %u,\n", `arc_stats.arcstat_c_max.value.ui64); printf(" \"kmem_flags\": \"0x%x\",", `kmem_flags); exit(0)}' >>$config echo " \"hostname\": \"$(uname -n)\"," >>$config echo " \"kernel version\": \"$(uname -v)\"," >>$config iostat -En | awk 'BEGIN { printf(" \"disks\": {\n"); first = 1} /^c/ {disk = $1} /^Size: [^0]/ {size = $2; if (first != 1) {printf(",\n")} else {first = 0} printf(" \"%s\": \"%s\"", disk, size)} END {printf("\n },\n")}' >>$config sed -n 's/^set \(.*\)[ ]=[ ]\(.*\)/\1=\2/p' /etc/system | \ awk -F= 'BEGIN {printf(" \"system\": {\n"); first = 1} {if (first != 1) {printf(",\n")} else {first = 0}; printf(" \"%s\": %s", $1, $2)} END {printf("\n }\n")}' >>$config echo "}" >>$config } function num_jobs_by_cpu { typeset ncpu=$(psrinfo | wc -l) typeset num_jobs=$ncpu [[ $ncpu -gt 8 ]] && num_jobs=$(echo "$ncpu * 3 / 4" | bc) echo $num_jobs } function pool_to_lun_list { typeset pool=$1 typeset ctd ctds devname lun typeset lun_list=':' ctds=$(zpool list -v $pool | awk '/c[0-9]*t[0-9a-fA-F]*d[0-9]*/ \ {print $1}') for ctd in $ctds; do # Get the device name as it appears in /etc/path_to_inst devname=$(readlink -f /dev/dsk/${ctd}s0 | sed -n \ 's/\/devices\([^:]*\):.*/\1/p') # Add a string composed of the driver name and instance # number to the list for comparison with dev_statname. lun=$(sed 's/"//g' /etc/path_to_inst | grep $devname | awk \ '{print $3$2}') lun_list="$lun_list$lun:" done echo $lun_list } # Create a perf_data directory to hold performance statistics and # configuration information. export PERF_DATA_DIR=$(get_perf_output_dir) [[ -f $PERF_DATA_DIR/config.json ]] || get_system_config config.json # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # include $(SRC)/Makefile.master ROOTOPTPKG = $(ROOT)/opt/zfs-tests TARGETDIR = $(ROOTOPTPKG)/tests/perf/regression include $(SRC)/test/zfs-tests/Makefile.com #!/usr/bin/ksh # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # # # Description: # Trigger fio runs using the random_reads job file. The number of runs and # data collected is determined by the PERF_* variables. See do_fio_run for # details about these variables. # # The files to read from are created prior to the first fio run, and used # for all fio runs. The ARC is cleared with `zinject -a` prior to each run # so reads will go to disk. # # Thread/Concurrency settings: # PERF_NTHREADS defines the number of files created in the test filesystem, # as well as the number of threads that will simultaneously drive IO to # those files. The settings chosen are from measurements in the # PerfAutoESX/ZFSPerfESX Environments, selected at concurrency levels that # are at peak throughput but lowest latency. Higher concurrency introduces # queue time latency and would reduce the impact of code-induced performance # regressions. # . $STF_SUITE/include/libtest.shlib . $STF_SUITE/tests/perf/perf.shlib function cleanup { recreate_perf_pool } log_onexit cleanup recreate_perf_pool populate_perf_filesystems # Aim to fill the pool to 50% capacity while accounting for a 3x compressratio. export TOTAL_SIZE=$(($(get_prop avail $PERFPOOL) * 3 / 2)) # Variables for use by fio. if [[ -n $PERF_REGRESSION_WEEKLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_WEEKLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'weekly'} export PERF_NTHREADS=${PERF_NTHREADS:-'8 16 32 64'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'8k 64k 128k'} elif [[ -n $PERF_REGRESSION_NIGHTLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_NIGHTLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'nightly'} export PERF_NTHREADS=${PERF_NTHREADS:-'16 32'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'8k'} fi # Layout the files to be used by the read tests. Create as many files as the # largest number of threads. An fio run with fewer threads will use a subset # of the available files. export NUMJOBS=$(get_max $PERF_NTHREADS) export FILE_SIZE=$((TOTAL_SIZE / NUMJOBS)) export DIRECTORY=$(get_directory) log_must fio $FIO_SCRIPTS/mkfiles.fio # Set up the scripts and output files that will log performance data. lun_list=$(pool_to_lun_list $PERFPOOL) log_note "Collecting backend IO stats with lun list $lun_list" export collect_scripts=( "kstat zfs:0 1" "kstat" "vmstat -T d 1" "vmstat" "mpstat -T d 1" "mpstat" "iostat -T d -xcnz 1" "iostat" "dtrace -Cs $PERF_SCRIPTS/io.d $PERFPOOL $lun_list 1" "io" "dtrace -s $PERF_SCRIPTS/profile.d" "profile" ) log_note "Random reads with $PERF_RUNTYPE settings" do_fio_run random_reads.fio false true log_pass "Measure IO stats during random read load" #!/usr/bin/ksh # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # # # Description: # Trigger fio runs using the random_readwrite job file. The number of runs and # data collected is determined by the PERF_* variables. See do_fio_run for # details about these variables. # # The files to read and write from are created prior to the first fio run, # and used for all fio runs. The ARC is cleared with `zinject -a` prior to # each run so reads will go to disk. # # Thread/Concurrency settings: # PERF_NTHREADS defines the number of files created in the test filesystem, # as well as the number of threads that will simultaneously drive IO to # those files. The settings chosen are from measurements in the # PerfAutoESX/ZFSPerfESX Environments, selected at concurrency levels that # are at peak throughput but lowest latency. Higher concurrency introduces # queue time latency and would reduce the impact of code-induced performance # regressions. # . $STF_SUITE/include/libtest.shlib . $STF_SUITE/tests/perf/perf.shlib function cleanup { recreate_perf_pool } log_onexit cleanup recreate_perf_pool populate_perf_filesystems # Aim to fill the pool to 50% capacity while accounting for a 3x compressratio. export TOTAL_SIZE=$(($(get_prop avail $PERFPOOL) * 3 / 2)) # Variables for use by fio. if [[ -n $PERF_REGRESSION_WEEKLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_WEEKLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'weekly'} export PERF_NTHREADS=${PERF_NTHREADS:-'4 8 16 64'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'0 1'} export PERF_IOSIZES='' # bssplit used instead elif [[ -n $PERF_REGRESSION_NIGHTLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_NIGHTLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'nightly'} export PERF_NTHREADS=${PERF_NTHREADS:-'32 64'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES='' # bssplit used instead fi # Layout the files to be used by the readwrite tests. Create as many files # as the largest number of threads. An fio run with fewer threads will use # a subset of the available files. export NUMJOBS=$(get_max $PERF_NTHREADS) export FILE_SIZE=$((TOTAL_SIZE / NUMJOBS)) export DIRECTORY=$(get_directory) log_must fio $FIO_SCRIPTS/mkfiles.fio # Set up the scripts and output files that will log performance data. lun_list=$(pool_to_lun_list $PERFPOOL) log_note "Collecting backend IO stats with lun list $lun_list" export collect_scripts=( "kstat zfs:0 1" "kstat" "vmstat 1" "vmstat" "mpstat 1" "mpstat" "iostat -xcnz 1" "iostat" "dtrace -Cs $PERF_SCRIPTS/io.d $PERFPOOL $lun_list 1" "io" "dtrace -s $PERF_SCRIPTS/profile.d" "profile" ) log_note "Random reads and writes with $PERF_RUNTYPE settings" do_fio_run random_readwrite.fio false true log_pass "Measure IO stats during random read and write load" #!/usr/bin/ksh # file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2017 by Delphix. All rights reserved. # # # Description: # Trigger fio runs using the random_readwrite_fixed job file. The number of runs and # data collected is determined by the PERF_* variables. See do_fio_run for # details about these variables. # # The files to read and write from are created prior to the first fio run, # and used for all fio runs. The ARC is cleared with `zinject -a` prior to # each run so reads will go to disk. # . $STF_SUITE/include/libtest.shlib . $STF_SUITE/tests/perf/perf.shlib function cleanup { recreate_perf_pool } log_onexit cleanup recreate_perf_pool populate_perf_filesystems # Aim to fill the pool to 50% capacity while accounting for a 3x compressratio. export TOTAL_SIZE=$(($(get_prop avail $PERFPOOL) * 3 / 2)) # Variables for use by fio. if [[ -n $PERF_REGRESSION_WEEKLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_WEEKLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'weekly'} export PERF_NTHREADS=${PERF_NTHREADS:-'8 16 32 64'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'0 1'} export PERF_IOSIZES='8k 64k' elif [[ -n $PERF_REGRESSION_NIGHTLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_NIGHTLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'nightly'} export PERF_NTHREADS=${PERF_NTHREADS:-'64 128'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES='8k' fi # Layout the files to be used by the readwrite tests. Create as many files # as the largest number of threads. An fio run with fewer threads will use # a subset of the available files. export NUMJOBS=$(get_max $PERF_NTHREADS) export FILE_SIZE=$((TOTAL_SIZE / NUMJOBS)) export DIRECTORY=$(get_directory) log_must fio $FIO_SCRIPTS/mkfiles.fio # Set up the scripts and output files that will log performance data. lun_list=$(pool_to_lun_list $PERFPOOL) log_note "Collecting backend IO stats with lun list $lun_list" export collect_scripts=( "kstat zfs:0 1" "kstat" "vmstat -T d 1" "vmstat" "mpstat -T d 1" "mpstat" "iostat -T d -xcnz 1" "iostat" "dtrace -Cs $PERF_SCRIPTS/io.d $PERFPOOL $lun_list 1" "io" "dtrace -s $PERF_SCRIPTS/profile.d" "profile" ) log_note "Random reads and writes with $PERF_RUNTYPE settings" do_fio_run random_readwrite_fixed.fio false true log_pass "Measure IO stats during random read and write load" #!/usr/bin/ksh # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # # # Description: # Trigger fio runs using the random_writes job file. The number of runs and # data collected is determined by the PERF_* variables. See do_fio_run for # details about these variables. # # Prior to each fio run the dataset is recreated, and fio writes new files # into an otherwise empty pool. # # Thread/Concurrency settings: # PERF_NTHREADS defines the number of files created in the test filesystem, # as well as the number of threads that will simultaneously drive IO to # those files. The settings chosen are from measurements in the # PerfAutoESX/ZFSPerfESX Environments, selected at concurrency levels that # are at peak throughput but lowest latency. Higher concurrency introduces # queue time latency and would reduce the impact of code-induced performance # regressions. # . $STF_SUITE/include/libtest.shlib . $STF_SUITE/tests/perf/perf.shlib function cleanup { recreate_perf_pool } log_onexit cleanup recreate_perf_pool populate_perf_filesystems # Aim to fill the pool to 50% capacity while accounting for a 3x compressratio. export TOTAL_SIZE=$(($(get_prop avail $PERFPOOL) * 3 / 2)) # Variables for use by fio. if [[ -n $PERF_REGRESSION_WEEKLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_WEEKLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'weekly'} export PERF_NTHREADS=${PERF_NTHREADS:-'1 4 8 16 32 64 128'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'0 1'} export PERF_IOSIZES=${PERF_IOSIZES:-'8k 64k 256k'} elif [[ -n $PERF_REGRESSION_NIGHTLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_NIGHTLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'nightly'} export PERF_NTHREADS=${PERF_NTHREADS:-'32 128'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'8k'} fi # Set up the scripts and output files that will log performance data. lun_list=$(pool_to_lun_list $PERFPOOL) log_note "Collecting backend IO stats with lun list $lun_list" export collect_scripts=( "kstat zfs:0 1" "kstat" "vmstat -T d 1" "vmstat" "mpstat -T d 1" "mpstat" "iostat -T d -xcnz 1" "iostat" "dtrace -Cs $PERF_SCRIPTS/io.d $PERFPOOL $lun_list 1" "io" "dtrace -s $PERF_SCRIPTS/profile.d" "profile" ) log_note "Random writes with $PERF_RUNTYPE settings" do_fio_run random_writes.fio true false log_pass "Measure IO stats during random write load" #!/usr/bin/ksh # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # . $STF_SUITE/include/libtest.shlib . $STF_SUITE/tests/perf/perf.shlib function cleanup { # # We're using many filesystems depending on the number of # threads for each test, and there's no good way to get a list # of all the filesystems that should be destroyed on cleanup # (i.e. the list of filesystems used for the last test ran). # Thus, we simply recreate the pool as a way to destroy all # filesystems and leave a fresh pool behind. # recreate_perf_pool } log_onexit cleanup recreate_perf_pool # Aim to fill the pool to 50% capacity while accounting for a 3x compressratio. export TOTAL_SIZE=$(($(get_prop avail $PERFPOOL) * 3 / 2)) if [[ -n $PERF_REGRESSION_WEEKLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_WEEKLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'weekly'} export PERF_NTHREADS=${PERF_NTHREADS:-'1 2 4 8 16 32 64 128'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0 1'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'8k'} elif [[ -n $PERF_REGRESSION_NIGHTLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_NIGHTLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'nightly'} export PERF_NTHREADS=${PERF_NTHREADS:-'1 4 16 64'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0 1'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'8k'} fi lun_list=$(pool_to_lun_list $PERFPOOL) log_note "Collecting backend IO stats with lun list $lun_list" export collect_scripts=( "kstat zfs:0 1" "kstat" "vmstat -T d 1" "vmstat" "mpstat -T d 1" "mpstat" "iostat -T d -xcnz 1" "iostat" "dtrace -Cs $PERF_SCRIPTS/io.d $PERFPOOL $lun_list 1" "io" "dtrace -s $PERF_SCRIPTS/zil.d $PERFPOOL 1" "zil" "dtrace -s $PERF_SCRIPTS/profile.d" "profile" "dtrace -s $PERF_SCRIPTS/offcpu-profile.d" "offcpu-profile" ) log_note "ZIL specific random write workload with $PERF_RUNTYPE settings" do_fio_run random_writes.fio true false log_pass "Measure IO stats during ZIL specific random write workload" #!/usr/bin/ksh # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # # # Description: # Trigger fio runs using the sequential_reads job file. The number of runs and # data collected is determined by the PERF_* variables. See do_fio_run for # details about these variables. # # The files to read from are created prior to the first fio run, and used # for all fio runs. The ARC is cleared with `zinject -a` prior to each run # so reads will go to disk. # # Thread/Concurrency settings: # PERF_NTHREADS defines the number of files created in the test filesystem, # as well as the number of threads that will simultaneously drive IO to # those files. The settings chosen are from measurements in the # PerfAutoESX/ZFSPerfESX Environments, selected at concurrency levels that # are at peak throughput but lowest latency. Higher concurrency introduces # queue time latency and would reduce the impact of code-induced performance # regressions. # . $STF_SUITE/include/libtest.shlib . $STF_SUITE/tests/perf/perf.shlib function cleanup { recreate_perf_pool } log_onexit cleanup recreate_perf_pool populate_perf_filesystems # Aim to fill the pool to 50% capacity while accounting for a 3x compressratio. export TOTAL_SIZE=$(($(get_prop avail $PERFPOOL) * 3 / 2)) # Variables for use by fio. if [[ -n $PERF_REGRESSION_WEEKLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_WEEKLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'weekly'} export PERF_NTHREADS=${PERF_NTHREADS:-'8 16 32 64'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'8k 64k 128k'} elif [[ -n $PERF_REGRESSION_NIGHTLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_NIGHTLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'nightly'} export PERF_NTHREADS=${PERF_NTHREADS:-'8 16'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'128k 1m'} fi # Layout the files to be used by the read tests. Create as many files as the # largest number of threads. An fio run with fewer threads will use a subset # of the available files. export NUMJOBS=$(get_max $PERF_NTHREADS) export FILE_SIZE=$((TOTAL_SIZE / NUMJOBS)) export DIRECTORY=$(get_directory) log_must fio $FIO_SCRIPTS/mkfiles.fio # Set up the scripts and output files that will log performance data. lun_list=$(pool_to_lun_list $PERFPOOL) log_note "Collecting backend IO stats with lun list $lun_list" export collect_scripts=( "kstat zfs:0 1" "kstat" "vmstat -T d 1" "vmstat" "mpstat -T d 1" "mpstat" "iostat -T d -xcnz 1" "iostat" "dtrace -Cs $PERF_SCRIPTS/io.d $PERFPOOL $lun_list 1" "io" "dtrace -Cs $PERF_SCRIPTS/prefetch_io.d $PERFPOOL 1" "prefetch" "dtrace -s $PERF_SCRIPTS/profile.d" "profile" ) log_note "Sequential reads with $PERF_RUNTYPE settings" do_fio_run sequential_reads.fio false true log_pass "Measure IO stats during sequential read load" #!/usr/bin/ksh # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # # # Description: # Trigger fio runs using the sequential_reads job file. The number of runs and # data collected is determined by the PERF_* variables. See do_fio_run for # details about these variables. # # The files to read from are created prior to the first fio run, and used # for all fio runs. The ARC is not cleared to ensure that all data is cached. # . $STF_SUITE/include/libtest.shlib . $STF_SUITE/tests/perf/perf.shlib function cleanup { recreate_perf_pool } log_onexit cleanup recreate_perf_pool populate_perf_filesystems # Make sure the working set can be cached in the arc. Aim for 1/2 of arc. export TOTAL_SIZE=$(($(get_max_arc_size) / 2)) # Variables for use by fio. if [[ -n $PERF_REGRESSION_WEEKLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_WEEKLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'weekly'} export PERF_NTHREADS=${PERF_NTHREADS:-'8 16 32 64'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'8k 64k 128k'} elif [[ -n $PERF_REGRESSION_NIGHTLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_NIGHTLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'nightly'} export PERF_NTHREADS=${PERF_NTHREADS:-'64 128'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'128k 1m'} fi # Layout the files to be used by the read tests. Create as many files as the # largest number of threads. An fio run with fewer threads will use a subset # of the available files. export NUMJOBS=$(get_max $PERF_NTHREADS) export FILE_SIZE=$((TOTAL_SIZE / NUMJOBS)) export DIRECTORY=$(get_directory) log_must fio $FIO_SCRIPTS/mkfiles.fio # Set up the scripts and output files that will log performance data. lun_list=$(pool_to_lun_list $PERFPOOL) log_note "Collecting backend IO stats with lun list $lun_list" export collect_scripts=( "kstat zfs:0 1" "kstat" "vmstat -T d 1" "vmstat" "mpstat -T d 1" "mpstat" "iostat -T d -xcnz 1" "iostat" "dtrace -Cs $PERF_SCRIPTS/io.d $PERFPOOL $lun_list 1" "io" "dtrace -Cs $PERF_SCRIPTS/prefetch_io.d $PERFPOOL 1" "prefetch" "dtrace -s $PERF_SCRIPTS/profile.d" "profile" ) log_note "Sequential cached reads with $PERF_RUNTYPE settings" do_fio_run sequential_reads.fio false false log_pass "Measure IO stats during sequential cached read load" #!/usr/bin/ksh # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # # # Description: # Trigger fio runs using the sequential_reads job file. The number of runs and # data collected is determined by the PERF_* variables. See do_fio_run for # details about these variables. # # The files to read from are created prior to the first fio run, and used # for all fio runs. This test will exercise cached read performance from # a clone filesystem. The data is initially cached in the ARC and then # a snapshot and clone are created. All the performance runs are then # initiated against the clone filesystem to exercise the performance of # reads when the ARC has to create another buffer from a different dataset. # It will also exercise the need to evict the duplicate buffer once the last # reference on that buffer is released. # . $STF_SUITE/include/libtest.shlib . $STF_SUITE/tests/perf/perf.shlib function cleanup { recreate_perf_pool } log_onexit cleanup recreate_perf_pool populate_perf_filesystems # Make sure the working set can be cached in the arc. Aim for 1/2 of arc. export TOTAL_SIZE=$(($(get_max_arc_size) / 2)) # Variables for use by fio. if [[ -n $PERF_REGRESSION_WEEKLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_WEEKLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'weekly'} export PERF_NTHREADS=${PERF_NTHREADS:-'8 16 32 64'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'8k 64k 128k'} elif [[ -n $PERF_REGRESSION_NIGHTLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_NIGHTLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'nightly'} export PERF_NTHREADS=${PERF_NTHREADS:-'64 128'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'128k 1m'} fi # Layout the files to be used by the read tests. Create as many files as the # largest number of threads. An fio run with fewer threads will use a subset # of the available files. export NUMJOBS=$(get_max $PERF_NTHREADS) export FILE_SIZE=$((TOTAL_SIZE / NUMJOBS)) export DIRECTORY=$(get_directory) log_must fio $FIO_SCRIPTS/mkfiles.fio # # Only a single filesystem is used by this test. To be defensive, we # double check that TESTFS only contains a single filesystem. We # wouldn't want to assume this was the case, and have it actually # contain multiple filesystem (causing cascading failures later). # log_must test $(get_nfilesystems) -eq 1 log_note "Creating snapshot, $TESTSNAP, of $TESTFS" create_snapshot $TESTFS $TESTSNAP log_note "Creating clone, $PERFPOOL/$TESTCLONE, from $TESTFS@$TESTSNAP" create_clone $TESTFS@$TESTSNAP $PERFPOOL/$TESTCLONE # # We want to run FIO against the clone we created above, and not the # clone's originating filesystem. Thus, we override the default behavior # and explicitly set TESTFS to the clone. # export TESTFS=$PERFPOOL/$TESTCLONE # Set up the scripts and output files that will log performance data. lun_list=$(pool_to_lun_list $PERFPOOL) log_note "Collecting backend IO stats with lun list $lun_list" export collect_scripts=( "kstat zfs:0 1" "kstat" "vmstat -T d 1" "vmstat" "mpstat -T d 1" "mpstat" "iostat -T d -xcnz 1" "iostat" "dtrace -Cs $PERF_SCRIPTS/io.d $PERFPOOL $lun_list 1" "io" "dtrace -Cs $PERF_SCRIPTS/prefetch_io.d $PERFPOOL 1" "prefetch" "dtrace -s $PERF_SCRIPTS/profile.d" "profile" ) log_note "Sequential cached reads from $DIRECTORY with $PERF_RUNTYPE settings" do_fio_run sequential_reads.fio false false log_pass "Measure IO stats during sequential cached read load" #!/usr/bin/ksh # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2016 by Delphix. All rights reserved. # # # Description: # Trigger fio runs using the sequential_reads job file. The number of runs and # data collected is determined by the PERF_* variables. See do_fio_run for # details about these variables. # # The files to read from are created prior to the first fio run, and used # for all fio runs. The ARC is not cleared to ensure that all data is cached. # # This is basically a copy of the sequential_reads_cached test case, but with # a smaller dateset so that we can fit everything into the decompressed, linear # space in the dbuf cache. # . $STF_SUITE/include/libtest.shlib . $STF_SUITE/tests/perf/perf.shlib function cleanup { recreate_perf_pool } log_onexit cleanup recreate_perf_pool populate_perf_filesystems # Ensure the working set can be cached in the dbuf cache. export TOTAL_SIZE=$(($(get_max_dbuf_cache_size) * 3 / 4)) # Variables for use by fio. if [[ -n $PERF_REGRESSION_WEEKLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_WEEKLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'weekly'} export PERF_NTHREADS=${PERF_NTHREADS:-'8 16 32 64'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'8k 64k 128k'} elif [[ -n $PERF_REGRESSION_NIGHTLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_NIGHTLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'nightly'} export PERF_NTHREADS=${PERF_NTHREADS:-'64'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'64k'} fi # Layout the files to be used by the read tests. Create as many files as the # largest number of threads. An fio run with fewer threads will use a subset # of the available files. export NUMJOBS=$(get_max $PERF_NTHREADS) export FILE_SIZE=$((TOTAL_SIZE / NUMJOBS)) export DIRECTORY=$(get_directory) log_must fio $FIO_SCRIPTS/mkfiles.fio # Set up the scripts and output files that will log performance data. lun_list=$(pool_to_lun_list $PERFPOOL) log_note "Collecting backend IO stats with lun list $lun_list" export collect_scripts=( "kstat zfs:0 1" "kstat" "vmstat 1" "vmstat" "mpstat 1" "mpstat" "iostat -xcnz 1" "iostat" "dtrace -Cs $PERF_SCRIPTS/io.d $PERFPOOL $lun_list 1" "io" "dtrace -Cs $PERF_SCRIPTS/prefetch_io.d $PERFPOOL 1" "prefetch" "dtrace -s $PERF_SCRIPTS/profile.d" "profile" ) log_note "Sequential cached reads with $PERF_RUNTYPE settings" do_fio_run sequential_reads.fio false false log_pass "Measure IO stats during sequential cached read load" #!/usr/bin/ksh # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # # # Description: # Trigger fio runs using the sequential_writes job file. The number of runs and # data collected is determined by the PERF_* variables. See do_fio_run for # details about these variables. # # Prior to each fio run the dataset is recreated, and fio writes new files # into an otherwise empty pool. # # Thread/Concurrency settings: # PERF_NTHREADS defines the number of files created in the test filesystem, # as well as the number of threads that will simultaneously drive IO to # those files. The settings chosen are from measurements in the # PerfAutoESX/ZFSPerfESX Environments, selected at concurrency levels that # are at peak throughput but lowest latency. Higher concurrency introduces # queue time latency and would reduce the impact of code-induced performance # regressions. # . $STF_SUITE/include/libtest.shlib . $STF_SUITE/tests/perf/perf.shlib log_onexit cleanup function cleanup { recreate_perf_pool } recreate_perf_pool populate_perf_filesystems # Aim to fill the pool to 50% capacity while accounting for a 3x compressratio. export TOTAL_SIZE=$(($(get_prop avail $PERFPOOL) * 3 / 2)) # Variables for use by fio. if [[ -n $PERF_REGRESSION_WEEKLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_WEEKLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'weekly'} export PERF_NTHREADS=${PERF_NTHREADS:-'1 4 8 16 32 64 128'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'0 1'} export PERF_IOSIZES=${PERF_IOSIZES:-'8k 64k 256k'} elif [[ -n $PERF_REGRESSION_NIGHTLY ]]; then export PERF_RUNTIME=${PERF_RUNTIME:-$PERF_RUNTIME_NIGHTLY} export PERF_RUNTYPE=${PERF_RUNTYPE:-'nightly'} export PERF_NTHREADS=${PERF_NTHREADS:-'16 32'} export PERF_NTHREADS_PER_FS=${PERF_NTHREADS_PER_FS:-'0'} export PERF_SYNC_TYPES=${PERF_SYNC_TYPES:-'1'} export PERF_IOSIZES=${PERF_IOSIZES:-'8k 128k 1m'} fi # Set up the scripts and output files that will log performance data. lun_list=$(pool_to_lun_list $PERFPOOL) log_note "Collecting backend IO stats with lun list $lun_list" export collect_scripts=( "kstat zfs:0 1" "kstat" "vmstat -T d 1" "vmstat" "mpstat -T d 1" "mpstat" "iostat -T d -xcnz 1" "iostat" "dtrace -Cs $PERF_SCRIPTS/io.d $PERFPOOL $lun_list 1" "io" "dtrace -s $PERF_SCRIPTS/profile.d" "profile" ) log_note "Sequential writes with $PERF_RUNTYPE settings" do_fio_run sequential_writes.fio true false log_pass "Measure IO stats during sequential write load" #!/usr/bin/ksh # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015 by Delphix. All rights reserved. # . $STF_SUITE/include/libtest.shlib verify_runnable "global" verify_disk_count "$DISKS" 3 log_pass # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # Copyright (c) 2015, 2016 by Delphix. All rights reserved. # include $(SRC)/Makefile.master ROOTOPTPKG = $(ROOT)/opt/zfs-tests TARGETDIR = $(ROOTOPTPKG)/tests/perf/scripts include $(SRC)/test/zfs-tests/Makefile.com /* * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. * You may only use this file in accordance with the terms of version * 1.0 of the CDDL. * * A full copy of the text of the CDDL should have accompanied this * source. A copy of the CDDL is also available via the Internet at * http://www.illumos.org/license/CDDL. */ /* * Copyright (c) 2013, 2016 by Delphix. All rights reserved. */ /* * This measures the IO operations as seen by the ZPL layer (e.g. * zfs_read and zfs_write), as well as the underlying block layer (e.g. * the "io" dtrace provider). * * time: The number of seconds elapsed since the epoch * @ops: collects the count of each metric (e.g. count of zfs_read calls) * @latencies: collects the latency information of each metric * @histograms: collects histograms of the latency for each metric * @bytes: collects the throughput information for each metric */ #include #include #pragma D option aggsortkey #pragma D option quiet BEGIN { @ops["read"] = count(); @ops["write"] = count(); @ops["zfs_read"] = count(); @ops["zfs_write"] = count(); @ops["zfs_write_sync"] = count(); @ops["zfs_write_async"] = count(); @latencies["read"] = avg(0); @latencies["write"] = avg(0); @latencies["zfs_read"] = avg(0); @latencies["zfs_write"] = avg(0); @latencies["zfs_write_sync"] = avg(0); @latencies["zfs_write_async"] = avg(0); @histograms["read"] = quantize(0); @histograms["write"] = quantize(0); @histograms["zfs_read"] = quantize(0); @histograms["zfs_write"] = quantize(0); @histograms["zfs_write_sync"] = quantize(0); @histograms["zfs_write_async"] = quantize(0); @bytes["read"] = sum(0); @bytes["write"] = sum(0); @bytes["zfs_read"] = sum(0); @bytes["zfs_write"] = sum(0); @bytes["zfs_write_sync"] = sum(0); @bytes["zfs_write_async"] = sum(0); clear(@ops); clear(@latencies); clear(@histograms); clear(@bytes); } fbt:zfs:zfs_read:entry, fbt:zfs:zfs_write:entry { this->zp = (znode_t *)args[0]->v_data; self->os = this->zp->z_zfsvfs->z_os; self->poolname = stringof(self->os->os_spa->spa_name); } fbt:zfs:zfs_read:entry, fbt:zfs:zfs_write:entry / self->poolname == $$1 / { self->zfs_rw = timestamp; self->bytes = args[1]->uio_resid; } fbt:zfs:zfs_write:entry / self->zfs_rw != 0 / { self->flag = self->os->os_sync == ZFS_SYNC_ALWAYS ? "sync" : (args[2] & (FSYNC | FDSYNC)) ? "sync" : "async"; } fbt:zfs:zfs_write:return / self->zfs_rw != 0 / { if (self->flag == "sync") { this->name = "zfs_write_sync" } else { this->name = "zfs_write_async" } @ops[this->name] = count(); @bytes[this->name] = sum(self->bytes); this->elapsed = timestamp - self->zfs_rw; @latencies[this->name] = avg(this->elapsed); @histograms[this->name] = quantize(this->elapsed); } fbt:zfs:zfs_read:return, fbt:zfs:zfs_write:return / self->zfs_rw != 0 / { @ops[probefunc] = count(); @bytes[probefunc] = sum(self->bytes); this->elapsed = timestamp - self->zfs_rw; @latencies[probefunc] = avg(this->elapsed); @histograms[probefunc] = quantize(this->elapsed); self->zfs_rw = 0; } io:::start / strstr($$2, args[1]->dev_statname) != NULL / { start[args[0]->b_edev, args[0]->b_blkno] = timestamp; } io:::done / start[args[0]->b_edev, args[0]->b_blkno] / { this->elapsed = timestamp - start[args[0]->b_edev, args[0]->b_blkno]; this->name = args[0]->b_flags & B_READ ? "read" : "write"; @ops[this->name] = count(); @bytes[this->name] = sum(args[0]->b_bcount); @latencies[this->name] = avg(this->elapsed); @histograms[this->name] = quantize(this->elapsed); start[args[0]->b_edev, args[0]->b_blkno] = 0; } tick-$3s { printf("%u\n", `time); printa("ops_%-21s%@u\n", @ops); printa("bytes_%-21s%@u\n", @bytes); printa("latencies_%-21s%@u\n", @latencies); printa("histograms_%-21s%@u\n", @histograms); clear(@ops); clear(@bytes); clear(@latencies); clear(@histograms); } ERROR { trace(arg1); trace(arg2); trace(arg3); trace(arg4); trace(arg5); } /* * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. * You may only use this file in accordance with the terms of version * 1.0 of the CDDL. * * A full copy of the text of the CDDL should have accompanied this * source. A copy of the CDDL is also available via the Internet at * http://www.illumos.org/license/CDDL. */ /* * Copyright (c) 2016 by Delphix. All rights reserved. */ #pragma D option stackframes=100 /* * @stacks: The number of times a stack has been recorded */ sched:::off-cpu { self->ts = timestamp; } sched:::on-cpu / self->ts != 0 / { @stacks[stack()] = sum(timestamp - self->ts); self->ts = 0; } ERROR { trace(arg1); trace(arg2); trace(arg3); trace(arg4); trace(arg5); } /* * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. * You may only use this file in accordance with the terms of version * 1.0 of the CDDL. * * A full copy of the text of the CDDL should have accompanied this * source. A copy of the CDDL is also available via the Internet at * http://www.illumos.org/license/CDDL. */ /* * Copyright (c) 2015, 2016 by Delphix. All rights reserved. */ /* * prefetch_ios: Number of IOs the prefetcher issued * @c["prefetched_demand_reads"]: Number of demand reads already prefetched * @c["sync_wait_for_async"]: Number of times sync IO waited for prefetch IO * @s["demand"]: Number of non-prefetch read IOs * @s["logical"]: Logical (uncompressed) bytes read per interval * @s["physical"]: Physical (compressed) bytes read per interval */ #pragma D option aggsortkey #pragma D option quiet #define SPA_MINBLOCKSHIFT 9 #define ARC_FLAGS_PREFETCH (1 << 3) #define HDR_GET_LSIZE(hdr) ((hdr)->b_lsize << SPA_MINBLOCKSHIFT) #define HDR_GET_PSIZE(hdr) ((hdr)->b_psize << SPA_MINBLOCKSHIFT) BEGIN { prefetch_ios = `arc_stats.arcstat_prefetch_data_misses.value.ui64; prefetch_ios += `arc_stats.arcstat_prefetch_metadata_misses.value.ui64; @s["demand"] = sum(0); @s["logical"] = sum(0); @s["physical"] = sum(0); @c["prefetched_demand_reads"] = count(); @c["sync_wait_for_async"] = count(); clear(@s); clear(@c); } arc_read:arc-demand-hit-predictive-prefetch { @c["prefetched_demand_reads"] = count(); } arc_read:arc-upgrade-sync { @c["async_upgrade_sync"] = count(); } arc_read_done:entry / args[0]->io_spa->spa_name == $$1 / { this->zio = args[0]; this->hdr = (arc_buf_hdr_t *)this->zio->io_private; @s["demand"] = sum(this->hdr->b_flags & ARC_FLAGS_PREFETCH ? 0 : 1); @s["logical"] = sum(HDR_GET_LSIZE(this->hdr)); @s["physical"] = sum(HDR_GET_PSIZE(this->hdr)); } tick-$2s { this->new_prefetch_ios = `arc_stats.arcstat_prefetch_data_misses.value.ui64 + `arc_stats.arcstat_prefetch_metadata_misses.value.ui64; printf("%u\n%-24s\t%u\n", `time, "prefetch_ios", this->new_prefetch_ios - prefetch_ios); printa("%-24s\t%@u\n", @s); printa("%-24s\t%@u\n", @c); prefetch_ios = this->new_prefetch_ios; clear(@s); clear(@c); } ERROR { trace(arg1); trace(arg2); trace(arg3); trace(arg4); trace(arg5); } /* * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. * You may only use this file in accordance with the terms of version * 1.0 of the CDDL. * * A full copy of the text of the CDDL should have accompanied this * source. A copy of the CDDL is also available via the Internet at * http://www.illumos.org/license/CDDL. */ /* * Copyright (c) 2016 by Delphix. All rights reserved. */ #pragma D option stackframes=100 /* * @stacks: The number of times a stack has been recorded */ profile-997 / arg0 / { @stacks[stack()] = count(); } ERROR { trace(arg1); trace(arg2); trace(arg3); trace(arg4); trace(arg5); } /* * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. * You may only use this file in accordance with the terms of version * 1.0 of the CDDL. * * A full copy of the text of the CDDL should have accompanied this * source. A copy of the CDDL is also available via the Internet at * http://www.illumos.org/license/CDDL. */ /* * Copyright (c) 2016, 2018 by Delphix. All rights reserved. */ /* * This measures metrics that relate to the performance of the ZIL. * * The "zil_commit" and "zil_commit_writer" fuctions are instrumented. * For each function, the number of times each function is called is * tracked, as well as the average latency for function, and a histogram * of the latencies for each function. */ #pragma D option aggsortkey #pragma D option quiet BEGIN { @c["zil_commit"] = count(); @a["zil_commit"] = avg(0); @h["zil_commit"] = quantize(0); @c["zil_commit_writer"] = count(); @a["zil_commit_writer"] = avg(0); @h["zil_commit_writer"] = quantize(0); clear(@c); clear(@a); clear(@h); } fbt:zfs:zil_commit:entry / args[0]->zl_spa->spa_name == $$1 / { self->zc_elapsed = timestamp; } fbt:zfs:zil_commit:return / self->zc_elapsed / { @c[probefunc] = count(); @a[probefunc] = avg(timestamp - self->zc_elapsed); @h[probefunc] = quantize(timestamp - self->zc_elapsed); self->zc_elapsed = 0; } fbt:zfs:zil_commit_writer:entry / self->zc_elapsed && args[0]->zl_spa->spa_name == $$1 / { self->zcw_elapsed = timestamp; } fbt:zfs:zil_commit_writer:return / self->zcw_elapsed / { @c[probefunc] = count(); @a[probefunc] = avg(timestamp - self->zcw_elapsed); @h[probefunc] = quantize(timestamp - self->zcw_elapsed); self->zcw_elapsed = 0; } tick-$2s { printf("%u\n", `time); printa("counts_%-21s %@u\n", @c); printa("avgs_%-21s %@u\n", @a); printa("histograms_%-21s %@u\n", @h); clear(@c); clear(@a); clear(@h); } ERROR { trace(arg1); trace(arg2); trace(arg3); trace(arg4); trace(arg5); }