From 6b49e6747f98463dfaf431643e5574076fe137a9 Mon Sep 17 00:00:00 2001 From: Sun Knudsen Date: Sat, 19 Mar 2022 16:46:25 -0400 Subject: [PATCH] Added Bitcoin computation benchmarking guide --- .../README.md | 102 ++++++++++++++++++ .../benchmark.sh | 99 +++++++++++++++++ .../benchmark.sh.asc | 7 ++ 3 files changed, 208 insertions(+) create mode 100644 how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/README.md create mode 100755 how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/benchmark.sh create mode 100644 how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/benchmark.sh.asc diff --git a/how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/README.md b/how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/README.md new file mode 100644 index 0000000..cec4308 --- /dev/null +++ b/how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/README.md @@ -0,0 +1,102 @@ + + +# How to benchmark computer performance + +## Requirements + +- Linux computer running Debian-based operating system + +## Caveats + +- When copy/pasting commands that start with `$`, strip out `$` as this character is not part of the command + +## Guide + +### Step 1: install dependencies + +```console +$ sudo apt update + +$ sudo apt install -y bc curl openssl sysbench +``` + +### Step 2: download (and optionally verify) [benchmark.sh](./benchmark.sh) ([PGP signature](./benchmark.sh.asc), [PGP public key](https://sunknudsen.com/sunknudsen.asc)) + +```shell +curl --fail --output $HOME/benchmark.sh https://raw.githubusercontent.com/sunknudsen/privacy-guides/master/how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/benchmark.sh +chmod +x $HOME/benchmark.sh +``` + +### Step 3: run benchmark.sh + +> Heads-up: benchmark should take between 5 and 10 minutes, but can take longer on slower hardware. + +```console +$ $HOME/benchmark.sh +Initiating… +Do you confirm model of disk on which “/home/sun/test-7d82aa” is stored is “Samsung SSD 970 EVO Plus 1TB” (y or n)? +y +Benchmarking SHA256 computing… +Benchmarking CPU… +Benchmarking memory… +Preparing sysbench fileio dataset… +Benchmarking disk using 16K block size… +Benchmarking disk using 1M block size… + +Result: + +openssl value in thousands of bytes processed per second +sysbench_cpu value in events per second +sysbench_memory, sysbench_disk_prepare and sysbench_disk_rndrw values in MiB per second +score value in times faster than Raspberry Pi 4 4GB with Samsung T7 Touch SSD 1TB + +{ + "disk_model": "Samsung SSD 970 EVO Plus 1TB", + "disk_transport": "nvme", + "cpu_model": "Intel(R) Core(TM) i5-6500T CPU @ 2.50GHz", + "openssl": "1450665.57", + "sysbench_cpu": "3810.87", + "sysbench_memory": "8488.63", + "sysbench_disk_prepare": "892.94", + "sysbench_disk_rndrw": { + "16k_read": "15.90", + "16k_write": "10.60", + "1m_read": "669.23", + "1m_write": "445.99" + }, + "score": "10.05" +} + +Done +``` + +### Step 4 (optional): publish JSON code block to GitHub discussion + +Go to https://github.com/sunknudsen/privacy-guides/discussions/220 and publish JSON code block as comment. + +```json +{ + "disk_model": "Samsung SSD 970 EVO Plus 1TB", + "disk_transport": "nvme", + "cpu_model": "Intel(R) Core(TM) i5-6500T CPU @ 2.50GHz", + "openssl": "1450665.57", + "sysbench_cpu": "3810.87", + "sysbench_memory": "8488.63", + "sysbench_disk_prepare": "892.94", + "sysbench_disk_rndrw": { + "16k_read": "15.90", + "16k_write": "10.60", + "1m_read": "669.23", + "1m_write": "445.99" + }, + "score": "10.05" +} +``` diff --git a/how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/benchmark.sh b/how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/benchmark.sh new file mode 100755 index 0000000..86beb28 --- /dev/null +++ b/how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/benchmark.sh @@ -0,0 +1,99 @@ +#! /bin/bash + +set -e + +# Raspberry Pi 4 4GB with Samsung T7 Touch SSD 1TB baseline +pi_openssl=570573.74 +pi_sysbench_cpu=5958.54 +pi_sysbench_memory=7276.50 +pi_sysbench_disk_prepare=96.97 +pi_sysbench_disk_16k_rndrw_read=6.27 +pi_sysbench_disk_16k_rndrw_write=4.18 +pi_sysbench_disk_1m_rndrw_read=104.76 +pi_sysbench_disk_1m_rndrw_write=69.68 + +dir="./test-$(openssl rand -hex 3)" +mkdir $dir +cd $dir + +path=$(realpath .) + +printf "%s\n" "Initiating…" + +disk=$(lsblk --output MOUNTPOINT,PKNAME | grep '^/boot' | awk 'END {print $2}' | awk '{$1=$1};1') +disk_model=$(lsblk --nodeps --output NAME,MODEL | grep $disk | awk '{$1=""; print $0}' | awk '{$1=$1};1') +disk_transport=$(lsblk --nodeps --output NAME,TRAN | grep $disk | awk '{print $2}' | awk '{$1=$1};1') + +printf "$bold%s$normal\n" "Do you confirm model of disk on which “$path” is stored is “$disk_model” (y or n)?" + +read -r answer +if [ "$answer" != "y" ]; then + printf "$bold%s$normal\n" "Please enter name of disk on which “$path” is stored (example: nvme0n1)?" + + read -r disk + + disk_model=$(lsblk --nodeps --output NAME,MODEL | grep $disk | awk '{$1=""; print $0}' | awk '{$1=$1};1') + disk_transport=$(lsblk --nodeps --output NAME,TRAN | grep $disk | awk '{print $2}' | awk '{$1=$1};1') +fi + +cpu_model=$(lscpu | grep 'Model name:' | sed --regexp-extended 's/Model name:\s+//g') + +printf "%s\n" "Benchmarking SHA256 computing…" + +openssl=$(openssl speed -multi $(nproc) -seconds 20 sha256 2> /dev/null | awk 'END {print $(NF)}' | sed --regexp-extended 's/k//g') + +printf "%s\n" "Benchmarking CPU…" + +sysbench_cpu=$(sysbench cpu --threads=$(nproc) --time=300 run | grep 'events per second:' | awk '{print $4}') + +printf "%s\n" "Benchmarking memory…" + +sysbench_memory=$(sysbench memory --threads=$(nproc) run | grep 'MiB transferred' | sed --regexp-extended --quiet 's/.+\(([0-9.]+).+/\1/p') + +printf "%s\n" "Preparing sysbench fileio dataset…" + +sysbench_disk_prepare=$(sysbench fileio --file-total-size=8G prepare | sed '$!d' | sed --regexp-extended --quiet 's/.+\(([0-9.]+).+/\1/p') + +printf "%s\n" "Benchmarking disk using 16K block size…" + +sysbench_disk_16k_rndrw_raw=$(sysbench fileio --file-block-size=16K --file-total-size=8G --file-test-mode=rndrw --threads=$(nproc) run) +sysbench_disk_16k_rndrw_read=$(echo "$sysbench_disk_16k_rndrw_raw" | grep 'read, MiB/s:' | awk '{print $3}') +sysbench_disk_16k_rndrw_write=$(echo "$sysbench_disk_16k_rndrw_raw" | grep 'written, MiB/s:' | awk '{print $3}') + +printf "%s\n" "Benchmarking disk using 1M block size…" + +sysbench_disk_1m_rndrw_raw=$(sysbench fileio --file-block-size=1M --file-total-size=8G --file-test-mode=rndrw --threads=$(nproc) run) +sysbench_disk_1m_rndrw_read=$(echo "$sysbench_disk_1m_rndrw_raw" | grep 'read, MiB/s:' | awk '{print $3}') +sysbench_disk_1m_rndrw_write=$(echo "$sysbench_disk_1m_rndrw_raw" | grep 'written, MiB/s:' | awk '{print $3}') + +score=$(printf %.2f $(echo "(($openssl/$pi_openssl+$sysbench_cpu/$pi_sysbench_cpu)/2)*($sysbench_memory/$pi_sysbench_memory)*(($sysbench_disk_prepare/$pi_sysbench_disk_prepare+$sysbench_disk_16k_rndrw_read/$pi_sysbench_disk_16k_rndrw_read+$sysbench_disk_16k_rndrw_write/$pi_sysbench_disk_16k_rndrw_write+$sysbench_disk_1m_rndrw_read/$pi_sysbench_disk_1m_rndrw_read+$sysbench_disk_1m_rndrw_write/$pi_sysbench_disk_1m_rndrw_write)/5)" | bc --mathlib)) + +cat << EOF | tee result.txt + +Result: + +openssl value in thousands of bytes processed per second +sysbench_cpu value in events per second +sysbench_memory, sysbench_disk_prepare and sysbench_disk_rndrw values in MiB per second +score value in times faster than Raspberry Pi 4 4GB with Samsung T7 Touch SSD 1TB + +{ + "disk_model": "$disk_model", + "disk_transport": "$disk_transport", + "cpu_model": "$cpu_model", + "openssl": "${openssl}", + "sysbench_cpu": "$sysbench_cpu", + "sysbench_memory": "$sysbench_memory", + "sysbench_disk_prepare": "$sysbench_disk_prepare", + "sysbench_disk_rndrw": { + "16k_read": "$sysbench_disk_16k_rndrw_read", + "16k_write": "$sysbench_disk_16k_rndrw_write", + "1m_read": "$sysbench_disk_1m_rndrw_read", + "1m_write": "$sysbench_disk_1m_rndrw_write" + }, + "score": "$score" +} + +EOF + +printf "%s\n" "Done" diff --git a/how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/benchmark.sh.asc b/how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/benchmark.sh.asc new file mode 100644 index 0000000..a7e1a8d --- /dev/null +++ b/how-to-self-host-hardened-bitcoin-node/misc/how-to-benchmark-computer-for-bitcoin-computation/benchmark.sh.asc @@ -0,0 +1,7 @@ +-----BEGIN PGP SIGNATURE----- + +iHUEABYKAB0WIQSceIfhtfy84t/tDhwCxDrQctV3gwUCYjShfgAKCRACxDrQctV3 +gz/RAQDTyOPFdR2MW9TN0aWTppIvulMk8Dx2X4iiEmak8x7o9AEAtD9FcUafdYrB +v7A9d9RaU0Si2q3bXiJRSQuYuQkX1gs= +=4rRp +-----END PGP SIGNATURE-----