Skip to content

feat(l1): extend preset boot nodes instead of replacing them when usi… #236

feat(l1): extend preset boot nodes instead of replacing them when usi…

feat(l1): extend preset boot nodes instead of replacing them when usi… #236

name: Flamegraph Reporter
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
push:
branches: ["main"]
workflow_dispatch:
env:
RUST_VERSION: 1.84.0
RUST_RETH_VERSION: 1.84.0
jobs:
generate-flamegraph-evm:
name: Generate Flamegraph LEVM
runs-on: ubuntu-latest
strategy:
matrix:
name: ["levm", "revm"]
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Rustup toolchain install
uses: dtolnay/rust-toolchain@stable
- name: Cache Extra Binaries
id: cache-binaries
uses: actions/cache@v4
with:
path: |
${{ env.HOME }}/.cargo/bin/addr2line
${{ env.HOME }}/.cargo/bin/flamegraph
${{ env.HOME }}/.cargo/bin/inferno-*
${{ env.HOME }}/ethrex/ethrex/cmd/ef_tests/levm/vectors
key: ${{ runner.os }}-${{ env.RUST_VERSION }}-extra-binaries
- 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: Check addr2line installation
id: check-addr2line
run: |
if [ -f "$HOME/.cargo/bin/addr2line" ]; then
echo "$HOME/.cargo/bin/addr2line found"
echo "addr2line_exists=true" >> $GITHUB_OUTPUT
else
echo "$HOME/.cargo/bin/addr2line NOT found"
echo "addr2line_exists=false" >> $GITHUB_OUTPUT
fi
- name: Checkout gimli addr2line
if: steps.check-addr2line.outputs.addr2line_exists != 'true'
uses: actions/checkout@v4
with:
repository: gimli-rs/addr2line
path: "addr2line"
- name: Build gimli addr2line
if: steps.check-addr2line.outputs.addr2line_exists != 'true'
working-directory: ./addr2line
run: |
# Little hack we need else it throws error building
echo "[workspace]" >> ./Cargo.toml
cargo install --force --features="bin" addr2line
- name: Install flamegraph tools
run: |
if [ ! -f "$HOME/.cargo/bin/flamegraph" ]; then
cargo install --force flamegraph
else
echo "$HOME/.cargo/bin/flamegraph already found"
fi
if [ ! -f "$HOME/.cargo/bin/inferno-collapse-perf" ]; then
cargo install --force inferno
else
echo "$HOME/.cargo/bin/inferno-collapse-perf already found"
fi
- name: Download EF Tests
run: |
if [ ! -f "$HOME/ethrex/ethrex/cmd/ef_tests/levm/vectors" ]; then
cd crates/vm/levm
make download-evm-ef-tests
fi
- name: Generate Flamegraph data for ${{ matrix.name }}
run: |
start_time=$(date +%s)
if [ "${{ matrix.name }}" == "levm" ]; then
rm -rf target/debug/ef_tests_levm
CARGO_PROFILE_RELEASE_DEBUG=true cargo flamegraph -c "record -o perf.data -F997 --call-graph dwarf,16384 -g" \
-p ef_tests-levm -- --tests stSolidityTest,stCallCodes
elif [ "${{ matrix.name }}" == "revm" ]; then
rm -rf target/debug/ef_tests_levm
CARGO_PROFILE_RELEASE_DEBUG=true cargo flamegraph -c "record -o perf.data -F997 --call-graph dwarf,16384 -g" \
-p ef_tests-levm -- --revm --tests stSolidityTest,stCallCodes
fi
end_time=$(date +%s)
elapsed_time=$((end_time - start_time))
echo "time_${{ matrix.name }}=${elapsed_time}" >> time_${{ matrix.name }}.txt
- 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
PATH=$HOME/.cargo/bin:$PATH inferno-collapse-perf -q < stack.data > collapsed.data
if [ "${{ matrix.name }}" == "levm" ]; then
PATH=$HOME/.cargo/bin:$PATH inferno-flamegraph --title "LEVM Flamegraph" < collapsed.data > flamegraph_levm.svg
elif [ "${{ matrix.name }}" == "revm" ]; then
PATH=$HOME/.cargo/bin:$PATH inferno-flamegraph --title "REVM Flamegraph" < collapsed.data > flamegraph_revm.svg
fi
- name: Upload artifact - time_${{ matrix.name }}.txt
uses: actions/upload-artifact@v4
with:
name: time_${{ matrix.name }}.txt
path: time_${{ matrix.name }}.txt
- name: Upload artifact - ${{ matrix.name }}
uses: actions/upload-artifact@v4
with:
name: flamegraph_${{ matrix.name }}.svg
path: ./flamegraph_${{ matrix.name }}.svg
test-output:
name: Test Output
runs-on: ubuntu-latest
needs: [generate-flamegraph-evm]
steps:
- name: Download artifact
uses: actions/download-artifact@v4
with:
name: time_levm.txt
path: time_levm.txt
- name: Download artifact
uses: actions/download-artifact@v4
with:
name: time_revm.txt
path: time_revm.txt
- name: echo Output
run: |
echo "LevM Time: $(grep "time_levm" time_levm.txt/time_levm.txt | cut -d '=' -f2)"
echo "Revm Time: $(grep "time_revm" time_revm.txt/time_revm.txt | cut -d '=' -f2)"
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 Extra Binaries
id: cache-binaries
uses: actions/cache@v4
with:
path: |
${{ env.HOME }}/.cargo/bin/addr2line
${{ env.HOME }}/.cargo/bin/flamegraph
${{ env.HOME }}/.cargo/bin/inferno-*
key: ${{ runner.os }}-${{ env.RUST_VERSION }}-extra-binaries
- name: Cache ethrex_l2
id: cache-ethrex-l2
uses: actions/cache@v4
with:
path: ${{ env.HOME }}/.cargo/bin/ethrex_l2
key: ${{ runner.os }}-${{ env.RUST_VERSION }}-ethrex-l2-${{ hashFiles('cmd/ethrex_l2/Cargo.lock') }}
- 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: Check addr2line installation
id: check-addr2line
run: |
if [ -f "$HOME/.cargo/bin/addr2line" ]; then
echo "$HOME/.cargo/bin/addr2line found"
echo "addr2line_exists=true" >> $GITHUB_OUTPUT
else
echo "$HOME/.cargo/bin/addr2line NOT found"
echo "addr2line_exists=false" >> $GITHUB_OUTPUT
fi
- name: Checkout gimli addr2line
if: steps.check-addr2line.outputs.addr2line_exists != 'true'
uses: actions/checkout@v4
with:
repository: gimli-rs/addr2line
path: "addr2line"
- name: Build gimli addr2line
if: steps.check-addr2line.outputs.addr2line_exists != 'true'
working-directory: ./addr2line
run: |
# Little hack we need else it throws error building
echo "[workspace]" >> ./Cargo.toml
cargo install --force --features="bin" addr2line
- name: Install flamegraph
run: |
if [ ! -f "$HOME/.cargo/bin/flamegraph" ]; then
cargo install --force flamegraph
else
echo "$HOME/.cargo/bin/flamegraph" already found
fi
if [ ! -f "$HOME/.cargo/bin/inferno-collapse-perf" ]; then
cargo install --force inferno
else
echo "$HOME/.cargo/bin/inferno-collapse-perf" already found
fi
- name: Install ethrex_l2 cli
run: |
if [ -f "$HOME/.cargo/bin/ethrex_l2" ]; then
echo "$HOME/.cargo/bin/ethrex_l2" already found
else
cargo install --force --path cmd/ethrex_l2
fi
ethrex_l2 config create default --default
ethrex_l2 config set default
- id: generate-flamegraph-ethrex
name: Generate Flamegraph data for Ethrex
shell: bash
run: |
rm -rf target/release/ethrex
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 &
while [ ! -x "./target/release/ethrex" ]; do
echo "Waiting for ethrex binary to be ready..."
sleep 2
done
sleep 10
echo "Compilation finished. 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
PATH=$HOME/.cargo/bin:$PATH inferno-collapse-perf -q < stack.data > collapsed.data
PATH=$HOME/.cargo/bin:$PATH 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: Checkout sources
uses: actions/checkout@v4
- name: Rustup toolchain install
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ env.RUST_RETH_VERSION }}
- name: Checkout reth
uses: actions/checkout@v4
with:
repository: paradigmxyz/reth
path: "reth"
ref: main
- name: Caching
uses: Swatinem/rust-cache@v2
with:
workspaces: ". -> target \
./reth -> ./reth/target"
- name: Cache Extra Binaries
id: cache-binaries
uses: actions/cache@v4
with:
path: |
${{ env.HOME }}/.cargo/bin/addr2line
${{ env.HOME }}/.cargo/bin/flamegraph
${{ env.HOME }}/.cargo/bin/inferno-*
key: ${{ runner.os }}-${{ env.RUST_VERSION }}-extra-binaries
- name: Cache ethrex_l2
id: cache-ethrex-l2
uses: actions/cache@v4
with:
path: ${{ env.HOME }}/.cargo/bin/ethrex_l2
key: ${{ runner.os }}-${{ env.RUST_VERSION }}-ethrex-l2-${{ hashFiles('cmd/ethrex_l2/Cargo.lock') }}
- 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: Check addr2line installation
id: check-addr2line
run: |
if [ -f "$HOME/.cargo/bin/addr2line" ]; then
echo "$HOME/.cargo/bin/addr2line found"
echo "addr2line_exists=true" >> $GITHUB_OUTPUT
else
echo "$HOME/.cargo/bin/addr2line NOT found"
echo "addr2line_exists=false" >> $GITHUB_OUTPUT
fi
- name: Checkout gimli addr2line
if: steps.check-addr2line.outputs.addr2line_exists != 'true'
uses: actions/checkout@v4
with:
repository: gimli-rs/addr2line
path: "addr2line"
- name: Build gimli addr2line
if: steps.check-addr2line.outputs.addr2line_exists != 'true'
working-directory: ./addr2line
run: |
# Little hack we need else it throws error building
echo "[workspace]" >> ./Cargo.toml
cargo install --force --features="bin" addr2line
- name: Install flamegraph
run: |
if [ ! -f "$HOME/.cargo/bin/flamegraph" ]; then
cargo install --force flamegraph
else
echo "$HOME/.cargo/bin/flamegraph" already found
fi
if [ ! -f "$HOME/.cargo/bin/inferno-collapse-perf" ]; then
cargo install --force inferno
else
echo "$HOME/.cargo/bin/inferno-collapse-perf" already found
fi
- name: Install ethrex_l2 cli
run: |
if [ -f "$HOME/.cargo/bin/ethrex_l2" ]; then
echo "$HOME/.cargo/bin/ethrex_l2" already found
else
cargo install --force --path cmd/ethrex_l2
fi
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
rm -rf target/profiling/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 &
while [ ! -x "./target/profiling/reth" ]; do
echo "Waiting for reth binary to be ready..."
sleep 10
done
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/reth/perf.data --no-inline > stack.data
PATH=$HOME/.cargo/bin:$PATH inferno-collapse-perf -q < stack.data > collapsed.data
PATH=$HOME/.cargo/bin:$PATH 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: [generate-flamegraph-evm, 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: Download levm flamegraph artifact
uses: actions/download-artifact@v4
with:
name: flamegraph_levm.svg
path: flamegraph_levm.svg
- name: Download revm flamegraph artifact
uses: actions/download-artifact@v4
with:
name: flamegraph_revm.svg
path: flamegraph_revm.svg
- name: Download levm time artifact
uses: actions/download-artifact@v4
with:
name: time_levm.txt
path: time_levm.txt
- name: Download revm time artifact
uses: actions/download-artifact@v4
with:
name: time_revm.txt
path: time_revm.txt
- name: Update static page locally with new data
shell: bash
run: |
cp -r flamegraph_levm.svg pages/
cp -r flamegraph_revm.svg pages/
cp -r flamegraph_ethrex.svg pages/
cp -r flamegraph_reth.svg pages/
# ETHREX HTML
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
# LEVM HTML
sed -i "s/{{LAST_UPDATE}}/$(TZ='Etc/GMT+3' date +'%Y-%m-%dT%H:%M:%S')/g" pages/levm.html
time_levm=$(grep "time_levm" time_levm.txt/time_levm.txt | cut -d '=' -f2)
minutes=$(bc -l <<< "scale=0; $time_levm / 60")
seconds=$(bc -l <<< "scale=0; $time_levm % 60")
time_levm_str="${minutes} minutes ${seconds} seconds"
sed -i "s/{{LEVM_TIME}}/${time_levm_str}/g" pages/levm.html
time_revm=$(grep "time_revm" time_revm.txt/time_revm.txt | cut -d '=' -f2)
minutes=$(bc -l <<< "scale=0; $time_revm / 60")
seconds=$(bc -l <<< "scale=0; $time_revm % 60")
time_revm_str="${minutes} minutes ${seconds} seconds"
sed -i "s/{{REVM_TIME}}/${time_revm_str}/g" pages/levm.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