Skip to content

Commit a144119

Browse files
committed
auto-calculate --users from --requests_per_sec to target QPS is achieved
1 parent 7d860a6 commit a144119

3 files changed

Lines changed: 19 additions & 4 deletions

File tree

vsb/cmdline_args.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,11 @@ def add_vsb_cmdline_args(
124124
type=int,
125125
metavar="<int>",
126126
dest="num_users",
127-
default=1,
128-
help="Number of database clients to execute the workload. Default is %("
129-
"default)s",
127+
default=None,
128+
help="Number of database clients to execute the workload. If not specified "
129+
"and --requests_per_sec is set, the number of users is automatically "
130+
"calculated to achieve the target QPS (assuming 500ms request latency). "
131+
"Otherwise defaults to 1.",
130132
)
131133
general_group.add_argument(
132134
"--processes",

vsb/locustfile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def qutting_listener(environment, **_kwargs):
109109
def setup_environment(environment, **_kwargs):
110110
env = environment
111111
options = env.parsed_options
112-
num_users = options.num_users or 1
112+
num_users = options.num_users
113113

114114
logger.debug(f"setup_environment(): runner={type(environment.runner)}")
115115

vsb/main.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!/usr/bin/env python3
22

3+
import math
34
import sys
45
from pathlib import Path
56

@@ -41,6 +42,18 @@ def main():
4142
args = parser.parse_args()
4243
validate_parsed_args(parser, args)
4344

45+
# Auto-calculate the number of users if not explicitly specified.
46+
# Assuming a conservative 500ms request latency, each user can issue
47+
# at most 2 requests/sec. We provision enough users to comfortably
48+
# achieve the target QPS.
49+
if args.num_users is None:
50+
if args.requests_per_sec > 0:
51+
assumed_latency = 0.5 # 500ms
52+
args.num_users = max(1, math.ceil(args.requests_per_sec * assumed_latency))
53+
else:
54+
args.num_users = 1
55+
sys.argv += ["--users", str(args.num_users)]
56+
4457
log_base = Path(args.log_dir) / args.database
4558
vsb.log_dir = setup_logging(log_base=log_base, level=args.loglevel)
4659
requests_per_sec = (

0 commit comments

Comments
 (0)