#!/bin/sh ################################################################################ # options while getopts ckh flag do case $flag in c) RUN_COMBINED=true ;; k) KEEP_EXISTING_DATA=true ;; h) echo "Usage: $0 [-c] [case-*]" exit ;; esac done shift $(($OPTIND - 1)) [ $(whoami) != root ] && echo "root privilege required" && exit ################################################################################ # stats reset_stats () { echo 0 > /proc/lock_stat echo 1 > /sys/kernel/debug/gcov/reset } save_stats () { base_dir=$(pwd) mkdir -p $1 ( cd $1 cp /proc/lock_stat . && chmod go+r lock_stat $base_dir/gcov-mm $base_dir/gcov-fun mm/*.?.gcov | sort -nr > top-functions $base_dir/gcov-lock mm/*.?.gcov | sort -nr -k4 > top-locks rm mm/*.gcno mm/*.gcda ) } perf_events=" cpu-cycles instructions cache-references cache-misses branch-instructions branch-misses bus-cycles cpu-clock task-clock page-faults minor-faults major-faults context-switches cpu-migrations LLC-loads LLC-load-misses LLC-stores LLC-store-misses LLC-prefetches LLC-prefetch-misses dTLB-loads dTLB-load-misses dTLB-stores dTLB-store-misses lock:lock_acquire lock:lock_release lock:lock_contended lock:lock_acquired syscalls:sys_enter_mmap syscalls:sys_enter_mmap_pgoff syscalls:sys_enter_brk syscalls:sys_enter_msync syscalls:sys_enter_mremap syscalls:sys_enter_mprotect syscalls:sys_enter_mbind syscalls:sys_enter_migrate_pages syscalls:sys_enter_mlock syscalls:sys_enter_munlock syscalls:sys_enter_mlockall syscalls:sys_enter_munlockall syscalls:sys_enter_remap_file_pages " perf_events=$(echo $perf_events | sed 's/ / -e /g') ################################################################################ # run it . ./hw_vars OUT_DIR=$(hostname)-${nr_task}c-$(((mem + (1<<29))>>30))g TEST_CASES=${@:-$(echo case-*)} echo $((1<<30)) > /proc/sys/vm/max_map_count echo $((1<<20)) > /proc/sys/kernel/threads-max echo 1 > /proc/sys/vm/overcommit_memory echo 3 > /proc/sys/vm/drop_caches mount_tmpfs create_sparse_root for testcase in $TEST_CASES do [ "${testcase#*000}" != "$testcase" ] && continue [ -x "./$testcase" ] || continue [[ -n $KEEP_EXISTING_DATA && -d $OUT_DIR/$testcase ]] && continue reset_stats echo $testcase ./$testcase || break save_stats $OUT_DIR/$testcase # run again to collect perf stats perf stat -a -e $perf_events -o $OUT_DIR/$testcase/perf-stat ./$testcase perf record -afg -o $TMPFS_MNT/perf.data ./$testcase 2>/dev/null || continue perf report -g fractal,5 -i $TMPFS_MNT/perf.data 2>/dev/null > $OUT_DIR/$testcase/perf-report done ./elapsed-time $OUT_DIR remove_tmpfs remove_sparse_root ################################################################################ # run combined [ -z "$RUN_COMBINED" ] && exit # only run combined cases when asked kill_detached() { for pidfile in $SPARSE_ROOT/*.pid do [ -s "$pidfile" ] && kill -INT $(cat $pidfile) rm $pidfile done } for testcase in $TEST_CASES do for testcase2 in $TEST_CASES do [ -x "./$testcase" ] || continue [ -x "./$testcase2" ] || continue [ $testcase = $testcase2 ] && continue order="$testcase\n$testcase2" order2=$(echo $order | sort) [ $order != $order2 ] && continue [ "${testcase2#*000}" != "$testcase2" ] && continue reset_stats if [ "${testcase#*000}" != "$testcase" ]; then ./$testcase # take some memory (mem/3) ./$testcase2 # flush memory (mem*10) else ./$testcase & ./$testcase2 & wait fi save_stats $OUT_DIR/$testcase-$testcase2 kill_detached done done