diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-03-17 10:49:54 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-03-22 17:56:16 -0400 |
commit | 31495209e496a6dfae49323c1e24df3f1254fc85 (patch) | |
tree | 9412dcdbd7f613f84eb0c52b97ceac83c8f717c1 | |
parent | ed07c2d196bdeb0155541eda42c8ddf3765b4d91 (diff) |
tests/bcachefs/perf.ktest: New perf tests
This adds some fio benchmarks, with profiling, that use no_data_io so
that we're just limited by what bcachefs itself can do.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rwxr-xr-x | tests/bcachefs/perf.ktest | 296 |
1 files changed, 281 insertions, 15 deletions
diff --git a/tests/bcachefs/perf.ktest b/tests/bcachefs/perf.ktest index 4f0f0d1..238db13 100755 --- a/tests/bcachefs/perf.ktest +++ b/tests/bcachefs/perf.ktest @@ -4,8 +4,17 @@ require-make bcachefs-tools -require-kernel-config BCACHEFS_FS +require-kernel-config XFS_FS=m +require-kernel-config BTRFS_FS=m + +require-kernel-config BCACHEFS_FS=y require-kernel-config BCACHEFS_TESTS +require-kernel-config BCACHEFS_DEBUG=n +require-kernel-config BCACHEFS_DEBUG_TRANSACTIONS=n +require-kernel-config BCACHEFS_QUOTA=n +require-kernel-config BCACHEFS_LOCK_TIME_STATS=n +require-kernel-config BCACHEFS_NO_LATENCY_ACCT +require-kernel-config LATENCYTOP if [[ $ktest_arch = x86 ]]; then require-kernel-config CRYPTO_CRC32C_INTEL @@ -14,29 +23,30 @@ fi btree_node_size=512k t=12 -config-mem 16G -config-scratch-devs 32G +config-mem 32G +config-scratch-devs 64G config-cpus $t -n=10M +n=20M + +#require-qemu-append -device vfio-pci,host=02:01.0 +require-qemu-append -device vfio-pci,host=03:00.0 +require-kernel-config BLK_DEV_NVME perf_mkfs() { + blkdiscard /dev/nvme0n1 + run_quiet "" bcachefs format \ --errors=panic \ --bucket=$btree_node_size \ --btree_node_size=$btree_node_size \ - --no_initialize \ - --version=11 \ - ${ktest_scratch_dev[0]} - mount -t bcachefs -o version_upgrade ${ktest_scratch_dev[0]} /mnt - bcachefs device resize-journal ${ktest_scratch_dev[0]} 1G - sleep 1 - bcachefs device resize-journal ${ktest_scratch_dev[0]} 2G - sleep 1 - bcachefs device resize-journal ${ktest_scratch_dev[0]} 3G - sleep 1 - bcachefs device resize-journal ${ktest_scratch_dev[0]} 4G + --metadata_checksum=none \ + --data_checksum=none \ + --journal_transaction_names=0 \ + /dev/nvme0n1 + mount -t bcachefs -o no_data_io /dev/nvme0n1 /mnt + #bcachefs device resize-journal /dev/sdb 4G ln -sf /sys/fs/bcachefs/*/perf_test p } @@ -67,6 +77,16 @@ test_perf_profile() umount /mnt } +test_rand_insert() +{ + set_watchdog 600 + + perf_mkfs + #perf record -ag -- + echo rand_insert $n 1 > p + #umount /mnt +} + test_perf_rand_insert_multi() { set_watchdog 600 @@ -220,4 +240,250 @@ test_extents() extent_overwrite_all } +test_random_updates() +{ + cd /root + + perf_mkfs + echo rand_insert $n 1 > p + echo rand_lookup $n 1 > p + echo seq_delete $n 1 > p + echo rand_insert $n $t > p + echo seq_delete $n 1 > p + echo rand_insert $n $t > p + echo seq_delete $n 1 > p + echo rand_insert $n $t > p + umount /mnt +} + +# fio benches: + +do_fio_bench() +{ + cd /root + + local rw=$1 + local numjobs=$2 + local profile=$3 + + ioengine=io_uring + ioengine=libaio + cat > /root/fio.sh <<-ZZ +#!/bin/bash + exec fio \ + --group_reporting \ + --runtime=60s \ + --exitall_on_error=1 \ + --ioengine=$ioengine \ + --iodepth=128 \ + --iodepth_batch=32 \ + --iodepth_batch_complete=32 \ + --direct=1 \ + --overwrite=1 \ + --directory=/mnt \ + --name=randwrite \ + --rw=$rw \ + --loops=100 \ + --numjobs=$numjobs \ + --filesize=1G \ + --bs=4k +ZZ + chmod 755 /root/fio.sh + + FSTYP=bcachefs + + dmesg -n4 + perf_mkfs + + #setup_tracing 'bcachefs:write_buffer_flush bcachefs:trans_restart_write_buffer_flush' + trace=false + if $trace; then + #setup_tracing 'bcachefs:*' + #setup_tracing 'sched:sched_blocked' + #echo stacktrace > /sys/kernel/debug/tracing/events/sched/sched_blocked/trigger + echo 8192 > /sys/kernel/tracing/buffer_size_kb + echo function > /sys/kernel/tracing/current_tracer + echo func_stack_trace > /sys/kernel/tracing/trace_options + echo stacktrace > /sys/kernel/tracing/trace_options + echo __default_send_IPI_dest_field > /sys/kernel/tracing/set_ftrace_filter + echo 1 > /sys/kernel/tracing/tracing_on + fi + + if $profile; then + perf record -agq -- /root/fio.sh + perf report --sort=symbol|head -n80|cut -b1-80 || true + #/host/home/kent/.cargo/bin/latency-tracer \ + # /root/fio.sh + # cat /sys/fs/bcachefs/*/internal/write_points + else + /root/fio.sh| + sed -rne '/IOPS/ s/ +([[:alpha:]]+) ?:.*IOPS=([^,]+).*/\1 \2/ p'| + awk '{printf("%s", $2)} END {printf("\n")}' + fi + + if $trace; then + echo 0 > /sys/kernel/tracing/tracing_on + fi + #cat /sys/fs/bcachefs/*/internal/journal_res_get* + #cat /sys/fs/bcachefs/*/internal/journal_entry* + umount /mnt +} + +do_bench_three_times() +{ + local run1=$(do_fio_bench "$@") + echo $run1 + local run2=$(do_fio_bench "$@") + echo $run2 + local run3=$(do_fio_bench "$@") + echo $run3 + + echo -n "result " + echo -e "$run1\n$run2\n$run3"|sort -rn|head -n1 +} + +test_random_reads() +{ + do_bench_three_times randread 1 false +} + +test_random_reads_mt() +{ + do_bench_three_times randread $t false +} + +test_random_writes() +{ + do_bench_three_times randwrite 1 false +} + +test_random_writes_mt() +{ + do_bench_three_times randwrite $t false +} + +test_random_writes_profile() +{ + do_fio_bench randwrite 1 true +} + +test_random_writes_mt_profile() +{ + do_fio_bench randwrite $t true +} + +test_random_writes_mt_st() +{ + do_fio_bench randwrite $t false + do_fio_bench randwrite 1 false +} + +test_appends() +{ + cd /root + + local loops=$((($ktest_priority + 1) * 4)) + + cat > /root/fio.sh <<-ZZ + fio --group_reporting \ + --eta=always \ + --exitall_on_error=1 \ + --randrepeat=0 \ + --ioengine=sync \ + --iodepth=1 \ + --direct=1 \ + --numjobs=1 \ + --filename=/mnt/fiotest \ + --name=write \ + --rw=write \ + --filesize=1G \ + --bs=4k +ZZ + + chmod 755 /root/fio.sh + + FSTYP=btrfs + FSTYP=xfs + FSTYP=bcachefs + + if true; then + run_quiet "" bcachefs format -f \ + --errors=panic \ + --bucket_size=2M \ + --data_checksum=none \ + --nocow \ + /dev/sdb + else + mkfs.$FSTYP /dev/sdb + fi + + mount -t $FSTYP /dev/sdb /mnt + + fallocate -l1G /mnt/fiotest + + #setup_tracing 'bcachefs:bucket_alloc_fail' + #setup_tracing 'sched:sched_switch' + #echo stacktrace > /sys/kernel/debug/tracing/events/sched/sched_switch/trigger + #echo 8192 > /sys/kernel/debug/tracing/buffer_size_kb + #echo function > /sys/kernel/debug/tracing/current_tracer + #echo func_stack_trace > /sys/kernel/debug/tracing/trace_options + #echo __schedule > /sys/kernel/debug/tracing/set_ftrace_filter + #echo 1 > /sys/kernel/debug/tracing/tracing_on + + perf record -a -- /root/fio.sh + perf report --sort=symbol|head -n60|cut -b1-50 || true + #echo 0 > /sys/kernel/debug/tracing/tracing_on + + #umount /mnt +} + +test_seq_reads() +{ + cd /root + + mkfs.xfs /dev/sdb + mount /dev/sdb /mnt + fallocate -l1G /mnt/test + dd if=/mnt/test of=/dev/null 2>/dev/null + + perf record -ag -- \ + fio --group_reporting \ + --gtod_reduce=1 \ + --runtime=60s \ + --exitall_on_error=1 \ + --ioengine=psync \ + --fallocate=none \ + --fadvise_hint=1 \ + --invalidate=0 \ + --name=randread \ + --rw=randread \ + --filename=/mnt/test \ + --filesize=1G \ + --io_size=64G \ + --numjobs=$t \ + --bs=512 + + umount /mnt +} + +test_blkdev_writes() +{ + fio \ + --group_reporting \ + --runtime=60s \ + --exitall_on_error=1 \ + --ioengine=libaio \ + --iodepth=128 \ + --iodepth_batch=32 \ + --iodepth_batch_complete=32 \ + --direct=1 \ + --filename=/dev/nvme0n1 \ + --name=randwrite \ + --rw=randwrite \ + --loops=100 \ + --numjobs=$t \ + --filesize=1G \ + --bs=4k +} + main "$@" |