Skip to content

benchmarking/nighthawk_common: compute stage rates from exact duration - #3711

Open
Yuan Gao (ygao-g) wants to merge 4 commits into
agent-substrate:mainfrom
ygao-g:nighthawk-ingress-rates
Open

Yuan Gao (ygao-g) wants to merge 4 commits into
agent-substrate:mainfrom
ygao-g:nighthawk-ingress-rates

Conversation

@ygao-g

@ygao-g Yuan Gao (ygao-g) commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator

Nighthawk divides achieved-rps and send-rate by a stage duration that it rounds down to whole seconds. When a stage ran a fraction of a second longer than its nominal length, both values were too high. The error was up to 10% on a 10 s stage. slo_max_rps comes from achieved_rps, so the reported capacity was too high as well.

The benchmark output now computes achieved_rps and send_rate from the exact stage duration. Nighthawk's own values stay in stats.jsonl under the *_cpp keys. The stage verdicts are still Nighthawk's and do not change. The nighthawk-ingress README states how much too high the results from before this change can be. Each stage row also records the connection wait time, the sequencer blocking time and the standard deviation of the latency. With these values, a reader can tell a stall in the load client from latency in the system under test.

Part of #3624

AI use: AI-assisted for the diff, the split and the test runs; I reviewed the diff.

  • Tests pass
  • Docs updated

…f nighthawk-ingress

Move nighthawk-ingress/output.py to nighthawk_common unchanged so
nighthawk-egress can reuse it. The ingress Dockerfile copies the package
into the image and the ingress tests put benchmarking/ on sys.path.

Signed-off-by: Yuan Gao <ypgao@google.com>
… out of nighthawk-ingress

Move nighthawk-ingress/spec.py to nighthawk_common unchanged and point its importers at the new path. actors.py imported it without using it.

Signed-off-by: Yuan Gao <ypgao@google.com>
…ut of nighthawk_common

build_session_spec in nighthawk_common now takes a finished traffic template. The router SNI, the certificate paths and build_spec_dict, which assembles that template, move back to nighthawk-ingress/spec.py.

Signed-off-by: Yuan Gao <ypgao@google.com>
Nighthawk divides achieved-rps and send-rate by execution_duration
truncated to whole seconds, so a stage that overran its nominal length
by a fraction of a second read high, by up to 1/N for an N-second
stage. stage_rows() now computes both from the exact duration and keeps
Nighthawk's values under the *_cpp keys. Stage verdicts come from
Nighthawk's threshold scores and do not change. The nighthawk-ingress
README notes how far runs recorded before this change read high.

Each stage row also records the queue_to_connect and sequencer.blocking
statistics and the latency pstdev, so a client-side stall can be told
apart from gateway latency. The tests for the new behavior live in
benchmarking/nighthawk_common/tests; the ingress suite is unchanged.

Signed-off-by: Yuan Gao <ypgao@google.com>
@ygao-g

Copy link
Copy Markdown
Collaborator Author

Stack: this PR is on top of #3628. Review the last commit only. The diff of this PR alone is at https://github.com/ygao-g/substrate/pull/88/files

hack/verify/benchmarking-python.sh passes at the head: nighthawk_common 2 passed, nighthawk-ingress 12 passed, automation 63 passed and 25 subtests passed. The two new tests fail against the code at the head of #3628.

Not done yet: an ingress run at this head that compares achieved_rps with achieved_rps_cpp for each stage.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants