Skip to content
This repository was archived by the owner on Mar 24, 2026. It is now read-only.

Commit f47657f

Browse files
Privacy Sandbox Teamcopybara-github
authored andcommitted
feat: Add functionality to traffic generator to compute the latency target for a given configuration
Several new flags have been added to the traffic generator: --find-latency-budget --use-late-bursts-for-budget --latency-slope-threshold --duration-step-ms --initial-duration-ms Using --find-latency-budget computes the maximum latency allowed for a given configuration, running PrimeSieve repeeatedly for variable ms, increasing until either the difference in failure rate / late burst percentage is sufficiently small, signfying the percentage curve levelling off. Bug: b/409346106 Change-Id: I4a4a2a63f80fe3b8e8ffc2a970c534ff5fc81339 GitOrigin-RevId: fb8e06c2b983d0e3245b7922d9614b9c01dbf812
1 parent 897c1b4 commit f47657f

2 files changed

Lines changed: 70 additions & 0 deletions

File tree

src/roma/traffic_generator/traffic_generator.cc

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,17 @@ ABSL_FLAG(double, late_threshold, 15.0,
107107
ABSL_FLAG(
108108
absl::Duration, byob_connection_timeout, absl::ZeroDuration(),
109109
"Max time to wait for a worker in 'byob' mode. Ignored in 'v8' mode.");
110+
ABSL_FLAG(bool, find_latency_budget, false,
111+
"Find maximum latency that maintains performance under threshold");
112+
ABSL_FLAG(double, initial_duration_ms, 5,
113+
"Initial duration to test for latency budget (default 5ms)");
114+
ABSL_FLAG(bool, use_late_bursts_for_budget, false,
115+
"Use late bursts for latency budget test");
116+
ABSL_FLAG(double, latency_slope_threshold, 1.0,
117+
"Threshold for the slope of the latency curve, below which the curve "
118+
"has leveled off (default 1.0)");
119+
ABSL_FLAG(double, duration_step_ms, 5,
120+
"Step size for the latency budget test (default 5ms)");
110121

111122
namespace {
112123

@@ -242,6 +253,58 @@ std::pair<int, BurstGenerator::Stats> FindMaxQps(
242253
return std::make_pair(best_qps, best_stats);
243254
}
244255

256+
BurstGenerator::Stats FindLatencyBudget(
257+
std::atomic<std::int64_t>& completions) {
258+
const int qps = absl::GetFlag(FLAGS_queries_per_second);
259+
260+
BurstGenerator::Stats stats;
261+
float prev_pct = 0;
262+
int prime_sieve_duration_ms = absl::GetFlag(FLAGS_initial_duration_ms);
263+
264+
bool use_bursts_for_budget = absl::GetFlag(FLAGS_use_late_bursts_for_budget);
265+
while (true) {
266+
TrafficGenerator::RpcFuncCreator latency_budget_rpc_func =
267+
[prime_sieve_duration_ms](std::atomic<std::int64_t>& completions)
268+
-> std::pair<TrafficGenerator::ExecutionFunc,
269+
TrafficGenerator::CleanupFunc> {
270+
return CreateByobRpcFunc(
271+
absl::GetFlag(FLAGS_num_workers), absl::GetFlag(FLAGS_lib_mounts),
272+
absl::GetFlag(FLAGS_binary_path), absl::GetFlag(FLAGS_sandbox),
273+
completions, absl::GetFlag(FLAGS_syscall_filtering),
274+
absl::GetFlag(FLAGS_disable_ipc_namespace),
275+
absl::GetFlag(FLAGS_byob_connection_timeout), "PrimeSieve",
276+
{absl::StrCat(prime_sieve_duration_ms, "ms")});
277+
};
278+
279+
stats = RunBurstGenerator(qps, completions, latency_budget_rpc_func);
280+
Report report;
281+
stats.ToReport(report);
282+
283+
float curr_pct = use_bursts_for_budget
284+
? report.statistics().late_burst_pct()
285+
: report.statistics().failure_pct();
286+
absl::SetFlag(&FLAGS_input_args,
287+
{absl::StrCat(prime_sieve_duration_ms, "ms")});
288+
std::string report_json = StatsToJson(stats, qps, report);
289+
if (absl::GetFlag(FLAGS_verbose)) {
290+
LOG(INFO) << "JSON_L" << report_json << "JSON_L";
291+
LOG(INFO) << stats.ToString();
292+
}
293+
294+
LOG(INFO) << "Tested duration: " << prime_sieve_duration_ms << "ms, "
295+
<< (use_bursts_for_budget ? "Late" : "Failure")
296+
<< " percentage: " << curr_pct;
297+
prime_sieve_duration_ms += absl::GetFlag(FLAGS_duration_step_ms);
298+
if (curr_pct > 50 &&
299+
curr_pct - prev_pct < absl::GetFlag(FLAGS_latency_slope_threshold) &&
300+
curr_pct > prev_pct) {
301+
break;
302+
}
303+
prev_pct = curr_pct;
304+
}
305+
return stats;
306+
}
307+
245308
} // namespace
246309

247310
namespace google::scp::roma::traffic_generator {
@@ -340,6 +403,8 @@ absl::Status TrafficGenerator::Run(
340403
report.mutable_params()->set_late_burst_threshold(threshold);
341404
std::tie(queries_per_second, stats) =
342405
FindMaxQps(threshold, completions, rpc_func_creator);
406+
} else if (absl::GetFlag(FLAGS_find_latency_budget)) {
407+
stats = FindLatencyBudget(completions);
343408
} else {
344409
stats =
345410
RunBurstGenerator(queries_per_second, completions, rpc_func_creator);

src/roma/traffic_generator/traffic_generator.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ ABSL_DECLARE_FLAG(bool, find_max_qps);
5555
ABSL_DECLARE_FLAG(std::string, qps_search_bounds);
5656
ABSL_DECLARE_FLAG(double, late_threshold);
5757
ABSL_DECLARE_FLAG(absl::Duration, byob_connection_timeout);
58+
ABSL_DECLARE_FLAG(bool, find_latency_budget);
59+
ABSL_DECLARE_FLAG(double, initial_duration_ms);
60+
ABSL_DECLARE_FLAG(bool, use_late_bursts_for_budget);
61+
ABSL_DECLARE_FLAG(double, latency_slope_threshold);
62+
ABSL_DECLARE_FLAG(double, duration_step_ms);
5863

5964
namespace google::scp::roma::traffic_generator {
6065

0 commit comments

Comments
 (0)