Skip to content

fix(l1): fork_id validation (#1729) #170

fix(l1): fork_id validation (#1729)

fix(l1): fork_id validation (#1729) #170

name: Flamegraph Reporter
permissions:
contents: read
pages: write
id-token: write
on:
push:
branches: [ "main", "automate-perf-tests" ]
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 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: [ 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