* memory leak tests @ 2012-12-16 18:23 david 2012-12-16 18:23 ` [PATCH 1/4] perf-test: remove redunant "initial notmuch new" david ` (3 more replies) 0 siblings, 4 replies; 7+ messages in thread From: david @ 2012-12-16 18:23 UTC (permalink / raw) To: notmuch These are slightly rough around the edges, but I think they are useful. They already helped me track down a memory leak in notmuch new (id:1355234087-6886-1-git-send-email-david@tethera.net, id:1355196820-29734-1-git-send-email-david@tethera.net) They also would have caught the restore leak Jani pointed out in parse_sup_line, although that is a bit of hindsight since I didn't write the obvious test until Jani pointed out the leak. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/4] perf-test: remove redunant "initial notmuch new" 2012-12-16 18:23 memory leak tests david @ 2012-12-16 18:23 ` david 2012-12-16 18:23 ` [PATCH 2/4] perf-test: rename current tests as "time tests" david ` (2 subsequent siblings) 3 siblings, 0 replies; 7+ messages in thread From: david @ 2012-12-16 18:23 UTC (permalink / raw) To: notmuch; +Cc: David Bremner From: David Bremner <bremner@debian.org> The initial notmuch-new and caching are now done automatically by time_start --- performance-test/00-new | 4 ---- 1 file changed, 4 deletions(-) diff --git a/performance-test/00-new b/performance-test/00-new index 6f0b50c..553bb8b 100755 --- a/performance-test/00-new +++ b/performance-test/00-new @@ -8,10 +8,6 @@ uncache_database time_start -time_run 'initial notmuch new' 'notmuch new' - -cache_database - for i in $(seq 2 6); do time_run "notmuch new #$i" 'notmuch new' done -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/4] perf-test: rename current tests as "time tests" 2012-12-16 18:23 memory leak tests david 2012-12-16 18:23 ` [PATCH 1/4] perf-test: remove redunant "initial notmuch new" david @ 2012-12-16 18:23 ` david 2012-12-16 18:23 ` [PATCH 3/4] perf-test: initial version of memory test infrastructure david 2012-12-16 18:23 ` [PATCH 4/4] perf-test: add memory leak test for dump restore david 3 siblings, 0 replies; 7+ messages in thread From: david @ 2012-12-16 18:23 UTC (permalink / raw) To: notmuch; +Cc: David Bremner From: David Bremner <bremner@debian.org> This is almost entirely renaming files, except for updating a few references to those file names, and changing the makefile target. A new set of memory tests will be run separately because they take much longer. --- performance-test/00-new | 15 --------------- performance-test/01-dump-restore | 13 ------------- performance-test/02-tag | 14 -------------- performance-test/Makefile.local | 2 +- performance-test/README | 9 +++++---- performance-test/T00-new | 15 +++++++++++++++ performance-test/T01-dump-restore | 13 +++++++++++++ performance-test/T02-tag | 14 ++++++++++++++ performance-test/notmuch-perf-test | 27 --------------------------- performance-test/notmuch-time-test | 27 +++++++++++++++++++++++++++ 10 files changed, 75 insertions(+), 74 deletions(-) delete mode 100755 performance-test/00-new delete mode 100755 performance-test/01-dump-restore delete mode 100755 performance-test/02-tag create mode 100755 performance-test/T00-new create mode 100755 performance-test/T01-dump-restore create mode 100755 performance-test/T02-tag delete mode 100755 performance-test/notmuch-perf-test create mode 100755 performance-test/notmuch-time-test diff --git a/performance-test/00-new b/performance-test/00-new deleted file mode 100755 index 553bb8b..0000000 --- a/performance-test/00-new +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -test_description='notmuch new' - -. ./perf-test-lib.sh - -uncache_database - -time_start - -for i in $(seq 2 6); do - time_run "notmuch new #$i" 'notmuch new' -done - -time_done diff --git a/performance-test/01-dump-restore b/performance-test/01-dump-restore deleted file mode 100755 index b2ff940..0000000 --- a/performance-test/01-dump-restore +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -test_description='dump and restore' - -. ./perf-test-lib.sh - -time_start - -time_run 'load nmbug tags' 'notmuch restore --accumulate < corpus.tags/nmbug.sup-dump' -time_run 'dump *' 'notmuch dump > tags.out' -time_run 'restore *' 'notmuch restore < tags.out' - -time_done diff --git a/performance-test/02-tag b/performance-test/02-tag deleted file mode 100755 index 78ceccc..0000000 --- a/performance-test/02-tag +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -test_description='tagging' - -. ./perf-test-lib.sh - -time_start - -time_run 'tag * +new_tag' "notmuch tag +new_tag '*'" -time_run 'tag * +existing_tag' "notmuch tag +new_tag '*'" -time_run 'tag * -existing_tag' "notmuch tag -new_tag '*'" -time_run 'tag * -missing_tag' "notmuch tag -new_tag '*'" - -time_done diff --git a/performance-test/Makefile.local b/performance-test/Makefile.local index 3834e4d..57beb44 100644 --- a/performance-test/Makefile.local +++ b/performance-test/Makefile.local @@ -10,7 +10,7 @@ SIGFILE := ${TXZFILE}.asc TEST_SCRIPT := ${dir}/notmuch-perf-test DEFAULT_URL := http://notmuchmail.org/releases/${CORPUS_NAME} -perf-test: setup-perf-test all +time-test: setup-perf-test all $(TEST_SCRIPT) $(OPTIONS) .PHONY: download-corpus setup-perf-test diff --git a/performance-test/README b/performance-test/README index 1481660..d1fb6de 100644 --- a/performance-test/README +++ b/performance-test/README @@ -36,8 +36,8 @@ for a list of mirrors. Running tests ------------- -The easiest way to run performance tests is to say "make perf-test", (or -simply run the notmuch-perf-test script). Either command will run all +The easiest way to run performance tests is to say "make time-test", (or +simply run the notmuch-time-test script). Either command will run all available performance tests. Alternately, you can run a specific subset of tests by simply invoking @@ -51,7 +51,7 @@ Each test script supports the following arguments Writing tests ------------- -Have a look at "01-dump-restore" for an example. Sourcing +Have a look at "T01-dump-restore" for an example. Sourcing "perf-test-lib.sh" is mandatory. Utility functions include - 'add_email_corpus' unpacks a set of messages and adds them to the database. @@ -65,4 +65,5 @@ Have a look at "01-dump-restore" for an example. Sourcing Scripts are run in the order specified in notmuch-perf-test. In the future this order might be chosen automatically so please follow the -convention of starting the name with two digits to specify the order. +convention of starting the name with 'T' followed by two digits to +specify the order. diff --git a/performance-test/T00-new b/performance-test/T00-new new file mode 100755 index 0000000..553bb8b --- /dev/null +++ b/performance-test/T00-new @@ -0,0 +1,15 @@ +#!/bin/bash + +test_description='notmuch new' + +. ./perf-test-lib.sh + +uncache_database + +time_start + +for i in $(seq 2 6); do + time_run "notmuch new #$i" 'notmuch new' +done + +time_done diff --git a/performance-test/T01-dump-restore b/performance-test/T01-dump-restore new file mode 100755 index 0000000..b2ff940 --- /dev/null +++ b/performance-test/T01-dump-restore @@ -0,0 +1,13 @@ +#!/bin/bash + +test_description='dump and restore' + +. ./perf-test-lib.sh + +time_start + +time_run 'load nmbug tags' 'notmuch restore --accumulate < corpus.tags/nmbug.sup-dump' +time_run 'dump *' 'notmuch dump > tags.out' +time_run 'restore *' 'notmuch restore < tags.out' + +time_done diff --git a/performance-test/T02-tag b/performance-test/T02-tag new file mode 100755 index 0000000..78ceccc --- /dev/null +++ b/performance-test/T02-tag @@ -0,0 +1,14 @@ +#!/bin/bash + +test_description='tagging' + +. ./perf-test-lib.sh + +time_start + +time_run 'tag * +new_tag' "notmuch tag +new_tag '*'" +time_run 'tag * +existing_tag' "notmuch tag +new_tag '*'" +time_run 'tag * -existing_tag' "notmuch tag -new_tag '*'" +time_run 'tag * -missing_tag' "notmuch tag -new_tag '*'" + +time_done diff --git a/performance-test/notmuch-perf-test b/performance-test/notmuch-perf-test deleted file mode 100755 index fc39d8a..0000000 --- a/performance-test/notmuch-perf-test +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -# Run tests -# -# Copyright (c) 2005 Junio C Hamano -# -# Adapted from a Makefile to a shell script by Carl Worth (2010) - -if [ ${BASH_VERSINFO[0]} -lt 4 ]; then - echo "Error: The notmuch test suite requires a bash version >= 4.0" - echo "due to use of associative arrays within the test suite." - echo "Please try again with a newer bash (or help us fix the" - echo "test suite to be more portable). Thanks." - exit 1 -fi - -cd $(dirname "$0") - -TESTS=" - 00-new - 01-dump-restore - 02-tag -" - -for test in $TESTS; do - ./$test "$@" -done diff --git a/performance-test/notmuch-time-test b/performance-test/notmuch-time-test new file mode 100755 index 0000000..54a208f --- /dev/null +++ b/performance-test/notmuch-time-test @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +# Run tests +# +# Copyright (c) 2005 Junio C Hamano +# +# Adapted from a Makefile to a shell script by Carl Worth (2010) + +if [ ${BASH_VERSINFO[0]} -lt 4 ]; then + echo "Error: The notmuch test suite requires a bash version >= 4.0" + echo "due to use of associative arrays within the test suite." + echo "Please try again with a newer bash (or help us fix the" + echo "test suite to be more portable). Thanks." + exit 1 +fi + +cd $(dirname "$0") + +TESTS=" + T00-new + T01-dump-restore + T02-tag +" + +for test in $TESTS; do + ./$test "$@" +done -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/4] perf-test: initial version of memory test infrastructure. 2012-12-16 18:23 memory leak tests david 2012-12-16 18:23 ` [PATCH 1/4] perf-test: remove redunant "initial notmuch new" david 2012-12-16 18:23 ` [PATCH 2/4] perf-test: rename current tests as "time tests" david @ 2012-12-16 18:23 ` david 2012-12-16 19:11 ` Austin Clements 2012-12-16 18:23 ` [PATCH 4/4] perf-test: add memory leak test for dump restore david 3 siblings, 1 reply; 7+ messages in thread From: david @ 2012-12-16 18:23 UTC (permalink / raw) To: notmuch; +Cc: David Bremner From: David Bremner <bremner@debian.org> The idea is run some code under valgrind --leak-check=full and report a summary, leaving the user to peruse the log file if they want. We go to some lengths to preserve the log files from accidental overwriting; the full corpus takes about 3 hours to run under valgrind on my machine. The naming of the log directories is probably overkill; I find it nice to have them sequenced by time. Arguably the mktemp is then overkill, but I know people will be nervous if it looks like timestamps are being used for uniqueness. One new test is included, to check notmuch new for memory leaks. --- performance-test/.gitignore | 1 + performance-test/M00-new | 14 +++++++++ performance-test/Makefile.local | 17 +++++++++-- performance-test/README | 57 +++++++++++++++++++++++++------------ performance-test/perf-test-lib.sh | 55 ++++++++++++++++++++++++++++------- 5 files changed, 113 insertions(+), 31 deletions(-) create mode 100755 performance-test/M00-new diff --git a/performance-test/.gitignore b/performance-test/.gitignore index 6421a9a..f3f9be4 100644 --- a/performance-test/.gitignore +++ b/performance-test/.gitignore @@ -1,3 +1,4 @@ tmp.*/ +log.*/ corpus/ notmuch.cache.*/ diff --git a/performance-test/M00-new b/performance-test/M00-new new file mode 100755 index 0000000..733e9b0 --- /dev/null +++ b/performance-test/M00-new @@ -0,0 +1,14 @@ +#!/bin/bash + +test_description='notmuch new' + +. ./perf-test-lib.sh + +# ensure initial 'notmuch new' is run by memory_start +uncache_database + +memory_start + +memory_run "notmuch new" "notmuch new" + +memory_done diff --git a/performance-test/Makefile.local b/performance-test/Makefile.local index 57beb44..357d800 100644 --- a/performance-test/Makefile.local +++ b/performance-test/Makefile.local @@ -4,14 +4,25 @@ dir := performance-test include $(dir)/version.sh +# these two are just make sure dir is expanded at the right time. +TIME_TEST_SCRIPT := ${dir}/notmuch-time-test +MEMORY_TEST_SCRIPT := ${dir}/notmuch-memory-test + CORPUS_NAME := notmuch-email-corpus-$(PERFTEST_VERSION).tar.xz TXZFILE := ${dir}/download/${CORPUS_NAME} SIGFILE := ${TXZFILE}.asc -TEST_SCRIPT := ${dir}/notmuch-perf-test DEFAULT_URL := http://notmuchmail.org/releases/${CORPUS_NAME} +perf-test: time-test memory-test + time-test: setup-perf-test all - $(TEST_SCRIPT) $(OPTIONS) + @echo + $(TIME_TEST_SCRIPT) $(TEST_OPTIONS) + +memory-test: setup-perf-test all + @echo + $(MEMORY_TEST_SCRIPT) $(TEST_OPTIONS) + .PHONY: download-corpus setup-perf-test @@ -29,4 +40,4 @@ $(TXZFILE): download-corpus: wget -O ${TXZFILE} ${DEFAULT_URL} -CLEAN := $(CLEAN) $(dir)/tmp.* $(dir)/corpus $(dir)/notmuch.cache.* +CLEAN := $(CLEAN) $(dir)/tmp.* $(dir)/log.* $(dir)/corpus $(dir)/notmuch.cache.* diff --git a/performance-test/README b/performance-test/README index d1fb6de..7eaf5f7 100644 --- a/performance-test/README +++ b/performance-test/README @@ -1,3 +1,10 @@ +Performance Tests +----------------- + +This directory contains two kinds of performance tests, time tests, +and memory tests. The former use gnu time, and the latter use +valgrind. + Pre-requisites -------------- @@ -5,9 +12,10 @@ In addition to having notmuch, you need: - gpg - gnu tar -- gnu time +- gnu time (for the time tests). - xz. Some speedup can be gotten by installing "pixz", but this is probably only worthwhile if you are debugging the tests. +- valgrind (for the memory tests) Getting set up to run tests: ---------------------------- @@ -36,34 +44,47 @@ for a list of mirrors. Running tests ------------- -The easiest way to run performance tests is to say "make time-test", (or -simply run the notmuch-time-test script). Either command will run all -available performance tests. - -Alternately, you can run a specific subset of tests by simply invoking -one of the executable scripts in this directory, (such as ./basic). -Each test script supports the following arguments +The easiest way to run performance tests is to say "make perf-test". +This will run all time and memory tests. Be aware that the memory +tests are quite time consuming when run on the full corpus, and that +depending on your interests it may be more sensible to run "make +time-test" or "make memory-test". You can also invoke one of the +scripts notmuch-time-test or notmuch-memory-test or run a more +specific subset of tests by simply invoking one of the executable +scripts in this directory, (such as ./T00-new). Each test script +supports the following arguments --small / --medium / --large Choose corpus size. --debug Enable debugging. In particular don't delete temporary directories. +When using the make targets, you can pass arguments to all test +scripts by defining the make variable TEST_OPTIONS. + Writing tests ------------- -Have a look at "T01-dump-restore" for an example. Sourcing -"perf-test-lib.sh" is mandatory. Utility functions include +Have a look at "T01-dump-restore" for an example time test and and +"M00-new" for an example memory tests. In both cases sourcing +"perf-test-lib.sh" is mandatory. -- 'add_email_corpus' unpacks a set of messages and adds them to the database. -- 'cache_database': makes a snapshot of the current database -- 'uncache_database': forces the next 'add_email_corpus' to rebuild the - database. -- 'time_start' unpacks the mail corpus and calls notmuch new if it +Basics: + +- '(time|memory)_start' unpacks the mail corpus and calls notmuch new if it cannot find a cache of the appropriate corpus. -- 'time_done' does the cleanup; comment it out or pass --debug to the +- '(time|memory)_run' runs the command under time or valgrind. Currently + "memory_run" does not support i/o redirection in the command. +- '(time|memory)_done' does the cleanup; comment it out or pass --debug to the script to leave the temporary files around. +Utility functions include + +- 'add_email_corpus' unpacks a set of messages and tags +- 'cache_database': makes a snapshot of the current database +- 'uncache_database': forces the next '(time|memory)_start' to rebuild the + database. + Scripts are run in the order specified in notmuch-perf-test. In the future this order might be chosen automatically so please follow the -convention of starting the name with 'T' followed by two digits to -specify the order. +convention of starting the name with 'T' or 'M' followed by two digits +to specify the order. diff --git a/performance-test/perf-test-lib.sh b/performance-test/perf-test-lib.sh index 3a7ef2b..79eb2c5 100644 --- a/performance-test/perf-test-lib.sh +++ b/performance-test/perf-test-lib.sh @@ -92,20 +92,52 @@ add_email_corpus () } -time_start () { - - add_email_corpus - - print_header +notmuch_new_with_cache () { if [ -d $DB_CACHE_DIR ]; then cp -r $DB_CACHE_DIR ${MAIL_DIR}/.notmuch else - time_run 'Initial notmuch new' "notmuch new" + "$1" 'Initial notmuch new' "notmuch new" cache_database fi } +time_start () { + + add_email_corpus + + print_header + + notmuch_new_with_cache time_run +} + +memory_start () { + + add_email_corpus + + _timestamp=$(printf "%x" $(date +"%s")) + log_dir=$(mktemp -d "${TEST_DIRECTORY}/log.$(basename $0)-$corpus_size-${_timestamp}-XXXXXX") + + notmuch_new_with_cache memory_run +} + +memory_run () { + test_count=$(($test_count+1)) + + log_file=$log_dir/$test_count.log + + printf "[ %d ]\t%s\n" $test_count "$1" + + valgrind --leak-check=full --log-file="$log_file" $2 + + awk '/LEAK SUMMARY/,/suppressed/ { sub(/^==[0-9]*==/," "); print }' "$log_file" + echo +} + +memory_done () { + time_done +} + cache_database () { if [ -d $MAIL_DIR/.notmuch ]; then cp -r $MAIL_DIR/.notmuch $DB_CACHE_DIR @@ -119,12 +151,13 @@ uncache_database () { } print_header () { - printf "[v%4s %6s] Wall(s)\tUsr(s)\tSys(s)\tRes(K)\tIn/Out(512B)\n" \ - ${PERFTEST_VERSION} ${corpus_size} + printf "\t\t\tWall(s)\tUsr(s)\tSys(s)\tRes(K)\tIn/Out(512B)\n" + } time_run () { printf " %-22s" "$1" + test_count=$(($test_count+1)) if test "$verbose" != "t"; then exec 4>test.output 3>&4; fi if ! eval >&3 "/usr/bin/time -f '%e\t%U\t%S\t%M\t%I/%O' $2" ; then test_failure=$(($test_failure + 1)) @@ -144,6 +177,8 @@ time_done () { cd -P "$test" || error "Cannot setup test environment" test_failure=0 +test_count=0 -echo -echo $(basename "$0"): "Testing ${test_description:-notmuch performance}" +printf "\n%-55s [%s %s]\n" \ + "$(basename "$0"): Testing ${test_description:-notmuch performance}" \ + "${PERFTEST_VERSION}" "${corpus_size}" -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 3/4] perf-test: initial version of memory test infrastructure. 2012-12-16 18:23 ` [PATCH 3/4] perf-test: initial version of memory test infrastructure david @ 2012-12-16 19:11 ` Austin Clements 0 siblings, 0 replies; 7+ messages in thread From: Austin Clements @ 2012-12-16 19:11 UTC (permalink / raw) To: david; +Cc: notmuch, David Bremner Quoth david@tethera.net on Dec 16 at 2:23 pm: > From: David Bremner <bremner@debian.org> > > The idea is run some code under valgrind --leak-check=full and report > a summary, leaving the user to peruse the log file if they want. > > We go to some lengths to preserve the log files from accidental > overwriting; the full corpus takes about 3 hours to run under valgrind > on my machine. > > The naming of the log directories is probably overkill; I find it nice > to have them sequenced by time. Arguably the mktemp is then overkill, > but I know people will be nervous if it looks like timestamps are > being used for uniqueness. > > One new test is included, to check notmuch new for memory leaks. > --- > performance-test/.gitignore | 1 + > performance-test/M00-new | 14 +++++++++ > performance-test/Makefile.local | 17 +++++++++-- > performance-test/README | 57 +++++++++++++++++++++++++------------ > performance-test/perf-test-lib.sh | 55 ++++++++++++++++++++++++++++------- > 5 files changed, 113 insertions(+), 31 deletions(-) > create mode 100755 performance-test/M00-new > > diff --git a/performance-test/.gitignore b/performance-test/.gitignore > index 6421a9a..f3f9be4 100644 > --- a/performance-test/.gitignore > +++ b/performance-test/.gitignore > @@ -1,3 +1,4 @@ > tmp.*/ > +log.*/ > corpus/ > notmuch.cache.*/ > diff --git a/performance-test/M00-new b/performance-test/M00-new > new file mode 100755 > index 0000000..733e9b0 > --- /dev/null > +++ b/performance-test/M00-new > @@ -0,0 +1,14 @@ > +#!/bin/bash > + > +test_description='notmuch new' > + > +. ./perf-test-lib.sh > + > +# ensure initial 'notmuch new' is run by memory_start > +uncache_database > + > +memory_start > + > +memory_run "notmuch new" "notmuch new" This will run notmuch new twice. Is that intentional? If so, it might be worth a comment. > + > +memory_done > diff --git a/performance-test/Makefile.local b/performance-test/Makefile.local > index 57beb44..357d800 100644 > --- a/performance-test/Makefile.local > +++ b/performance-test/Makefile.local > @@ -4,14 +4,25 @@ dir := performance-test > > include $(dir)/version.sh > > +# these two are just make sure dir is expanded at the right time. > +TIME_TEST_SCRIPT := ${dir}/notmuch-time-test > +MEMORY_TEST_SCRIPT := ${dir}/notmuch-memory-test This is obviously fine, but I don't understand the comment. There are all sorts of places where we have to := assign to get ${dir} right (including TXZFILE file below). Is there something different here? > + > CORPUS_NAME := notmuch-email-corpus-$(PERFTEST_VERSION).tar.xz > TXZFILE := ${dir}/download/${CORPUS_NAME} > SIGFILE := ${TXZFILE}.asc > -TEST_SCRIPT := ${dir}/notmuch-perf-test > DEFAULT_URL := http://notmuchmail.org/releases/${CORPUS_NAME} > > +perf-test: time-test memory-test > + > time-test: setup-perf-test all > - $(TEST_SCRIPT) $(OPTIONS) > + @echo > + $(TIME_TEST_SCRIPT) $(TEST_OPTIONS) Why not use the same OPTIONS variable name as the correctness tests? > + > +memory-test: setup-perf-test all > + @echo > + $(MEMORY_TEST_SCRIPT) $(TEST_OPTIONS) > + > > .PHONY: download-corpus setup-perf-test > > @@ -29,4 +40,4 @@ $(TXZFILE): > download-corpus: > wget -O ${TXZFILE} ${DEFAULT_URL} > > -CLEAN := $(CLEAN) $(dir)/tmp.* $(dir)/corpus $(dir)/notmuch.cache.* > +CLEAN := $(CLEAN) $(dir)/tmp.* $(dir)/log.* $(dir)/corpus $(dir)/notmuch.cache.* > diff --git a/performance-test/README b/performance-test/README > index d1fb6de..7eaf5f7 100644 > --- a/performance-test/README > +++ b/performance-test/README > @@ -1,3 +1,10 @@ > +Performance Tests > +----------------- > + > +This directory contains two kinds of performance tests, time tests, s/performance tests,/performance tests:/ > +and memory tests. The former use gnu time, and the latter use > +valgrind. > + > Pre-requisites > -------------- > > @@ -5,9 +12,10 @@ In addition to having notmuch, you need: > > - gpg > - gnu tar > -- gnu time > +- gnu time (for the time tests). No period? > - xz. Some speedup can be gotten by installing "pixz", but this is > probably only worthwhile if you are debugging the tests. > +- valgrind (for the memory tests) > > Getting set up to run tests: > ---------------------------- > @@ -36,34 +44,47 @@ for a list of mirrors. > Running tests > ------------- > > -The easiest way to run performance tests is to say "make time-test", (or > -simply run the notmuch-time-test script). Either command will run all > -available performance tests. > - > -Alternately, you can run a specific subset of tests by simply invoking > -one of the executable scripts in this directory, (such as ./basic). > -Each test script supports the following arguments > +The easiest way to run performance tests is to say "make perf-test". > +This will run all time and memory tests. Be aware that the memory > +tests are quite time consuming when run on the full corpus, and that > +depending on your interests it may be more sensible to run "make > +time-test" or "make memory-test". You can also invoke one of the > +scripts notmuch-time-test or notmuch-memory-test or run a more > +specific subset of tests by simply invoking one of the executable > +scripts in this directory, (such as ./T00-new). Each test script > +supports the following arguments > > --small / --medium / --large Choose corpus size. > --debug Enable debugging. In particular don't delete > temporary directories. > > +When using the make targets, you can pass arguments to all test > +scripts by defining the make variable TEST_OPTIONS. > + > Writing tests > ------------- > > -Have a look at "T01-dump-restore" for an example. Sourcing > -"perf-test-lib.sh" is mandatory. Utility functions include > +Have a look at "T01-dump-restore" for an example time test and and s/and and/and/ > +"M00-new" for an example memory tests. In both cases sourcing > +"perf-test-lib.sh" is mandatory. > > -- 'add_email_corpus' unpacks a set of messages and adds them to the database. > -- 'cache_database': makes a snapshot of the current database > -- 'uncache_database': forces the next 'add_email_corpus' to rebuild the > - database. > -- 'time_start' unpacks the mail corpus and calls notmuch new if it > +Basics: > + > +- '(time|memory)_start' unpacks the mail corpus and calls notmuch new if it > cannot find a cache of the appropriate corpus. > -- 'time_done' does the cleanup; comment it out or pass --debug to the > +- '(time|memory)_run' runs the command under time or valgrind. Currently > + "memory_run" does not support i/o redirection in the command. > +- '(time|memory)_done' does the cleanup; comment it out or pass --debug to the > script to leave the temporary files around. > > +Utility functions include > + > +- 'add_email_corpus' unpacks a set of messages and tags > +- 'cache_database': makes a snapshot of the current database > +- 'uncache_database': forces the next '(time|memory)_start' to rebuild the > + database. > + > Scripts are run in the order specified in notmuch-perf-test. In the > future this order might be chosen automatically so please follow the > -convention of starting the name with 'T' followed by two digits to > -specify the order. > +convention of starting the name with 'T' or 'M' followed by two digits > +to specify the order. > diff --git a/performance-test/perf-test-lib.sh b/performance-test/perf-test-lib.sh > index 3a7ef2b..79eb2c5 100644 > --- a/performance-test/perf-test-lib.sh > +++ b/performance-test/perf-test-lib.sh > @@ -92,20 +92,52 @@ add_email_corpus () > > } > > -time_start () { > - > - add_email_corpus > - > - print_header > +notmuch_new_with_cache () { > Out of curiosity, why the blank lines at the beginning of functions? > if [ -d $DB_CACHE_DIR ]; then > cp -r $DB_CACHE_DIR ${MAIL_DIR}/.notmuch > else > - time_run 'Initial notmuch new' "notmuch new" > + "$1" 'Initial notmuch new' "notmuch new" > cache_database > fi > } > > +time_start () { > + > + add_email_corpus > + > + print_header > + > + notmuch_new_with_cache time_run > +} > + > +memory_start () { > + > + add_email_corpus > + > + _timestamp=$(printf "%x" $(date +"%s")) You could use 'local' here. > + log_dir=$(mktemp -d "${TEST_DIRECTORY}/log.$(basename $0)-$corpus_size-${_timestamp}-XXXXXX") This really does seem like overkill. I'd say just use timestamps for uniqueness. These tests take a long time, and if you do manage to run the same test twice in less than a second, does it really matter that you have to run it again if you want the first log? How about using ISO 8601 timestamps? They're both compact and more user-friendly than hexadecimal epoch time. local timestamp=$(date +%Y%m%dT%H%M%S) log_dir="${TEST_DIRECTORY}/log.$(basename $0)-$corpus_size-${timestamp}" > + > + notmuch_new_with_cache memory_run > +} > + > +memory_run () { > + test_count=$(($test_count+1)) > + > + log_file=$log_dir/$test_count.log > + > + printf "[ %d ]\t%s\n" $test_count "$1" > + > + valgrind --leak-check=full --log-file="$log_file" $2 > + > + awk '/LEAK SUMMARY/,/suppressed/ { sub(/^==[0-9]*==/," "); print }' "$log_file" > + echo > +} > + > +memory_done () { > + time_done > +} > + > cache_database () { > if [ -d $MAIL_DIR/.notmuch ]; then > cp -r $MAIL_DIR/.notmuch $DB_CACHE_DIR > @@ -119,12 +151,13 @@ uncache_database () { > } > > print_header () { > - printf "[v%4s %6s] Wall(s)\tUsr(s)\tSys(s)\tRes(K)\tIn/Out(512B)\n" \ > - ${PERFTEST_VERSION} ${corpus_size} > + printf "\t\t\tWall(s)\tUsr(s)\tSys(s)\tRes(K)\tIn/Out(512B)\n" > + > } > > time_run () { > printf " %-22s" "$1" > + test_count=$(($test_count+1)) > if test "$verbose" != "t"; then exec 4>test.output 3>&4; fi > if ! eval >&3 "/usr/bin/time -f '%e\t%U\t%S\t%M\t%I/%O' $2" ; then > test_failure=$(($test_failure + 1)) > @@ -144,6 +177,8 @@ time_done () { > > cd -P "$test" || error "Cannot setup test environment" > test_failure=0 > +test_count=0 > > -echo > -echo $(basename "$0"): "Testing ${test_description:-notmuch performance}" > +printf "\n%-55s [%s %s]\n" \ > + "$(basename "$0"): Testing ${test_description:-notmuch performance}" \ > + "${PERFTEST_VERSION}" "${corpus_size}" ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 4/4] perf-test: add memory leak test for dump restore 2012-12-16 18:23 memory leak tests david ` (2 preceding siblings ...) 2012-12-16 18:23 ` [PATCH 3/4] perf-test: initial version of memory test infrastructure david @ 2012-12-16 18:23 ` david 2012-12-16 22:14 ` David Bremner 3 siblings, 1 reply; 7+ messages in thread From: david @ 2012-12-16 18:23 UTC (permalink / raw) To: notmuch; +Cc: David Bremner From: David Bremner <bremner@debian.org> In id:87vcc2q5n2.fsf@nikula.org, Jani points out a memory leak in the current version of the sup restore code. Among other things, this test is intended to verify a fix for that leak. --- performance-test/M01-dump-restore | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100755 performance-test/M01-dump-restore diff --git a/performance-test/M01-dump-restore b/performance-test/M01-dump-restore new file mode 100755 index 0000000..be5894a --- /dev/null +++ b/performance-test/M01-dump-restore @@ -0,0 +1,15 @@ +#!/bin/bash + +test_description='dump and restore' + +. ./perf-test-lib.sh + +memory_start + +memory_run 'load nmbug tags' 'notmuch restore --accumulate --input=corpus.tags/nmbug.sup-dump' +memory_run 'dump *' 'notmuch dump --output=tags.sup' +memory_run 'restore *' 'notmuch restore --input=tags.sup' +memory_run 'dump --format=batch-tag *' 'notmuch dump --format=batch-tag --output=tags.bt' +memory_run 'restore --format=batch-tag *' 'notmuch restore --format=batch-tag --input=tags.bt' + +memory_done -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 4/4] perf-test: add memory leak test for dump restore 2012-12-16 18:23 ` [PATCH 4/4] perf-test: add memory leak test for dump restore david @ 2012-12-16 22:14 ` David Bremner 0 siblings, 0 replies; 7+ messages in thread From: David Bremner @ 2012-12-16 22:14 UTC (permalink / raw) To: notmuch david@tethera.net writes: > + > +memory_run 'load nmbug tags' 'notmuch restore --accumulate --input=corpus.tags/nmbug.sup-dump' > +memory_run 'dump *' 'notmuch dump --output=tags.sup' > +memory_run 'restore *' 'notmuch restore --input=tags.sup' > +memory_run 'dump --format=batch-tag *' 'notmuch dump --format=batch-tag --output=tags.bt' > +memory_run 'restore --format=batch-tag *' 'notmuch restore --format=batch-tag --input=tags.bt' > + We were talking on IRC about how/if valgrind would cope with talloc, and the possibility that chunks of memory are still reachable by talloc, but not by user code. Currently the talloc context "local" in main() is (slightly perversely) only freed in the case of "return 1", so all the memory allocated by talloc on that contex is shown as leaked: 3,005,500 (93 direct, 3,005,407 indirect) bytes in 1 blocks are definitely lost in loss record 553 of 553 at 0x4C2A26B: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x55F14C7: talloc_strndup (in /usr/lib/x86_64-linux-gnu/libtalloc.so.2.0.7) by 0x4115E8: parse_sup_line (notmuch-restore.c:90) by 0x411AD4: notmuch_restore_command (notmuch-restore.c:209) by 0x40B2A4: main (notmuch.c:294) Although this is probably a bug in main(), it does point valgrind to the right culprit. As our memory allocation is (alas) a mix of talloc, malloc, and g_malloc, we probably need both valgrind tests, and some way to toggle talloc memory debugging. ( http://talloc.samba.org/talloc/doc/html/group__talloc__debug.html ) d ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2012-12-16 22:15 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-12-16 18:23 memory leak tests david 2012-12-16 18:23 ` [PATCH 1/4] perf-test: remove redunant "initial notmuch new" david 2012-12-16 18:23 ` [PATCH 2/4] perf-test: rename current tests as "time tests" david 2012-12-16 18:23 ` [PATCH 3/4] perf-test: initial version of memory test infrastructure david 2012-12-16 19:11 ` Austin Clements 2012-12-16 18:23 ` [PATCH 4/4] perf-test: add memory leak test for dump restore david 2012-12-16 22:14 ` David Bremner
Code repositories for project(s) associated with this public inbox https://yhetil.org/notmuch.git/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).