-
Notifications
You must be signed in to change notification settings - Fork 29
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
dsocolobsky
wants to merge
34
commits into
main
Choose a base branch
from
automate-perf-tests
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 23 commits
Commits
Show all changes
34 commits
Select commit
Hold shift + click to select a range
52da6ca
script that watches balance of account
dsocolobsky 441fc6a
Run flamegraph reporting in Github CI
dsocolobsky 1ce321d
feat(cli/ethrex_l2): allow --default parameter in "ethrex_l2 config c…
dsocolobsky f9cb7bc
fix: create ethrex_l2 config in flamegraph_reporter.yaml
dsocolobsky d3679ec
Make load test retry if connection failed
dsocolobsky 37fcfd1
Use addr2line for faster perf usage
dsocolobsky 122a4a8
Use addr2line for faster perf usage 2
dsocolobsky 830159f
Run perf with --no-inline to make it faster
dsocolobsky 967e79e
Run perf with --no-inline to make it faster (2)
dsocolobsky fbb456f
Run inferno-collapse-perf with --tid parameter
dsocolobsky 803a72f
Run inferno-collapse-perf without --tid parameter
dsocolobsky 0b783ea
Run flamegraph for reth as well
dsocolobsky 6349a7a
Run flamegraph for reth in parallel in a separate job
dsocolobsky 89799a3
Add balance to account in genesis-load-test.json
dsocolobsky 5d3429c
Run cargo flamegraph with perf options
dsocolobsky 0dd0e05
Adjust paths in workflow
dsocolobsky 71b2c5d
Adjust paths in workflow 2
dsocolobsky 73c5edf
Deploy page workflow
dsocolobsky b128f48
Update deployed page with generated flamegraphs
dsocolobsky 9a7c430
Update deployed page with generated flamegraphs 2
dsocolobsky 29d50a4
Fix .svg paths
dsocolobsky 2d2160b
Add elapsed time for each test to static page
dsocolobsky 320acec
Use Github Action Outputs for test times
dsocolobsky bc4b4f1
Merge branch 'main' into automate-perf-tests
dsocolobsky 11c6696
Merge branch 'main' into automate-perf-tests
dsocolobsky 5f6d547
Run a 1000 iterations for the load tests.
dsocolobsky 201ab7a
Minor adjustments and cleanup for flamegraph_reporter.yaml
dsocolobsky 6b0c5e2
Simplify flamegraph script into a single one.
dsocolobsky 5db6105
Metadata for Slack link previews
dsocolobsky 43689a8
Send daily flamegraph report via Slack
dsocolobsky 3ff3063
Measure load test time more accurately
dsocolobsky 19e8b78
Fix local script
dsocolobsky 91e0b87
Send direct links to .svg files in Slack
dsocolobsky dbec9c7
Fix local script "make flamegraph"
dsocolobsky File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
#!/bin/bash | ||
|
||
iterations=10 | ||
value=10000000 | ||
account=0x33c6b73432B3aeA0C1725E415CC40D04908B85fd | ||
end_val=$((172 * $iterations * $value)) | ||
|
||
ethrex_l2 test load --path /home/runner/work/ethrex/ethrex/test_data/private_keys.txt -i $iterations -v --value $value --to $account | ||
|
||
start_time=$(date +%s) | ||
output=$(cast balance $account --rpc-url=http://localhost:1729 2>&1) | ||
retries=0 | ||
while [[ $output -le $end_val && $retries -lt 30 ]]; do | ||
sleep 5 | ||
output=$(cast balance $account --rpc-url=http://localhost:1729 2>&1) | ||
echo "balance was $output still not reached value of $end_val (retry $retries/30)" | ||
((retries++)) | ||
done | ||
end_time=$(date +%s) | ||
elapsed_time=$((end_time - start_time)) | ||
minutes=$((elapsed_time / 60)) | ||
seconds=$((elapsed_time % 60)) | ||
echo "Balance of $output reached in $minutes min $seconds s, killing process ethrex" | ||
|
||
sudo pkill ethrex && while pgrep -l "cargo-flamegraph"; do echo "waiting for reth to exit... "; sleep 1;done; | ||
|
||
# We need this for the following job, to add to the static page | ||
echo "time=$minutes minutes $seconds seconds" >> "$GITHUB_OUTPUT" |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
#!/bin/bash | ||
|
||
iterations=10 | ||
value=10000000 | ||
account=0x33c6b73432B3aeA0C1725E415CC40D04908B85fd | ||
end_val=$((172 * $iterations * $value)) | ||
|
||
ethrex_l2 test load --path /home/runner/work/ethrex/ethrex/test_data/private_keys.txt -i $iterations -v --value $value --to $account | ||
|
||
start_time=$(date +%s) | ||
output=$(cast balance $account --rpc-url=http://localhost:1729 2>&1) | ||
retries=0 | ||
while [[ $output -le $end_val && $retries -lt 30 ]]; do | ||
sleep 5 | ||
output=$(cast balance $account --rpc-url=http://localhost:1729 2>&1) | ||
echo "balance was $output still not reached value of $end_val (retry $retries/30)" | ||
((retries++)) | ||
done | ||
end_time=$(date +%s) | ||
elapsed_time=$((end_time - start_time)) | ||
minutes=$((elapsed_time / 60)) | ||
seconds=$((elapsed_time % 60)) | ||
echo "Balance of $output reached in $minutes min $seconds s, killing process reth" | ||
|
||
sudo pkill reth && while pgrep -l "cargo-flamegraph"; do echo "waiting for reth to exit... "; sleep 1;done; | ||
|
||
# We need this for the following job, to add to the static page | ||
echo "time=$minutes minutes $seconds seconds" >> "$GITHUB_OUTPUT" |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,209 @@ | ||
name: Daily Flamegraph Reporter | ||
|
||
permissions: | ||
contents: read | ||
pages: write | ||
id-token: write | ||
|
||
on: | ||
push: | ||
branches: [ "main" ] | ||
pull_request: | ||
branches: [ "**" ] | ||
workflow_dispatch: | ||
|
||
env: | ||
RUST_VERSION: 1.81.0 | ||
RUST_RETH_VERSION: 1.82.0 | ||
|
||
jobs: | ||
flamegraph-ethrex: | ||
name: Generate Flamegraph for Ethrex | ||
runs-on: ubuntu-latest | ||
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: Change perf settings | ||
run: | | ||
sudo sysctl kernel.perf_event_paranoid=-1 | ||
sudo perf list hw | ||
|
||
- name: Install flamegraph | ||
run: | | ||
cargo install flamegraph | ||
cargo install inferno | ||
|
||
- name: Install Foundry | ||
uses: foundry-rs/foundry-toolchain@v1 | ||
|
||
- 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 & | ||
echo "waiting to execute load test..." | ||
sleep 30 && | ||
echo "executing load test..." | ||
bash .github/scripts/flamegraph.sh && | ||
echo "Load test finished" | ||
|
||
- name: Generate SVG | ||
shell: bash | ||
run: | | ||
echo "running perf" | ||
perf script -v -i perf.data --no-inline > stack.data | ||
inferno-collapse-perf < stack.data > collapsed.data | ||
inferno-flamegraph < collapsed.data > flamegraph_ethrex.svg | ||
file 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 | ||
outputs: | ||
time: ${{steps.generate-flamegraph-reth.outputs.time}} | ||
steps: | ||
- name: Checkout sources | ||
uses: actions/checkout@v4 | ||
|
||
- name: Rustup toolchain install | ||
uses: dtolnay/rust-toolchain@stable | ||
with: | ||
toolchain: ${{ env.RUST_RETH_VERSION }} | ||
|
||
- name: Caching | ||
uses: Swatinem/rust-cache@v2 | ||
|
||
- name: Change perf settings | ||
run: | | ||
pwd | ||
sudo sysctl kernel.perf_event_paranoid=-1 | ||
sudo perf list hw | ||
|
||
- name: Install flamegraph | ||
run: | | ||
cargo install flamegraph | ||
cargo install inferno | ||
|
||
- name: Install Foundry | ||
uses: foundry-rs/foundry-toolchain@v1 | ||
|
||
- name: Install ethrex_l2 cli | ||
run: | | ||
cargo install --path cmd/ethrex_l2 | ||
ethrex_l2 config create default --default | ||
ethrex_l2 config set default | ||
|
||
- name: Checkout reth | ||
uses: actions/checkout@v4 | ||
with: | ||
repository: paradigmxyz/reth | ||
path: 'reth' | ||
|
||
- id: generate-flamegraph-reth | ||
name: Build and test reth | ||
shell: bash | ||
run: | | ||
cd ./reth | ||
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 5000ms --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 & | ||
echo "waiting to execute load test..." | ||
sleep 120 && | ||
bash /home/runner/work/ethrex/ethrex/.github/scripts/flamegraph_reth.sh && | ||
echo "Load test finished" | ||
ls -las | ||
|
||
- name: Generate SVG | ||
shell: bash | ||
run: | | ||
pwd | ||
echo "running perf 2" | ||
ls -las /home/runner/work/ethrex/ | ||
ls -las /home/runner/work/ethrex/ethrex/ | ||
perf script -v -i /home/runner/work/ethrex/ethrex/reth/perf.data --no-inline > stack.data | ||
inferno-collapse-perf < stack.data > collapsed.data | ||
inferno-flamegraph < collapsed.data > flamegraph_reth.svg | ||
file 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: | | ||
file flamegraph_ethrex.svg | ||
file flamegraph_reth.svg | ||
cp -r flamegraph_ethrex.svg pages/ | ||
cp -r flamegraph_reth.svg pages/ | ||
ls -las pages/ | ||
date +'%Y-%m-%dT%H:%M:%S' | ||
sed -i "s/{{LAST_UPDATE}}/$(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 |
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
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
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I collapsed all daily reports into https://github.com/lambdaclass/ethrex/blob/main/.github/workflows/daily_reports.yaml
There was a problem hiding this comment.
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.