add Elbencho S3 benchmark with async parallel SSH - #359
Conversation
ScopeThe diff matches the Jira ticket and PR description. Story 2 requires registering Elbencho as a benchmark class with factory integration, workload storage, and validation — all present. The Code Review[P1] [P2] [P2] [P2] [P3] [P3] SecurityCredential handling in tests: The test fixture SummaryThe registration is solid and the factory bypass logic is correct. The P1 issue around |
7e64adb to
89776a3
Compare
c6bd7e0 to
550e5d4
Compare
6463326 to
f0c2812
Compare
perezjosibm
left a comment
There was a problem hiding this comment.
Just a few changes needed, eg checking return values from pdsh, documentation. Looking very good, many thanks!
7831e76 to
9a34804
Compare
1975a36 to
1f3a50a
Compare
harriscr
left a comment
There was a problem hiding this comment.
I think we should make any changes in the Main branch (the one under active development) rather than the legacy Master branch which is very out of date and being used to maintain backwards compatibility with older versions of Ceph.
That explains why some of the code does not match the structure I was expecting.
Introduce asyncssh_exec() and asyncssh_check() which fan shell commands out to all nodes concurrently via asyncio + the system ssh binary — no third-party packages required. Add pdsh-free cluster helpers (async_make_remote_dir, async_clean_remote_dir, async_sync_files) so benchmarks can opt out of pdsh entirely. Include docs/ReplacingPdsh.md tracking the migration plan. Signed-off-by: Kenan Al-Shamie <kenan.al-shamie@ibm.com> Assisted-by: Claude-v2.1.212:claude-opus-4-6
1f3a50a to
68b0e8b
Compare
Introduce the Elbencho benchmark class for S3 workloads. The module uses a workload-driven config model (list-valued params live inside the workloads block, so all_configs() naturally yields one config), builds elbencho CLI commands per run cell, and fans out via the async SSH infrastructure — the entire lifecycle (binary check, cleandir, dropcaches, workload fan-out, result pull) is pdsh-free. Includes full unit test suite (49 tests). Registers Elbencho in benchmarkfactory. Signed-off-by: Kenan Al-Shamie <kenan.al-shamie@ibm.com> Assisted-by: Claude-v2.1.212:claude-opus-4-6
User-facing guide covering YAML structure, blocksize/size interaction (single-PUT vs multipart), running instructions, and expected output. Includes a working example config. Signed-off-by: Kenan Al-Shamie <kenan.al-shamie@ibm.com> Assisted-by: Claude-v2.1.212:claude-opus-4-6
68b0e8b to
ca6b119
Compare
Thanks for this. I've just force-updated and edited the PR to point at I've decided to just lump all of the current changes into this PR, because it's difficult to manage two branches at once as the commits are changing 😄 Apologies that it's become a big PR, but I think for now, hopefully it's good enough that I've split it into different commits. Since the PR is now larger in scope (effectively covering stories 2 and 3), I've also updated the PR title and description. |
| """ | ||
| Common classes to wrap around pdsh (parallel shell) | ||
| """ | ||
| import asyncio |
There was a problem hiding this comment.
Are there any dependent python modules that need to be pip install'd?
If so, we need to modify requirements.txt for those pre-reqs

Summary
common.pyusingasyncio+ the systemsshbinary, so benchmarks can opt out ofpdshwith no new dependenciesbenchmark/elbencho.py— an S3 benchmark that runs its entire lifecycle (binary check, cleandir, dropcaches, workload fan-out, result pull) through the async SSH pathbenchmarkfactory.py(import + dict entry only — no changes toget_all()orall_configs())How Elbencho avoids Cartesian expansion
Elbencho's list-valued parameters (
threads,iodepth,blocksize) live inside theworkloads:block, not at the top level.all_configs()only sees top-level keys, which are all scalars or dicts, so it naturally yields a single config — no special-case code in the factory needed.Test plan
python -m unittest tests.test_bm_elbencho— 49 tests pass798 tests ran, all Elbencho tests (49) pass. The 7 failures are pre-existing post-processing test issues unrelated to our code.