Skip to content

wip: fix

wip: fix #8

name: Flamegraph Reporter LEVM
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", "levm/perf/automate_flamegraph"]
workflow_dispatch:
jobs:
flamegraph-levm:
name: Generate Flamegraph for LEVM
runs-on: ubuntu-latest
# TODO set time
outputs:
time: ${{steps.generate-flamegraph-levm.outputs.time}}
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Rustup toolchain install
uses: dtolnay/rust-toolchain@stable
- 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: 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: Download EF Tests
run: |
cd crates/vm/levm
make download-evm-ef-tests
- id: generate-flamegraph-levm
name: Generate Flamegraph data for LEVM
shell: bash
run: |
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
- 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 "LEVM Flamegraph" < collapsed.data > flamegraph_levm.svg
- name: Upload artifacts - flamegraph_levm.svg
uses: actions/upload-artifact@v4
with:
name: flamegraph_levm.svg
path: ./flamegraph_levm.svg
flamegraph-revm:
name: Generate Flamegraph for REVM
runs-on: ubuntu-latest
# TODO set time
outputs:
time: ${{steps.generate-flamegraph-revm.outputs.time}}
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-*
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
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: |
cd crates/vm/levm
make download-evm-ef-tests
- id: generate-flamegraph-revm
name: Build and test REVM
shell: bash
# --dev.block-time 1000ms set to 1000ms to match ethrex block generation time
run: |
CARGO_PROFILE_RELEASE_DEBUG=true cargo flamegraph -c "record -o perf.data -F997 --call-graph dwarf,16384 -g" \
-p ef_tests-levm -- --revm
- 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 "Reth Flamegraph" < collapsed.data > flamegraph_revm.svg
- name: Upload artifacts - flamegraph_revm.svg
uses: actions/upload-artifact@v4
with:
name: flamegraph_revm.svg
path: ./flamegraph_revm.svg
upload-static-page:
name: Upload artifacts for static page
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}/levm
needs: [flamegraph-levm, flamegraph-revm]
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Download ethrex flamegraph artifact
uses: actions/download-artifact@v4
with:
name: flamegraph_levm.svg
path: flamegraph_levm.svg
- name: Download reth flamegraph artifact
uses: actions/download-artifact@v4
with:
name: flamegraph_revm.svg
path: flamegraph_revm.svg
- name: Update static page locally with new data
shell: bash
run: |
cp -r flamegraph_levm.svg pages/
cp -r flamegraph_revm.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-levm.outputs.time }}/g" pages/index.html
sed -i "s/{{RETH_TIME}}/${{ needs.flamegraph-revm.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