docs: Add client and protocol detail #4
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Benchmark Chart Generation | |
# Do not run this workflow on pull request since this workflow has permission to modify contents. | |
on: | |
push: | |
branches: | |
- main | |
permissions: | |
# deployments permission to deploy GitHub pages website | |
deployments: write | |
# contents permission to update benchmark contents in gh-pages branch | |
contents: write | |
env: | |
CARGO_INCREMENTAL: '0' | |
RUST_BACKTRACE: 1 | |
CLIENT_DATA_PATH: /home/runner/.local/share/safe/client | |
NODE_DATA_PATH: /home/runner/.local/share/safe/node | |
jobs: | |
benchmark: | |
if: "!startsWith(github.event.head_commit.message, 'chore(release):')" | |
name: Run and log benchmark criterion results on gh-pages | |
# right now only ubuntu, running on multiple systems would require many pushes...\ | |
# perhaps this can be done with one consolidation action in the future, pulling down all results and pushing | |
# once to the branch.. | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions-rs/toolchain@v1 | |
with: | |
profile: minimal | |
toolchain: stable | |
override: true | |
components: rustfmt, clippy | |
- uses: Swatinem/rust-cache@v2 | |
continue-on-error: true | |
- run: cargo install cargo-criterion | |
- name: ubuntu install ripgrep | |
run: sudo apt-get -y install ripgrep | |
- name: Download 95mb file to be uploaded with the safe client | |
shell: bash | |
run: wget https://sn-node.s3.eu-west-2.amazonaws.com/the-test-data.zip | |
- name: Build node and client | |
run: cargo build --release --features local-discovery --bin safenode --bin safe --bin faucet | |
timeout-minutes: 30 | |
- name: Start a local network | |
uses: maidsafe/sn-local-testnet-action@main | |
with: | |
action: start | |
interval: 2000 | |
node-path: target/release/safenode | |
faucet-path: target/release/faucet | |
platform: ubuntu-latest | |
- name: Create and fund a wallet to pay for files storage | |
run: | | |
cargo run --bin faucet --release -- --log-output-dest=data-dir send 1000000 $(cargo run --bin safe --release -- wallet address | tail -n 1) | tail -n 1 > dbc_hex | |
cat dbc_hex | cargo run --bin safe --release -- wallet deposit --stdin | |
env: | |
SN_LOG: "all" | |
timeout-minutes: 10 | |
######################## | |
### Benchmark ### | |
######################## | |
- name: Bench `safe` | |
shell: bash | |
# Criterion outputs the actual bench results to stderr "2>&1 tee output.txt" takes stderr, | |
# passes to tee which displays it in the terminal and writes to output.txt | |
run: | | |
cargo criterion --features=local-discovery --message-format=json 2>&1 | tee -a output.txt | |
cat output.txt | rg benchmark-complete | jq -s 'map({ | |
name: (.id | split("/"))[-1], | |
unit: "MiB/s", | |
value: ((if .throughput[0].unit == "KiB/s" then (.throughput[0].per_iteration / (1024*1024*1024)) else (.throughput[0].per_iteration / (1024*1024)) end) / (.mean.estimate / 1e9)) | |
})' > files-benchmark.json | |
- name: Remove git hooks so gh-pages git commits will work | |
shell: bash | |
run: rm -rf .git/hooks/pre-commit | |
- name: check files-benchmark.json | |
shell: bash | |
run: cat files-benchmark.json | |
# gh-pages branch is updated and pushed automatically with extracted benchmark data | |
- name: Store cli files benchmark result | |
uses: benchmark-action/github-action-benchmark@v1 | |
with: | |
name: "`safe files` benchmarks" | |
tool: 'customBiggerIsBetter' | |
output-file-path: files-benchmark.json | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
auto-push: true | |
max-items-in-chart: 300 | |
- name: Start a client instance to compare memory usage | |
shell: bash | |
run: cargo run --bin safe --release -- --log-output-dest=data-dir files upload the-test-data.zip | |
env: | |
SN_LOG: "all" | |
######################### | |
### Mem Analysis ### | |
######################### | |
- name: Stop the local network | |
if: always() | |
uses: maidsafe/sn-local-testnet-action@main | |
with: | |
action: stop | |
platform: ubuntu-latest | |
- name: Check node memory usage | |
shell: bash | |
run: | | |
node_peak_mem_limit_mb="250" # mb | |
peak_mem_usage=$( | |
rg '"memory_used_mb":[^,]*' $NODE_DATA_PATH/*/logs/* -o --no-line-number --no-filename | | |
awk -F':' '/"memory_used_mb":/{print $2}' | | |
sort -n | | |
tail -n 1 | |
) | |
echo "Memory usage: $peak_mem_usage MB" | |
if (( $(echo "$peak_mem_usage > $node_peak_mem_limit_mb" | bc -l) )); then | |
echo "Node memory usage exceeded threshold: $peak_mem_usage MB" | |
exit 1 | |
fi | |
# Write the node memory usage to a file | |
echo '[ | |
{ | |
"name": "Peak memory w/ `safe` benchmarks", | |
"value": '$peak_mem_usage', | |
"unit": "MB" | |
} | |
]' > node_memory_usage.json | |
- name: check node_memory_usage.json | |
shell: bash | |
run: cat node_memory_usage.json | |
- name: Upload Node Memory Usage | |
uses: benchmark-action/github-action-benchmark@v1 | |
with: | |
name: 'Node memory' | |
tool: 'customSmallerIsBetter' | |
output-file-path: node_memory_usage.json | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
auto-push: true | |
max-items-in-chart: 300 | |
- name: Check client memory usage | |
shell: bash | |
run: | | |
client_peak_mem_limit_mb="1000" # mb | |
client_avg_mem_limit_mb="850" # mb | |
peak_mem_usage=$( | |
rg '"memory_used_mb":[^,]*' $CLIENT_DATA_PATH/logs/safe.* -o --no-line-number --no-filename | | |
awk -F':' '/"memory_used_mb":/{print $2}' | | |
sort -n | | |
tail -n 1 | |
) | |
echo "Peak memory usage: $peak_mem_usage MB" | |
if (( $(echo "$peak_mem_usage > $client_peak_mem_limit_mb" | bc -l) )); then | |
echo "Client peak memory usage exceeded threshold: $client_peak_mem_limit_mb MB" | |
exit 1 | |
fi | |
total_mem=$( | |
rg '"memory_used_mb":[^,]*' $CLIENT_DATA_PATH/logs/safe.* -o --no-line-number --no-filename | | |
awk -F':' '/"memory_used_mb":/ {sum += $2} END {printf "%.0f\n", sum}' | |
) | |
num_of_times=$( | |
rg "\"memory_used_mb\"" $CLIENT_DATA_PATH/logs/safe.* -c --stats | | |
rg "(\d+) matches" | | |
rg "\d+" -o | |
) | |
echo "num_of_times: $num_of_times" | |
echo "Total memory is: $total_mem" | |
average_mem=$(($total_mem/$(($num_of_times)))) | |
echo "Average memory is: $average_mem" | |
if (( $(echo "$average_mem > $client_avg_mem_limit_mb" | bc -l) )); then | |
echo "Client average memory usage exceeded threshold: $client_avg_mem_limit_mb MB" | |
exit 1 | |
fi | |
# Write the client memory usage to a file | |
echo '[ | |
{ | |
"name": "Peak memory usage w/ upload", | |
"value": '$peak_mem_usage', | |
"unit": "MB" | |
}, | |
{ | |
"name": "Average memory usage w/ upload", | |
"value": '$average_mem', | |
"unit": "MB" | |
} | |
]' > client_memory_usage.json | |
- name: check client_memory_usage.json | |
shell: bash | |
run: cat client_memory_usage.json | |
- name: Upload Client Memory Usage | |
uses: benchmark-action/github-action-benchmark@v1 | |
with: | |
name: 'Client memory' | |
tool: 'customSmallerIsBetter' | |
output-file-path: client_memory_usage.json | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
auto-push: true | |
max-items-in-chart: 300 |