Skip to content

Commit 580acd6

Browse files
authored
Merge 2c65657 into f828cc9
2 parents f828cc9 + 2c65657 commit 580acd6

File tree

5 files changed

+167
-11
lines changed

5 files changed

+167
-11
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import argparse
2+
import subprocess
3+
import pathlib
4+
from sys import stderr
5+
6+
def parse_args(passed=None):
7+
YDB_ROOT = "../../../"
8+
9+
def variant(string):
10+
if string not in ["h", "ds"]:
11+
raise ValueError("variant must be h or ds")
12+
return string
13+
14+
parser = argparse.ArgumentParser()
15+
16+
parser.add_argument('--datasize', type=int, default=1)
17+
parser.add_argument('--variant', type=variant, default='h')
18+
parser.add_argument('--tasks', type=int, default=1)
19+
parser.add_argument('--ydb-root', type=lambda path: pathlib.Path(path).resolve(), default=YDB_ROOT)
20+
parser.add_argument('-o', '--output', default="./results")
21+
parser.add_argument('--clean-old', action="store_true", default=False)
22+
23+
return parser.parse_known_intermixed_args(passed)
24+
25+
class Runner:
26+
def prepare_queries_dir(self, custom_pragmas):
27+
self.queries_dir.mkdir(parents=True, exist_ok=True)
28+
cmd = [self.args.gen_queries]
29+
cmd += ["--output", f"{self.queries_dir}"]
30+
cmd += ["--variant", f"{self.args.variant}"]
31+
cmd += ["--syntax", "yql"]
32+
cmd += ["--dataset-size", f"{self.args.datasize}"]
33+
for it in custom_pragmas:
34+
cmd += ["--pragma", it]
35+
subprocess.run(cmd)
36+
37+
def prepare_tpc_dir(self):
38+
cmd = [f"{self.args.downloaders_dir}/download_files_{self.args.variant}_{self.args.datasize}.sh"]
39+
subprocess.run(cmd)
40+
41+
def __init__(self, args, enable_spilling):
42+
self.args = args
43+
self.enable_spilling = enable_spilling
44+
45+
self.queries_dir = pathlib.Path(f"queries{"+" if self.enable_spilling else "-"}spilling-{args.datasize}-{args.tasks}")
46+
if self.args.clean_old or not self.queries_dir.exists():
47+
self.prepare_queries_dir([
48+
f"dq.MaxTasksPerStage={self.args.tasks}",
49+
"dq.OptLLVM=ON"
50+
] + [
51+
"dq.UseFinalizeByKey=true",
52+
"dq.EnableSpillingNodes=All",
53+
] if self.enable_spilling else [])
54+
55+
self.tpc_dir = pathlib.Path(f"{self.args.downloaders_dir}/tpc/{self.args.variant}/{self.args.datasize}").resolve()
56+
if self.args.clean_old or not self.tpc_dir.exists():
57+
self.prepare_tpc_dir()
58+
59+
self.result_dir = pathlib.Path(f"{self.args.output}/{"with" if self.enable_spilling else "no"}-spilling/{args.variant}-{args.datasize}-{args.tasks}").resolve()
60+
self.result_dir.mkdir(parents=True, exist_ok=True)
61+
62+
def run(self):
63+
cmd = ["/usr/bin/time", f"{self.args.runner_path}"]
64+
cmd += ["--perf"]
65+
cmd += ["--query-dir", f"{self.queries_dir}/{self.args.variant}"]
66+
cmd += ["--bindings", f"{self.queries_dir}/{self.args.variant}/bindings.json"]
67+
cmd += ["--result-dir", f"{self.result_dir}"]
68+
cmd += [f"{self.args.dqrun}", "-s"]
69+
cmd += ["--enable-spilling"] if self.enable_spilling else []
70+
cmd += ["--udfs-dir", f"{self.args.udfs_dir}"]
71+
cmd += ["--fs-cfg", f"{self.args.fs_cfg}"]
72+
cmd += ["--gateways-cfg", f"{self.args.gateways_cfg}"]
73+
subprocess.run(cmd)
74+
75+
return self.result_dir
76+
77+
def result_compare(args, to_compare):
78+
cmd = [f"{args.result_compare}"]
79+
cmd += ["-v"]
80+
cmd += to_compare
81+
print(cmd, file=stderr)
82+
with open(f"{args.output}/result-{args.variant}-{args.datasize}-{args.tasks}.htm", "w") as result_table:
83+
subprocess.run(cmd, stdout=result_table)
84+
85+
def main(passed=None):
86+
args, _ = parse_args(passed)
87+
args.dqrun = args.ydb_root / "library" / "yql" / "tools" / "dqrun" / "dqrun"
88+
args.gen_queries = args.ydb_root / "library" / "benchmarks" / "gen_queries" / "gen_queries"
89+
args.downloaders_dir = args.ydb_root / "library" / "benchmarks" / "runner"
90+
args.udfs_dir = args.ydb_root / "library" / "yql" / "udfs" / "common"
91+
args.fs_cfg = args.ydb_root / "library" / "yql" / "tools" / "dqrun" / "examples" / "fs.conf"
92+
args.result_compare = args.ydb_root / "library" / "benchmarks" / "runner" / "result_compare" / "result_compare"
93+
args.gateways_cfg = args.ydb_root / "library" / "benchmarks" / "runner" / "runner" / "test-gateways.conf"
94+
args.runner_path = args.ydb_root / "library" / "benchmarks" / "runner" / "runner" / "runner"
95+
96+
print(args)
97+
98+
results = []
99+
print("With spilling...", file=stderr)
100+
results.append(Runner(args, True).run())
101+
print("No spilling...", file=stderr)
102+
results.append(Runner(args, False).run())
103+
104+
print(results, file=stderr)
105+
106+
result_compare(args, results)
107+
108+
if __name__ == "__main__":
109+
main()
110+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
PY3_PROGRAM()
2+
3+
PY_SRCS(
4+
MAIN run_tests.py
5+
)
6+
7+
PEERDIR(
8+
)
9+
10+
END()

ydb/library/benchmarks/runner/runner/runner.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,10 @@ def run(argv, out, err, timeout=30*60, hard_timeout=5):
6565

6666

6767
def main():
68-
6968
parser = argparse.ArgumentParser()
7069
parser.add_argument('--query-dir', type=str, default='q/scalar')
7170
parser.add_argument('--bindings', type=str, default='bindings.json')
72-
parser.add_argument('--result-dir', type=str, default="result-{:%Y%m%dT%H%M%S}".format(datetime.datetime.now()))
71+
parser.add_argument('--result-dir', type=Path, default="result-{:%Y%m%dT%H%M%S}".format(datetime.datetime.now()))
7372
parser.add_argument('--timeout', type=int, default=30*60)
7473
parser.add_argument('--perf', action='store_true')
7574
parser.add_argument('--arc-path', type=str, default='{}/arcadia'.format(os.environ['HOME']))
@@ -81,9 +80,8 @@ def main():
8180
outdir = args.result_dir
8281
assert len(argv)
8382
querydir = Path(qdir)
84-
os.makedirs(outdir + '/' + qdir, exist_ok=True)
85-
with open(outdir + '/' + qdir + "/summary.tsv", "w") as outf, \
86-
open(outdir + '/' + qdir + "/summary.json", "w") as outj:
83+
with open(outdir / "summary.tsv", "w") as outf, \
84+
open(outdir / "summary.json", "w") as outj:
8785
print(' '.join(argv + ['-p', qdir, '--bindings-file', bindings]), file=outf)
8886
print(json.dumps({
8987
'cmdline': argv,
@@ -92,8 +90,9 @@ def main():
9290
'version': 100
9391
}), file=outj)
9492
for query in sorted(querydir.glob('**/*.sql'), key=lambda x: tuple(map(lambda y: int(y) if re.match(RE_DIGITS, y) else y, re.split(RE_DIGITS, str(x))))):
95-
q = str(query)
96-
name = outdir + '/' + q
93+
q = str(query.stem)
94+
print(f"{q}", end="", flush=True)
95+
name = str(outdir / q)
9796
if len(args.include_q):
9897
include = False
9998
for r in args.include_q:
@@ -112,6 +111,7 @@ def main():
112111
continue
113112
print(q, end='\t', file=outf)
114113
outname = name + '-result.yson'
114+
print(".", end="", flush=True)
115115
exitcode, rusage, elapsed, iostat = run(
116116
argv + [
117117
'--result-file', outname,
@@ -120,7 +120,7 @@ def main():
120120
'--err-file', name + '-err.txt',
121121
'--expr-file', name + '-expr.txt',
122122
'--stat', name + '-stat.yson',
123-
'-p', q
123+
'-p', str(query)
124124
],
125125
name + '-stdout.txt',
126126
name + '-stderr.txt',
@@ -164,25 +164,27 @@ def main():
164164
}
165165
}), file=outj)
166166
outj.flush()
167+
print(".", end="", flush=True)
167168
if args.perf:
168169
exitcode, rusage, elapsed, iostat = run(
169-
['{}/ya'.format(args.arc_path), 'tool', 'perf', 'record', '-F250', '-g', '--call-graph', 'dwarf', '-o', '{}/perf.data'.format(outdir), '--'] +
170+
['/usr/bin/perf', 'record', '-F250', '-g', '--call-graph', 'dwarf', '-o', '{}/perf.data'.format(outdir), '--'] +
170171
argv + [
171172
'--result-file', '/dev/null',
172173
'--bindings-file', bindings,
173174
'--plan-file', '/dev/null',
174175
'--err-file', '/dev/null',
175176
'--expr-file', '/dev/null',
176-
'-p', q
177+
'-p', str(query)
177178
],
178179
name + '-stdout-perf.txt',
179180
name + '-stderr-perf.txt',
180181
timeout=args.timeout)
181182
os.system('''
182-
{0}/ya tool perf script -i {2}/perf.data --header |
183+
/usr/bin/perf script -i {2}/perf.data --header |
183184
{0}/contrib/tools/flame-graph/stackcollapse-perf.pl |
184185
{0}/contrib/tools/flame-graph/flamegraph.pl > {1}.svg
185186
'''.format(args.arc_path, name, outdir))
187+
print(".", flush=True)
186188

187189

188190
if __name__ == "__main__":
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import run_tests.run_tests as run_tests
2+
3+
4+
def wrapped_run(variant, datasize, tasks):
5+
cmd = []
6+
cmd += ["--variant", f"{variant}"]
7+
cmd += ["--datasize", f"{datasize}"]
8+
cmd += ["--tasks", f"{tasks}"]
9+
cmd += ["--ydb-root", "/home/vladluk/ydbwork/ydb/ydb"]
10+
cmd += ["-o", "/home/vladluk/ydbwork/ydb/ydb/library/benchmarks/runner/results"]
11+
run_tests.main(cmd)
12+
13+
14+
def test_tpc_h_10_1():
15+
wrapped_run("h", 10, 1)

ydb/library/benchmarks/runner/ya.make

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,23 @@
1+
PY3TEST()
2+
3+
SIZE(LARGE)
4+
5+
TAG(
6+
ya:fat
7+
)
8+
9+
PY_SRCS(
10+
run_tests/run_tests.py
11+
)
12+
13+
TEST_SRCS(
14+
tpc_tests.py
15+
)
16+
17+
END()
18+
119
RECURSE(
20+
run_tests
221
runner
322
result_convert
423
result_compare

0 commit comments

Comments
 (0)