From ef57371a92367394108a5f65cee3c00d50101a4d Mon Sep 17 00:00:00 2001 From: Tony Nguyen Date: Fri, 7 Dec 2018 11:51:42 -0700 Subject: [PATCH] Do not enable stack tracer for ZFS performance test Linux ZFS test suite runs with /proc/sys/kernel/stack_tracer_enabled=1, via zfs.sh script, which has negative performance impact, up to 40%. Since large stack is a rare issue now, preferred behavior would be: - making stack tracer an opt-in feature for zfs.sh - zfs-test.sh enables stack tracer only when requested Reviewed-by: George Melikov Reviewed-by: Richard Elling Reviewed-by: John Kennedy Signed-off-by: Tony Nguyen #8173 --- scripts/zfs-tests.sh | 16 +++++++++++++--- scripts/zfs.sh | 11 ++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/scripts/zfs-tests.sh b/scripts/zfs-tests.sh index 6fdd658f7..cc80909ff 100755 --- a/scripts/zfs-tests.sh +++ b/scripts/zfs-tests.sh @@ -35,6 +35,7 @@ QUIET= CLEANUP="yes" CLEANUPALL="no" LOOPBACK="yes" +STACK_TRACER="no" FILESIZE="4G" RUNFILE=${RUNFILE:-"linux.run"} FILEDIR=${FILEDIR:-/var/tmp} @@ -254,7 +255,7 @@ constrain_path() { usage() { cat << EOF USAGE: -$0 [hvqxkf] [-s SIZE] [-r RUNFILE] [-t PATH] [-u USER] +$0 [hvqxkfS] [-s SIZE] [-r RUNFILE] [-t PATH] [-u USER] DESCRIPTION: ZFS Test Suite launch script @@ -266,6 +267,7 @@ OPTIONS: -x Remove all testpools, dm, lo, and files (unsafe) -k Disable cleanup after test failure -f Use files only, disables block device tests + -S Enable stack tracer (negative performance impact) -c Only create and populate constrained path -I NUM Number of iterations -d DIR Use DIR for files and loopback devices @@ -289,7 +291,7 @@ $0 -x EOF } -while getopts 'hvqxkfcd:s:r:?t:T:u:I:' OPTION; do +while getopts 'hvqxkfScd:s:r:?t:T:u:I:' OPTION; do case $OPTION in h) usage @@ -311,6 +313,9 @@ while getopts 'hvqxkfcd:s:r:?t:T:u:I:' OPTION; do f) LOOPBACK="no" ;; + S) + STACK_TRACER="yes" + ;; c) constrain_path exit @@ -449,7 +454,11 @@ constrain_path # # Verify the ZFS module stack is loaded. # -sudo "${ZFS_SH}" &>/dev/null +if [ "$STACK_TRACER" = "yes" ]; then + sudo "${ZFS_SH}" -S &>/dev/null +else + sudo "${ZFS_SH}" &>/dev/null +fi # # Attempt to cleanup all previous state for a new test run. @@ -561,6 +570,7 @@ msg "NUM_DISKS: $NUM_DISKS" msg "FILESIZE: $FILESIZE" msg "ITERATIONS: $ITERATIONS" msg "TAGS: $TAGS" +msg "STACK_TRACER: $STACK_TRACER" msg "Keep pool(s): $KEEP" msg "Missing util(s): $STF_MISSING_BIN" msg "" diff --git a/scripts/zfs.sh b/scripts/zfs.sh index d975eca97..015b3ba9d 100755 --- a/scripts/zfs.sh +++ b/scripts/zfs.sh @@ -14,6 +14,7 @@ fi PROG=zfs.sh VERBOSE="no" UNLOAD="no" +STACK_TRACER="no" ZED_PIDFILE=${ZED_PIDFILE:-/var/run/zed.pid} LDMOD=${LDMOD:-/sbin/modprobe} @@ -33,7 +34,7 @@ KMOD_ZFS=${KMOD_ZFS:-zfs} usage() { cat << EOF USAGE: -$0 [hvud] [module-options] +$0 [hvudS] [module-options] DESCRIPTION: Load/unload the ZFS module stack. @@ -42,10 +43,11 @@ OPTIONS: -h Show this message -v Verbose -u Unload modules + -S Enable kernel stack tracer EOF } -while getopts 'hvu' OPTION; do +while getopts 'hvuS' OPTION; do case $OPTION in h) usage @@ -57,6 +59,9 @@ while getopts 'hvu' OPTION; do u) UNLOAD="yes" ;; + S) + STACK_TRACER="yes" + ;; ?) usage exit @@ -192,7 +197,7 @@ stack_clear() { STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size STACK_TRACER_ENABLED=/proc/sys/kernel/stack_tracer_enabled - if [ -e "$STACK_MAX_SIZE" ]; then + if [ "$STACK_TRACER" = "yes" ] && [ -e "$STACK_MAX_SIZE" ]; then echo 1 >"$STACK_TRACER_ENABLED" echo 0 >"$STACK_MAX_SIZE" fi