chore: update html #188
Workflow file for this run
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
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", "levm/perf/automate_flamegraph"] | |
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: 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.svg | |
path: time_levm.svg | |
- name: Download revm time artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: time_revm.svg | |
path: time_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/ | |
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) | |
sed -i "s/{{LEVM_TIME}}/${time_levm}/g" pages/levm.html | |
time_revm=$(grep "time_revm" time_revm.txt/time_revm.txt | cut -d '=' -f2) | |
sed -i "s/{{REVM_TIME}}/${time_revm}}/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 |