Skip to content

Commit 6458598

Browse files
Enabled to specify profile mode in profiler daemon (#323)
1 parent b2ec03a commit 6458598

File tree

5 files changed

+39
-26
lines changed

5 files changed

+39
-26
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "redisbench-admin"
3-
version = "0.7.17"
3+
version = "0.7.18"
44
description = "Redis benchmark run helper. A wrapper around Redis and Redis Modules benchmark tools ( ftsb_redisearch, memtier_benchmark, redis-benchmark, aibench, etc... )."
55
authors = ["filipecosta90 <[email protected]>","Redis Performance Group <[email protected]>"]
66
readme = "README.md"

redisbench_admin/profilers/daemon.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ def ping():
126126

127127
@app.route("/profiler/<profiler_name>/start/<pid>", methods=["POST"])
128128
def profile_start(profiler_name, pid):
129+
callgraph_mode = request.args.get("callgraph_mode", default="fp", type=str)
129130
setup_process_number = 1
130131
total_involved_processes = 1
131132
(
@@ -173,9 +174,7 @@ def profile_start(profiler_name, pid):
173174
)
174175
app.logger.info("Storing profile in {}".format(profile_filename))
175176
result = self.perf.start_profile(
176-
pid,
177-
profile_filename,
178-
DEFAULT_PROFILE_FREQ,
177+
pid, profile_filename, DEFAULT_PROFILE_FREQ, callgraph_mode
179178
)
180179
status_dict = {
181180
"result": result,

redisbench_admin/profilers/perf.py

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
from redisbench_admin.utils.utils import whereis
2020

2121
PERF_CALLGRAPH_MODE_DEFAULT = "fp"
22+
PERF_CALLGRAPH_MODE = os.getenv("PERF_CALLGRAPH_MODE", PERF_CALLGRAPH_MODE_DEFAULT)
23+
PERF_PROFILE_TIME_DEFAULT = "60"
24+
PERF_PROFILE_TIME = int(os.getenv("PERF_PROFILE_TIME", PERF_PROFILE_TIME_DEFAULT))
2225
LINUX_PERF_SETTINGS_MESSAGE = (
2326
"If running in non-root user please confirm that you have:\n"
2427
+ " - access to Kernel address maps."
@@ -42,9 +45,8 @@ def __init__(self):
4245

4346
self.stack_collapser = os.getenv("STACKCOLLAPSE_PATH", STACKCOLLAPSE_PATH)
4447
self.flamegraph_utity = os.getenv("FLAMEGRAPH_PATH", FLAMEGRAPH_PATH)
45-
self.callgraph_mode = os.getenv(
46-
"PERF_CALLGRAPH_MODE", PERF_CALLGRAPH_MODE_DEFAULT
47-
)
48+
self.callgraph_mode = PERF_CALLGRAPH_MODE
49+
self.default_profile_time = PERF_PROFILE_TIME
4850

4951
self.output = None
5052
self.profiler_process = None
@@ -86,9 +88,15 @@ def retrieve_perf_version(self):
8688
self.version_minor = m.group(2)
8789
return m, self.version_major, self.version_minor
8890

89-
def generate_record_command(self, pid, output, frequency=None):
91+
def generate_record_command(
92+
self, pid, output, frequency=None, callgraph_mode=None, profile_time=None
93+
):
9094
self.output = output
9195
self.pid = pid
96+
if callgraph_mode is not None:
97+
self.callgraph_mode = callgraph_mode
98+
if profile_time is not None:
99+
self.default_profile_time = profile_time
92100
cmd = [
93101
self.perf,
94102
"record",
@@ -104,6 +112,8 @@ def generate_record_command(self, pid, output, frequency=None):
104112
]
105113
if frequency:
106114
cmd += ["--freq", "{}".format(frequency)]
115+
if self.default_profile_time:
116+
cmd += ["--", "sleep", "{}".format(self.default_profile_time)]
107117
return cmd
108118

109119
def generate_report_command(
@@ -134,7 +144,9 @@ def generate_report_command(
134144
cmd.extend(extra_options)
135145
return cmd
136146

137-
def start_profile(self, pid, output, frequency=99):
147+
def start_profile(
148+
self, pid, output, frequency=99, callgraph_mode=None, profile_time=None
149+
):
138150
"""
139151
@param pid: profile events on specified process id
140152
@param output: output file name
@@ -157,7 +169,9 @@ def start_profile(self, pid, output, frequency=99):
157169
"env": self.environ,
158170
}
159171

160-
args = self.generate_record_command(pid, output, frequency)
172+
args = self.generate_record_command(
173+
pid, output, frequency, callgraph_mode, profile_time
174+
)
161175
self.logger.info(
162176
"Starting profile of pid {} with args {}".format(pid, args)
163177
)
@@ -193,20 +207,10 @@ def stop_profile(self, **kwargs):
193207
self.profiler_process_exit_code
194208
)
195209
)
196-
(
197-
self.profiler_process_stdout,
198-
self.profiler_process_stderr,
199-
) = self.profiler_process.communicate()
200-
self.logger.error(
201-
"Profiler stderr: {}".format(self.profiler_process_stderr)
202-
)
203-
self.logger.error(
204-
"Profiler stdout: {}".format(self.profiler_process_stdout)
205-
)
206-
return result
207-
try:
210+
else:
208211
self.profiler_process.terminate()
209212
self.profiler_process.wait()
213+
try:
210214
(
211215
self.profiler_process_stdout,
212216
self.profiler_process_stderr,
@@ -235,6 +239,12 @@ def stop_profile(self, **kwargs):
235239
)
236240
+ LINUX_PERF_SETTINGS_MESSAGE
237241
)
242+
self.logger.error(
243+
"Profiler stdout: {}".format(self.profiler_process_stdout)
244+
)
245+
self.logger.error(
246+
"Profiler stderr: {}".format(self.profiler_process_stderr)
247+
)
238248

239249
except OSError as e:
240250
self.logger.error(

redisbench_admin/profilers/perf_daemon_caller.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def __init__(self, remote_endpoint, **kwargs):
6262
if "region_name" in kwargs:
6363
self.region_name = kwargs["region_name"]
6464

65-
def start_profile(self, pid, output="", frequency=99):
65+
def start_profile(self, pid, output="", frequency=99, call_graph_mode="fp"):
6666
"""
6767
@param pid: profile events on specified process id
6868
@param output: output file name
@@ -80,8 +80,8 @@ def start_profile(self, pid, output="", frequency=99):
8080
"github_org_name": self.github_org_name,
8181
"github_sha": self.github_sha,
8282
}
83-
url = "http://{}/profiler/perf/start/{}?frequency={}".format(
84-
self.remote_endpoint, pid, frequency
83+
url = "http://{}/profiler/perf/start/{}?frequency={}&callgraph_mode={}".format(
84+
self.remote_endpoint, pid, frequency, call_graph_mode
8585
)
8686

8787
response = requests.post(url, data=None, json=data)

redisbench_admin/run_remote/run_remote.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import pytablewriter
1313
from pytablewriter import MarkdownTableWriter
1414
import redisbench_admin.run.metrics
15+
from redisbench_admin.profilers.perf import PERF_CALLGRAPH_MODE
1516
from redisbench_admin.run.metrics import (
1617
from_info_to_overall_shard_cpu,
1718
collect_redis_metrics,
@@ -450,7 +451,10 @@ def run_remote_command_logic(args, project_name, project_version):
450451
]
451452
start_profile_result = (
452453
remote_perf.start_profile(
453-
primary_one_pid, "", PROFILE_FREQ
454+
primary_one_pid,
455+
"",
456+
PROFILE_FREQ,
457+
PERF_CALLGRAPH_MODE,
454458
)
455459
)
456460
if start_profile_result is True:

0 commit comments

Comments
 (0)