From 6fd336eda6d012136b79ee4f1c37463d43822b96 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Wed, 1 Dec 2021 08:01:56 +0200 Subject: perf: add benchmark script for the "many empty files" scenario This isn't great code, but it works, which is enough for now. Sponsored-by: author --- bench-manyfiles.sh | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ manyfiles.py | 39 ++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100755 bench-manyfiles.sh create mode 100644 manyfiles.py diff --git a/bench-manyfiles.sh b/bench-manyfiles.sh new file mode 100755 index 0000000..39e6c2e --- /dev/null +++ b/bench-manyfiles.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# +# Run a simple benchmark of an incremental backup of many empty files, +# when the live data hasn't changed. +# +# Edit the if-statement towards the end to get a flamegraph to see +# where time is actually spent. +# +# This is very simplistic and could do with a lot of improvement. But +# it's a start. + +set -euo pipefail + +N=100000 + +TMP="$(mktemp -d)" +trap 'rm -rf "$TMP"' EXIT + +chunks="$TMP/chunks" +live="$TMP/live" + +mkdir "$chunks" +mkdir "$live" +python3 manyfiles.py "$live" "$N" + +cat <"$TMP/server.yaml" +address: localhost:8888 +chunks: $chunks +tls_key: test.key +tls_cert: test.pem +EOF + +cat <"$TMP/client.yaml" +server_url: https://localhost:8888 +verify_tls_cert: false +roots: + - $live +log: $TMP/client.log +EOF + +cargo build -q --release --all-targets + +OBNAM_SERVER_LOG=error cargo run -q --release --bin obnam-server -- "$TMP/server.yaml" >/dev/null & +pid="$!" + +cargo run -q --release --bin obnam -- --config "$TMP/client.yaml" init --insecure-passphrase=hunter2 + +# Initial backup. +cargo run -q --release --bin obnam -- --config "$TMP/client.yaml" backup >/dev/null + +# Incremental backup. +if true; then + /usr/bin/time --format=%e cargo run -q --release --bin obnam -- --config "$TMP/client.yaml" backup >/dev/null +else + cargo flamegraph --bin obnam -o obnam.svg -- --config "$TMP/client.yaml" backup >/dev/null +fi + +kill "$pid" diff --git a/manyfiles.py b/manyfiles.py new file mode 100644 index 0000000..a45d3cd --- /dev/null +++ b/manyfiles.py @@ -0,0 +1,39 @@ +#!/usr/bin/python3 +# +# Create the desired number of empty files in a directory. A thousand files per +# subdirectory. + +import os +import sys + + +def subdir(dirname, dirno): + pathname = os.path.join(dirname, str(dirno)) + os.mkdir(pathname) + return pathname + + +def create(filename): + open(filename, "w").close() + + +DIRFILES = 1000 + +dirname = sys.argv[1] +n = int(sys.argv[2]) + +dirno = 0 +subdirpath = subdir(dirname, dirno) +fileno = 0 +thisdir = 0 + +while fileno < n: + filename = os.path.join(subdirpath, str(thisdir)) + create(filename) + + fileno += 1 + thisdir += 1 + if thisdir >= DIRFILES: + dirno += 1 + subdirpath = subdir(dirname, dirno) + thisdir = 0 -- cgit v1.2.1