Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ci(l2): automate flamegraph tests #1366

Open
wants to merge 63 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
52da6ca
script that watches balance of account
dsocolobsky Nov 29, 2024
441fc6a
Run flamegraph reporting in Github CI
dsocolobsky Dec 2, 2024
1ce321d
feat(cli/ethrex_l2): allow --default parameter in "ethrex_l2 config c…
dsocolobsky Dec 2, 2024
f9cb7bc
fix: create ethrex_l2 config in flamegraph_reporter.yaml
dsocolobsky Dec 2, 2024
d3679ec
Make load test retry if connection failed
dsocolobsky Dec 2, 2024
37fcfd1
Use addr2line for faster perf usage
dsocolobsky Dec 3, 2024
122a4a8
Use addr2line for faster perf usage 2
dsocolobsky Dec 3, 2024
830159f
Run perf with --no-inline to make it faster
dsocolobsky Dec 3, 2024
967e79e
Run perf with --no-inline to make it faster (2)
dsocolobsky Dec 3, 2024
fbb456f
Run inferno-collapse-perf with --tid parameter
dsocolobsky Dec 3, 2024
803a72f
Run inferno-collapse-perf without --tid parameter
dsocolobsky Dec 3, 2024
0b783ea
Run flamegraph for reth as well
dsocolobsky Dec 4, 2024
6349a7a
Run flamegraph for reth in parallel in a separate job
dsocolobsky Dec 4, 2024
89799a3
Add balance to account in genesis-load-test.json
dsocolobsky Dec 4, 2024
5d3429c
Run cargo flamegraph with perf options
dsocolobsky Dec 4, 2024
0dd0e05
Adjust paths in workflow
dsocolobsky Dec 4, 2024
71b2c5d
Adjust paths in workflow 2
dsocolobsky Dec 4, 2024
73c5edf
Deploy page workflow
dsocolobsky Dec 4, 2024
b128f48
Update deployed page with generated flamegraphs
dsocolobsky Dec 5, 2024
9a7c430
Update deployed page with generated flamegraphs 2
dsocolobsky Dec 5, 2024
29d50a4
Fix .svg paths
dsocolobsky Dec 5, 2024
2d2160b
Add elapsed time for each test to static page
dsocolobsky Dec 5, 2024
320acec
Use Github Action Outputs for test times
dsocolobsky Dec 5, 2024
bc4b4f1
Merge branch 'main' into automate-perf-tests
dsocolobsky Dec 5, 2024
11c6696
Merge branch 'main' into automate-perf-tests
dsocolobsky Dec 6, 2024
5f6d547
Run a 1000 iterations for the load tests.
dsocolobsky Dec 6, 2024
201ab7a
Minor adjustments and cleanup for flamegraph_reporter.yaml
dsocolobsky Dec 6, 2024
6b0c5e2
Simplify flamegraph script into a single one.
dsocolobsky Dec 6, 2024
5db6105
Metadata for Slack link previews
dsocolobsky Dec 6, 2024
43689a8
Send daily flamegraph report via Slack
dsocolobsky Dec 6, 2024
3ff3063
Measure load test time more accurately
dsocolobsky Dec 6, 2024
19e8b78
Fix local script
dsocolobsky Dec 6, 2024
91e0b87
Send direct links to .svg files in Slack
dsocolobsky Dec 6, 2024
dbec9c7
Fix local script "make flamegraph"
dsocolobsky Dec 6, 2024
a28971f
refactor: small improvements
fborello-lambda Jan 7, 2025
dab2121
Merge branch 'main' into automate-perf-tests
fborello-lambda Jan 7, 2025
f55c741
rm: unneeded step in ci
fborello-lambda Jan 7, 2025
9e54c2e
fix: bash scripts duration time
fborello-lambda Jan 8, 2025
3cbb899
Merge branch 'main' into automate-perf-tests
fborello-lambda Jan 8, 2025
9392999
chore: lower the amount of txs
fborello-lambda Jan 8, 2025
d8410ca
Merge branch 'automate-perf-tests' of github.com:lambdaclass/ethrex i…
fborello-lambda Jan 8, 2025
968d951
chore: suppress output
fborello-lambda Jan 8, 2025
15567c9
fix: test pgrep -f
fborello-lambda Jan 8, 2025
0ba0191
fix: test pgrep -l shorter
fborello-lambda Jan 8, 2025
1b8a3a4
fix: test if full_path works
fborello-lambda Jan 8, 2025
8bb0077
fix: test lowering the iterations and wait for perf
fborello-lambda Jan 8, 2025
274c7e4
chore: spinner
fborello-lambda Jan 8, 2025
18e96a5
chore: rm spinner for ci
fborello-lambda Jan 8, 2025
3cca963
fix: calculate time to process the balance
fborello-lambda Jan 9, 2025
a82cb9c
Merge branch 'main' into automate-perf-tests
dsocolobsky Jan 15, 2025
3c39c68
chore: add .idea/ to .gitignore
dsocolobsky Jan 15, 2025
b73b2d4
chore: Bump workflow's CI Rust version to 1.84.0
dsocolobsky Jan 15, 2025
28344d5
chore: Attempt to cache cargo binaries in CI
dsocolobsky Jan 15, 2025
d93c90b
chore: ci: try running reth without profile=profiling
dsocolobsky Jan 15, 2025
9e65249
chore: ci: Use gimli's addr2line for faster perf
dsocolobsky Jan 16, 2025
e1f9063
chore: ci: Cache reth repo
dsocolobsky Jan 16, 2025
dcf001e
chore: ci: Read kernel symbols in perf
dsocolobsky Jan 16, 2025
4552225
chore: ci: Cache ethrex_l2 in "flamegraph-reth" as well
dsocolobsky Jan 16, 2025
56b57b9
chore: ci: Add CARGO_PROFILE_RELEASE_DEBUG=true to reth call
dsocolobsky Jan 16, 2025
a7392f2
chore: ci: Modify slightly how we measure load test time
dsocolobsky Jan 16, 2025
4b47cb6
chore: ci: Try compiling reth with maxperf
dsocolobsky Jan 16, 2025
47c4b8a
chore: ci: fix ethrex_l2 for flamegraph-reth
dsocolobsky Jan 16, 2025
f93037c
chore: ci: Test sleeping 20min before running the perf tests on reth
dsocolobsky Jan 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .github/scripts/flamegraph_watcher.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/bin/bash

# This script sends 171 * <iterations> transactions to a test account, per defined private key
# then polls the account balance until the expected balance has been reached
# and then kills the process. It also measures the elapsed time of the test and
# outputs it to Github Action's outputs.
iterations=50
value=1
account=0x33c6b73432B3aeA0C1725E415CC40D04908B85fd
end_val=$((171 * $iterations * $value))

ethrex_l2 test load --path /home/runner/work/ethrex/ethrex/test_data/private_keys.txt -i $iterations -v --value $value --to $account >/dev/null

start_time=$(date +%s)
output=$(ethrex_l2 info -b -a $account --wei 2>&1)
while [[ $output -lt $end_val ]]; do
sleep 5
output=$(ethrex_l2 info -b -a $account --wei 2>&1)
done
end_time=$(date +%s)
elapsed=$((end_time - start_time))

minutes=$((elapsed / 60))
seconds=$((elapsed % 60))
output=$(ethrex_l2 info -b -a $account --wei 2>&1)
echo "Balance of $output reached in $minutes min $seconds s, killing process"

sudo pkill "$PROGRAM"

while pgrep -l "perf" >/dev/null; do
sleep 10
done

# We need this for the following job, to add to the static page
echo "time=$minutes minutes $seconds seconds" >>"$GITHUB_OUTPUT"
23 changes: 23 additions & 0 deletions .github/scripts/publish_link_flamegraphs.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
curl -XPOST -H "Content-type: application/json" -d '{
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": "Daily Flamegraph Report"
}
},
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "🔥 Flamegraphs are available at *<https://lambdaclass.github.io/ethrex/|lambdaclass.github.io/ethrex/>*\n
• *<https://lambdaclass.github.io/ethrex/flamegraph_ethrex.svg/flamegraph_ethrex.svg|Ethrex Flamegraph>*\n
• *<https://lambdaclass.github.io/ethrex/flamegraph_reth.svg/flamegraph_reth.svg|Reth Flamegraph>*\n"
}
}
]
}' "$url"
19 changes: 19 additions & 0 deletions .github/workflows/daily_reports.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -189,3 +189,22 @@ jobs:
env:
url: ${{ secrets.LEVM_SLACK_WEBHOOK }}
run: sh .github/scripts/publish_levm_ef_tests_summary.sh

flamegraphs-page:
name: Post to Slack link to Flamegraphs Page
runs-on: ubuntu-latest
steps:
- name: Post results to ethrex L1 slack channel
env:
url: ${{ secrets.ETHREX_L1_SLACK_WEBHOOK }}
run: sh .github/scripts/publish_link_flamegraphs.sh

- name: Post results to ethrex L2 slack channel
env:
url: ${{ secrets.ETHREX_L2_SLACK_WEBHOOK }}
run: sh .github/scripts/publish_link_flamegraphs.sh

- name: Post results to levm slack channel
env:
url: ${{ secrets.LEVM_SLACK_WEBHOOK }}
run: sh .github/scripts/publish_link_flamegraphs.sh
258 changes: 258 additions & 0 deletions .github/workflows/flamegraph_reporter.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
name: Daily Flamegraph Reporter
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! Not sure if it's daily though, I forgot I had named it like that but I think it's supposed to run in each merge to master; I will ask Javi/Ivan.


permissions:
contents: read
pages: write
id-token: write

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "**" ]
workflow_dispatch:

env:
RUST_VERSION: 1.84.0
RUST_RETH_VERSION: 1.84.0

jobs:
flamegraph-ethrex:
name: Generate Flamegraph for Ethrex
runs-on: ubuntu-latest
env:
PROGRAM: ethrex
outputs:
time: ${{steps.generate-flamegraph-ethrex.outputs.time}}
steps:
- name: Checkout sources
uses: actions/checkout@v4

- name: Rustup toolchain install
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ env.RUST_VERSION }}

- name: Caching
uses: Swatinem/rust-cache@v2

- name: Cache Cargo binaries
uses: actions/cache@v4
with:
path: ~/.cargo/bin
key: ${{ runner.os }}-cargo-install-${{ hashFiles('cmd/ethrex_l2/Cargo.toml') }}
restore-keys: |
${{ runner.os }}-cargo-install-

- name: Change perf settings
run: |
sudo sysctl kernel.perf_event_paranoid=-1
sudo sysctl -w kernel.kptr_restrict=0
sudo chmod +r /proc/kallsyms
sudo perf list hw

- name: Checkout gimli addr2line
uses: actions/checkout@v4
with:
repository: gimli-rs/addr2line
path: "addr2line"

- name: Build gimli addr2line
working-directory: ./addr2line
run: |
# Little hack we need else it throws error building
echo "[workspace]" >> ./Cargo.toml
cargo install --features="bin" addr2line

- name: Install flamegraph
run: |
cargo install flamegraph
cargo install inferno

- name: Install ethrex_l2 cli
run: |
cargo install --path cmd/ethrex_l2
ethrex_l2 config create default --default
ethrex_l2 config set default

- name: Build ethrex
run: CARGO_PROFILE_RELEASE_DEBUG=true cargo build --release --bin ethrex --features dev

- id: generate-flamegraph-ethrex
name: Generate Flamegraph data for Ethrex
shell: bash
run: |
CARGO_PROFILE_RELEASE_DEBUG=true cargo flamegraph -c "record -o perf.data -F997 --call-graph dwarf,16384 -g" \
--bin ethrex --features dev -- --network /home/runner/work/ethrex/ethrex/test_data/genesis-l2.json --http.port 1729 >/dev/null &
echo "waiting to execute load test..."
sleep 30 &&
echo "executing load test..."
bash /home/runner/work/ethrex/ethrex/.github/scripts/flamegraph_watcher.sh &&
echo "Load test finished"

- name: Generate SVG
shell: bash
run: |
PATH=$HOME/.cargo/bin:$PATH which addr2line
PATH=$HOME/.cargo/bin:$PATH perf script -v -i /home/runner/work/ethrex/ethrex/perf.data --no-inline > stack.data
inferno-collapse-perf -q < stack.data > collapsed.data
inferno-flamegraph --title "Ethrex Flamegraph" < collapsed.data > flamegraph_ethrex.svg

- name: Upload artifacts - flamegraph_ethrex.svg
uses: actions/upload-artifact@v4
with:
name: flamegraph_ethrex.svg
path: ./flamegraph_ethrex.svg

flamegraph-reth:
name: Generate Flamegraph for Reth
runs-on: ubuntu-latest
env:
PROGRAM: reth
outputs:
time: ${{steps.generate-flamegraph-reth.outputs.time}}
steps:
- name: Cache Cargo binaries
uses: actions/cache@v4
with:
path: ~/.cargo/bin
key: ${{ runner.os }}-cargo-install-${{ hashFiles('cmd/ethrex_l2/Cargo.toml') }}
restore-keys: |
${{ runner.os }}-cargo-install-

- name: Checkout sources
uses: actions/checkout@v4

- name: Rustup toolchain install
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ env.RUST_RETH_VERSION }}

- name: Cache reth repository
uses: actions/cache@v4
id: cache-reth-repo
with:
path: reth
key: reth-repo-main-${{ hashFiles('reth/Cargo.lock') }}
restore-keys: |
reth-repo-${{ env.RETH_REF }}-
reth-repo-

- name: Checkout reth
if: steps.cache-reth-repo.outputs.cache-hit != 'true'
uses: actions/checkout@v4
with:
repository: paradigmxyz/reth
path: "reth"
ref: main

- name: Caching
uses: Swatinem/rust-cache@v2
with:
workspaces: "reth -> target"
key: reth-build-main

- name: Change perf settings
run: |
sudo sysctl kernel.perf_event_paranoid=-1
sudo sysctl -w kernel.kptr_restrict=0
sudo chmod +r /proc/kallsyms
sudo perf list hw

- name: Checkout gimli addr2line
uses: actions/checkout@v4
with:
repository: gimli-rs/addr2line
path: "addr2line"

- name: Build gimli addr2line
working-directory: ./addr2line
run: |
# Little hack we need else it throws error building
echo "[workspace]" >> ./Cargo.toml
cargo install --features="bin" addr2line

- name: Install flamegraph
run: |
cargo install flamegraph
cargo install inferno

- name: Install ethrex_l2 cli
run: |
cargo install --path cmd/ethrex_l2
ethrex_l2 config create default --default
ethrex_l2 config set default

- id: generate-flamegraph-reth
name: Build and test reth
shell: bash
# --dev.block-time 1000ms set to 1000ms to match ethrex block generation time
run: |
cd ./reth
CARGO_PROFILE_RELEASE_DEBUG=true cargo flamegraph -c "record -o perf.data -F997 --call-graph dwarf,16384 -g" --bin reth --profile profiling \
-- node --chain /home/runner/work/ethrex/ethrex/test_data/genesis-load-test.json --dev \
--dev.block-time 1000ms --http.port 1729 --txpool.max-pending-txns 100000000 --txpool.max-new-txns 1000000000 \
--txpool.pending-max-count 100000000 --txpool.pending-max-size 10000000000 --txpool.basefee-max-count 100000000000 \
--txpool.basefee-max-size 1000000000000 --txpool.queued-max-count 1000000000 >/dev/null &
echo "waiting to execute load test..."
sleep 1200 &&
bash /home/runner/work/ethrex/ethrex/.github/scripts/flamegraph_watcher.sh &&
echo "Load test finished"

- name: Generate SVG
shell: bash
run: |
PATH=$HOME/.cargo/bin:$PATH which addr2line
PATH=$HOME/.cargo/bin:$PATH perf script -v -i /home/runner/work/ethrex/ethrex/reth/perf.data --no-inline > stack.data
inferno-collapse-perf -q < stack.data > collapsed.data
inferno-flamegraph --title "Reth Flamegraph" < collapsed.data > flamegraph_reth.svg

- name: Upload artifacts - flamegraph_reth.svg
uses: actions/upload-artifact@v4
with:
name: flamegraph_reth.svg
path: ./flamegraph_reth.svg

upload-static-page:
name: Upload artifacts for static page
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
needs: [ flamegraph-ethrex, flamegraph-reth ]
steps:
- name: Checkout sources
uses: actions/checkout@v4

- name: Download ethrex flamegraph artifact
uses: actions/download-artifact@v4
with:
name: flamegraph_ethrex.svg
path: flamegraph_ethrex.svg

- name: Download reth flamegraph artifact
uses: actions/download-artifact@v4
with:
name: flamegraph_reth.svg
path: flamegraph_reth.svg

- name: Update static page locally with new data
shell: bash
run: |
cp -r flamegraph_ethrex.svg pages/
cp -r flamegraph_reth.svg pages/
sed -i "s/{{LAST_UPDATE}}/$(TZ='Etc/GMT+3' date +'%Y-%m-%dT%H:%M:%S')/g" pages/index.html
sed -i "s/{{ETHREX_TIME}}/${{ needs.flamegraph-ethrex.outputs.time }}/g" pages/index.html
sed -i "s/{{RETH_TIME}}/${{ needs.flamegraph-reth.outputs.time }}/g" pages/index.html

- name: Setup Pages
uses: actions/configure-pages@v5

- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: "pages/"

- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ ethereum-package/

**/.DS_Store
**/.vscode
**/.idea


# EVM Mlir stuff
Expand Down
7 changes: 7 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -196,3 +196,10 @@ load-node: install-cli ## 🚧 Runs a load-test. Run make start-node-with-flameg

rm-test-db: ## 🛑 Removes the DB used by the ethrex client used for testing
sudo cargo run --release --bin ethrex -- removedb --datadir test_ethrex

flamegraph:
sudo -E CARGO_PROFILE_RELEASE_DEBUG=true cargo flamegraph --bin ethrex --features dev -- --network test_data/genesis-l2.json --http.port 1729 >/dev/null &
bash scripts/flamegraph.sh

test-load:
ethrex_l2 test load --path ./test_data/private_keys.txt -i 1000 -v --value 10000000 --to 0xFCbaC0713ACf16708aB6BC977227041FA1BC618D
Loading
Loading