From e63b6239d7c84debeefa08dfe99202ea89154a9b Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Wed, 25 Feb 2026 21:28:35 +0400 Subject: [PATCH] ci(bench): support configuring number of cores (#22573) --- .github/scripts/bench-reth-run.sh | 6 +++++- .github/workflows/bench.yml | 30 +++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/.github/scripts/bench-reth-run.sh b/.github/scripts/bench-reth-run.sh index 6461f5a68c..8a1d5b50d8 100755 --- a/.github/scripts/bench-reth-run.sh +++ b/.github/scripts/bench-reth-run.sh @@ -67,7 +67,11 @@ grep Cached /proc/meminfo # CPU layout: core 0 = OS/IRQs/reth-bench/aux, cores 1+ = reth node RETH_BENCH="$(which reth-bench)" ONLINE=$(nproc --all) -RETH_CPUS="1-$(( ONLINE - 1 ))" +MAX_RETH=$(( ONLINE - 1 )) +if [ "${BENCH_CORES:-0}" -gt 0 ] && [ "$BENCH_CORES" -lt "$MAX_RETH" ]; then + MAX_RETH=$BENCH_CORES +fi +RETH_CPUS="1-${MAX_RETH}" RETH_ARGS=( node diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index b2d30f428e..74c530d2ef 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -40,6 +40,11 @@ on: required: false default: "false" type: boolean + cores: + description: "Limit reth to N CPU cores (0 = all available)" + required: false + default: "0" + type: string env: CARGO_TERM_COLOR: always @@ -111,6 +116,7 @@ jobs: baseline-name: ${{ steps.args.outputs.baseline-name }} feature-name: ${{ steps.args.outputs.feature-name }} samply: ${{ steps.args.outputs.samply }} + cores: ${{ steps.args.outputs.cores }} comment-id: ${{ steps.ack.outputs.comment-id }} steps: - name: Check org membership @@ -138,7 +144,7 @@ jobs: with: github-token: ${{ secrets.DEREK_PAT }} script: | - let pr, actor, blocks, warmup, baseline, feature, samply; + let pr, actor, blocks, warmup, baseline, feature, samply, cores; if (context.eventName === 'workflow_dispatch') { actor = '${{ github.actor }}'; @@ -147,6 +153,7 @@ jobs: baseline = '${{ github.event.inputs.baseline }}'; feature = '${{ github.event.inputs.feature }}'; samply = '${{ github.event.inputs.samply }}' === 'true' ? 'true' : 'false'; + cores = '${{ github.event.inputs.cores }}' || '0'; // Find PR for the selected branch const branch = '${{ github.ref_name }}'; @@ -166,10 +173,10 @@ jobs: actor = context.payload.comment.user.login; const body = context.payload.comment.body.trim(); - const intArgs = new Set(['blocks', 'warmup']); + const intArgs = new Set(['blocks', 'warmup', 'cores']); const refArgs = new Set(['baseline', 'feature']); const boolArgs = new Set(['samply']); - const defaults = { blocks: '500', warmup: '100', baseline: '', feature: '', samply: 'false' }; + const defaults = { blocks: '500', warmup: '100', baseline: '', feature: '', samply: 'false', cores: '0' }; const unknown = []; const invalid = []; const args = body.replace(/^(?:@decofe|derek) bench\s*/, ''); @@ -205,7 +212,7 @@ jobs: if (unknown.length) errors.push(`Unknown argument(s): \`${unknown.join('`, `')}\``); if (invalid.length) errors.push(`Invalid value(s): ${invalid.join(', ')}`); if (errors.length) { - const msg = `❌ **Invalid bench command**\n\n${errors.join('\n')}\n\n**Usage:** \`@decofe bench [blocks=N] [warmup=N] [baseline=REF] [feature=REF] [samply]\``; + const msg = `❌ **Invalid bench command**\n\n${errors.join('\n')}\n\n**Usage:** \`@decofe bench [blocks=N] [warmup=N] [baseline=REF] [feature=REF] [samply] [cores=N]\``; await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, @@ -220,6 +227,7 @@ jobs: baseline = defaults.baseline; feature = defaults.feature; samply = defaults.samply; + cores = defaults.cores; } // Resolve display names for baseline/feature @@ -247,6 +255,7 @@ jobs: core.setOutput('baseline-name', baselineName); core.setOutput('feature-name', featureName); core.setOutput('samply', samply); + core.setOutput('cores', cores); - name: Acknowledge request id: ack @@ -306,7 +315,9 @@ jobs: const feature = '${{ steps.args.outputs.feature-name }}'; const samply = '${{ steps.args.outputs.samply }}' === 'true'; const samplyNote = samply ? ', samply: `enabled`' : ''; - const config = `**Config:** ${blocks} blocks, ${warmup} warmup blocks, baseline: \`${baseline}\`, feature: \`${feature}\`${samplyNote}`; + const cores = '${{ steps.args.outputs.cores }}'; + const coresNote = cores && cores !== '0' ? `, cores: \`${cores}\`` : ''; + const config = `**Config:** ${blocks} blocks, ${warmup} warmup blocks, baseline: \`${baseline}\`, feature: \`${feature}\`${samplyNote}${coresNote}`; const { data: comment } = await github.rest.issues.createComment({ owner: context.repo.owner, @@ -332,7 +343,9 @@ jobs: const feature = '${{ steps.args.outputs.feature-name }}'; const samply = '${{ steps.args.outputs.samply }}' === 'true'; const samplyNote = samply ? ', samply: `enabled`' : ''; - const config = `**Config:** ${blocks} blocks, ${warmup} warmup blocks, baseline: \`${baseline}\`, feature: \`${feature}\`${samplyNote}`; + const cores = '${{ steps.args.outputs.cores }}'; + const coresNote = cores && cores !== '0' ? `, cores: \`${cores}\`` : ''; + const config = `**Config:** ${blocks} blocks, ${warmup} warmup blocks, baseline: \`${baseline}\`, feature: \`${feature}\`${samplyNote}${coresNote}`; const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; const numRunners = parseInt(process.env.BENCH_RUNNERS) || 1; @@ -395,6 +408,7 @@ jobs: BENCH_BLOCKS: ${{ needs.reth-bench-ack.outputs.blocks }} BENCH_WARMUP_BLOCKS: ${{ needs.reth-bench-ack.outputs.warmup }} BENCH_SAMPLY: ${{ needs.reth-bench-ack.outputs.samply }} + BENCH_CORES: ${{ needs.reth-bench-ack.outputs.cores }} BENCH_COMMENT_ID: ${{ needs.reth-bench-ack.outputs.comment-id }} steps: - name: Resolve checkout ref @@ -446,7 +460,9 @@ jobs: const feature = '${{ needs.reth-bench-ack.outputs.feature-name }}'; const samply = process.env.BENCH_SAMPLY === 'true'; const samplyNote = samply ? ', samply: `enabled`' : ''; - core.exportVariable('BENCH_CONFIG', `**Config:** ${blocks} blocks, ${warmup} warmup blocks, baseline: \`${baseline}\`, feature: \`${feature}\`${samplyNote}`); + const cores = process.env.BENCH_CORES || '0'; + const coresNote = cores && cores !== '0' ? `, cores: \`${cores}\`` : ''; + core.exportVariable('BENCH_CONFIG', `**Config:** ${blocks} blocks, ${warmup} warmup blocks, baseline: \`${baseline}\`, feature: \`${feature}\`${samplyNote}${coresNote}`); const { buildBody } = require('./.github/scripts/bench-update-status.js'); await github.rest.issues.updateComment({